一、回顧
在分享這個項目之前先來回顧以前的三篇文章:
《基於即時通訊和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 開發模擬器來最為雙方通訊的一端。
測試帳號分別是test2@192.168.0.177(由於登入htc g6上的Location-Aware-Instant用戶端),test@192.168.0.177(用來登入模擬器上的Location-Aware-Instant用戶端)。上面2個帳號格式是Jabber Id(XMPP協議中的帳號,可以參考前排第二篇介紹XMPP的文章),本來是使用test@im.comit.com.cn 在其他案頭用戶端解析正常,但手機將im.comit.com.cn的網域名稱解析成一個其他的IP,所以直接使用我原生IP地址。
本程式的logo:,logo來源自百度百科的XMPP介紹:,我簡單的處理了一下。
1. 首先是登入介面(分別使用上面的2個帳號登入兩款手機用戶端):
HTC g6的登入介面 開發模擬器的登入介面
2. 雙方登入並串連到openfire伺服器時,會出現雙方的線上情況。也就是在伺服器上註冊了自己的狀態為線上。
HTC g6可以看到對方(test) 開發模擬器顯示test2線上
3. 操作(目前只加入了定位對方的功能,其實還有發送普通訊息、刪除連絡人等功能,新增連絡人...)
HTC g6
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的體驗!
四、項目內容以及結構介紹(代碼太長,分成上下兩部分)
圖1 圖2
代碼結構介紹:以下包名忽略了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有機的結合或許可以稱作為傳說中的“微創新”,畢竟創新不一定是非得創造。