如果你也碰巧在研究Android即時通訊和位置感知,那麼這篇文章一定會令你熱血沸騰,眼前一亮,歡迎大家熱情討論提供各種解決方案!
原文地址:http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997058.html
《基於即時通信和LBS技術的位置感知服務(一):提出問題及解決方案》
在第一篇文章中我們提出了要讓A與B在不同地方能即刻獲取對方準確位置的需求。之後討論瞭解決這一問題做出的方案選擇,即放棄使用輪詢(Pooling)的方式在不同客戶端進行數據的更新,理由是因爲B不知道A何時需要自己的位置信息,所以B只能一直post自己的位置數據給服務器,而A要定時通過RESTful Web請求去服務器獲取B的信息。
最後確定採用基於XMPP協議的PubSub(Publish/Subscribe,發佈/訂閱)方式進行異步消息實時傳遞。
《基於即時通信和LBS技術的位置感知服務(二):XMPP協議總結以及開源解決方案》
第二篇文章主要是對XMPP協議進行總結,以及爲什麼要採用XMPP,最後介紹了XMPP協議的Java開源解決方案:Openfire+Smack+Spark。
《基於即時通信和LBS技術的位置感知服務(三):搭建Openfire服務器+測試2款IM客戶端》
第三篇文章詳細講解了基於XMPP協議的openfire服務架設,以及使用2款異構的基於XMPP協議的桌面客戶端測試即時消息傳遞。
特別提示:爲了更好的瞭解本項目要解決的問題,強烈建議去看看前面的三篇連載。
二、Location-Aware-Instant項目概括
Location-Aware-Instant是一個運行在Android OS 上具有位置即時感知功能的Android應用程序客戶端。與之前第三篇文章裏介紹了2款桌面程序一樣,遵循開放標準的XMPP協議。
開發過程查找和參考了不少外文資料和相關項目,利用週末和晚上的時間、現在已經終於完成了90%。
本程序的架構和技術基礎:
1. Android OS 應用開發技術:包括地圖應用開發。
2. Openfire服務器:基於XMPP協議的開源Java服務器端程序。
3. Smack 開發庫:對XMPP協議進行了封裝的客戶端實現的Java開發包。本項目採用的是ASmack Library(適合與Android OS 的Smack優化版)。
本項目的實現原理。共分三個層次:
1. 首先使用Openfire作爲服務器,通過使用ASmack庫開發出帶有聯繫人列表的即時消息傳遞程序;
2. 然後客戶端發送和接收消息之間植入自己的攔截預處理邏輯,並通過定製特殊的命令,實現消息的自動應答功能;
3. 最後一層在接收消息時,根據預處理命令判斷是否對方的意圖爲定位請求,如果是則調用位置定位相關方法獲取本地位置並自動恢復給發送請求一方,請求方根據預處理命令判斷到來的消息是否與位置相關,如果有關則將對方的位置定位在Google 地圖上。
注意:本文的內容是描述一種應用,並非代碼講解(本項目可能以後會結合Android開發總結來講解)。
三、項目功能展示
由於只有一臺測試手機HTC G6,而這個項目是與位置有關的,所以用Android 開發模擬器來作爲雙方通信的一端。
測試帳號分別是[email protected](由於登錄htc g6上的Location-Aware-Instant客戶端),[email protected](用來登錄模擬器上的Location-Aware-Instant客戶端)。上面2個帳號格式是Jabber Id(XMPP協議中的帳號,可以參考前排第二篇介紹XMPP的文章),本來是使用[email protected] 在其他桌面客戶端解析正常,但手機將im.comit.com.cn的域名解析成一個其他的IP,所以直接使用我本機的IP地址。
本程序的logo:,logo來源自百度百科的XMPP介紹:,我簡單的處理了一下。
1. 首先是登錄界面(分別使用上面的2個帳號登錄兩款手機客戶端):
2. 雙方登錄並連接到openfire服務器時,會出現雙方的在線情況。也就是在服務器上註冊了自己的狀態爲在線。
HTC g6可以看到對方(test) 開發模擬器顯示test2在線
3. 操作(目前只加入了定位對方的功能,其實還有發送普通信息、刪除聯繫人等功能,添加聯繫人)
4. 先來看通過手機模擬器定位htc g6客戶端的演示,即點擊第三步中手機模擬器(右邊)的”獲取位置“選項操作。
雖然測試環境在室內,無法獲取GPS信號。但HTC g6插入了聯通的3G卡所以即時在室內也是可以使用基站定位大概位置。
此時手機模擬器在向G6發送位置感知的請求,G6應該回應自己所在的位置,不到2秒鐘後,得到的結果如下圖:
我住在棠下,所以G6通過基站大概定位了我的位置,並將位置數據迴應給手機模擬器,模擬器將G6所在的位置定位在地圖上。
5. 上面演示了通過模擬器定位到G6的位置,現在演示的是G6獲取模擬器的位置。但是因爲手機模擬器不能獲取真實的位置信息,也就無法將自己的信息回覆給G6。解決的方法是在開發工具中輸入一個自定義的位置數據。如下圖,輸入公司在所位置的經緯度(23.143791, 113.347533)。
圖中emulator 5554就是我們的模擬器(HT03GNX0404是HTC G6手機)。這樣模擬器的位置就定位在公司做位置。
現在嘗試通過G6來感知模擬器這個客戶端所在的位置,即點擊第三步中HTC G6 (左邊)的”獲取位置“選項操作。結果如下圖:
G6客戶端程序正在等待手機模擬器的迴應,不到2秒鐘後:
OK,成功定位到公司所在位置,即G6即可感知到了手機模擬器的位置信息。
到這裏手機的位置感知服務基本框架已經出來了。能夠即可感知對方的位置,是不是很Cool的體驗!
四、項目內容以及結構介紹(代碼太長,截圖分成上下兩部分)
代碼結構介紹:以下包名忽略了cn.com.comit.locationaware父包
圖1:chat包:與消息發送有關的類
data包:聯繫人列表,消息等實體類
dialogs包: 交互有關的對話框類
exception包:異常相關的類
map包:與地圖和LBS有關的類
圖2:service包:封裝Smack庫和對方提供XMPP服務的封裝類。
util包:工具類包
widget.quickantion包:聯繫人操作(如第三章第3步中的“獲取位置”)操作選項控件類
cn.com.comit.locationaware父包:入口以及輔助類
Google APIs 2.2:引用的google android 地圖開發包
引用的庫:asmack-2010.05.07.jar – Smack的Android優化版API庫、trace.jar錯誤追蹤相關包。
五、結束語
1. 傳統網絡操作方式我們用到 Restful Get獲取數據、Post提交數據,但這不是萬能的(雖然可以解決大多數的網絡應用問題)。通過引入基於PubSub(發佈/訂閱)的即時通信有時候可以取得意想不到的體驗效果,本項目提出了一個研究方向和思路(雖然離商用還有很長的路要走,可路終究是找到了一條,並且邁出了“萬里長征的第一步”)。
2. 最近基於LBS的應用層出不窮,能夠將LBS和即時通信進行整合運行,讓研究的方向更明確(例如本項目的自動應答功能)。
3. 將即時通信和LBS有機的結合或許可以稱作爲傳說中的“微創新”,畢竟創新不一定是非得創造。