標籤:res 一個 ble park 成員 builds ase 業務 target
xmpp是一個通訊協定。因為這是個開放的協議,為了節儉開發成本,很多即時應用都採用了這個協議。Android上最常用的組合asmack +openfire。Asmack是smack的android版,是對xmpp協議進行了封裝,並提供了豐富的api,簡化了操作。Openfire是一個開源的IM伺服器,基於Xmpp實現。換句話說使用xmpp開發即時通訊應用的話,伺服器端已經開發好了,就是openfire。
現在我做的一個android應用就是採用asmack+openfire。說實在的,xmpp協議太多了,大多都是英文的,去學這個東西成本高,但是如果不學,僅僅依賴openfire+asmack提供的功能很難滿足多樣性的需求。Openfire因為是開源的,所以可以進行外掛程式開發或者二次開發去滿足自己業務需求。xmpp還增加了Jingle擴充協議來支援連線導向的業務,如語音和視頻。
之前業界xmpp最典型的例子就是Google talk,而且之前Google一直力推xmpp協議。但是Google最新的IM軟體Hangouts並沒有採用xmpp協議,對這一做法Google也沒有一個明確的回答。Google這一做法的確降低的xmpp的熱度。另外很多人說xmpp傳輸效率低,xmpp使用xml格式資料進行通訊,過多的標籤的確可能降低傳輸效率。再說現在的國內主流的IM軟體,QQ,等,都是採用自己私人的通訊協定。Openfire採用的TCP串連,QQ採用TCP+UDP。
是開發自己的協議,是使用xmpp協議,還是用封裝好的xmpp協議(smack)+現成的伺服器(openfire)就是大家的決定了。不過要說的是三種方案靈活性依次降低,成本也依次降低。我們項目的預算比較低所以採用了asmack+openfire。不過這裡我要說的是僅僅依賴asmack+openfire是滿足不了常規的業務需求的。所以我們的項目引入了webservice,同時嘗試對openfire進行外掛程式開發。
這裡我可以說說asmack+openfire開發遇到的一些無力的地方,比如:
使用者無法接受離線的圖片,語音。
群成員在離線後就會離開群(細來說,smack沒有群的概念,只有個聊天室)
群聊裡沒有辦法發圖片(點對點的時候發送圖片使用的是檔案傳輸,只能一對一,不能一對多)
其他的問題就不在細說。對於上述的問題會在後續的文章中分享自己的解決方案。
Xmpp最大的優勢是什麼,在我看來就是開源。這種開源可以讓任意兩個使用xmpp協議的軟體進行通訊。
開發之前有必要瞭解一些xmpp的一些資料結構。Xmpp串連使用xml流,這個XML流相當於一個會話期間所有XML節的一個信封
|--------------------| | <stream> | |--------------------| | <presence> | | <show/> | | </presence> | |--------------------| | <message to=‘foo‘> | | <body/> | | </message> | |--------------------| | <iq to=‘bar‘> | | <query/> | | </iq> | |--------------------| | ... | |--------------------| | </stream> | |--------------------|
中的幾個節點 presence、message、IQ對應著asmack的3個對象。這些都是packet的子類。
關於asmack的api,沒有找到單獨的asmack api,更沒有中文的。大家可以再下載jar包的同時選擇下載源碼。Eclipse引用源碼後,通過javadoc就可以看到介面說明了,和api無異。
asmack官網:https://github.com/Flowdalic/asmack
asmack:http://asmack.freakempire.de/
openfire:http://www.igniterealtime.org/downloads/index.jsp
smack使用指南:http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html
下載openfire的同時,大家可以下載Spark測試用
更新2015-3-12
現在smack(4.1以上版本)已經可以直接跑在Android平台上了,以後asmack也沒有更新的必要了。這次smack做了針對Android平台做了很多的最佳化,也是smack一次裡程碑式的更新。
此外設計方案上用openfire+smack+webservice 也許是更優秀的方案。也就是說 只使用smack的通訊功能,諸如好友關係,使用者資料這些東西都交給webservice去管理維護。
Smack參考:https://community.igniterealtime.org/blogs/ignite/2015/01/14/smack-410-beta1-available
Android基於xmpp的即時通訊應用