xmpp是一個通信協(xié)議。因?yàn)檫@是個開放的協(xié)議,為了節(jié)儉開發(fā)成本,很多即時應(yīng)用都采用了這個協(xié)議。Android上最常用的組合asmack +openfire。Asmack是smack的android版,是對xmpp協(xié)議進(jìn)行了封裝,并提供了豐富的api,簡化了操作。Openfire是一個開源的IM服務(wù)器,基于Xmpp實(shí)現(xiàn)。換句話說使用xmpp開發(fā)即時通訊應(yīng)用的話,服務(wù)器端已經(jīng)開發(fā)好了,就是openfire。
現(xiàn)在我做的一個android應(yīng)用就是采用asmack+openfire。說實(shí)在的,xmpp協(xié)議太多了,大多都是英文的,去學(xué)這個東西成本高,但是如果不學(xué),僅僅依賴openfire+asmack提供的功能很難滿足多樣性的需求。Openfire因?yàn)槭情_源的,所以可以進(jìn)行插件開發(fā)或者二次開發(fā)去滿足自己業(yè)務(wù)需求。xmpp還增加了Jingle擴(kuò)展協(xié)議來支持面向連接的業(yè)務(wù),如語音和視頻。
之前業(yè)界xmpp最典型的例子就是Google talk,而且之前Google一直力推xmpp協(xié)議。但是Google最新的IM軟件Hangouts并沒有采用xmpp協(xié)議,對這一做法Google也沒有一個明確的回答。Google這一做法的確降低的xmpp的熱度。另外很多人說xmpp傳輸效率低,xmpp使用xml格式數(shù)據(jù)進(jìn)行通信,過多的標(biāo)簽的確可能降低傳輸效率。再說現(xiàn)在的國內(nèi)主流的IM軟件,QQ,微信等,都是采用自己私有的通信協(xié)議。Openfire采用的TCP連接,QQ采用TCP+UDP。
是開發(fā)自己的協(xié)議,是使用xmpp協(xié)議,還是用封裝好的xmpp協(xié)議(smack)+現(xiàn)成的服務(wù)器(openfire)就是大家的決定了。不過要說的是三種方案靈活性依次降低,成本也依次降低。我們項(xiàng)目的預(yù)算比較低所以采用了asmack+openfire。不過這里我要說的是僅僅依賴asmack+openfire是滿足不了常規(guī)的業(yè)務(wù)需求的。所以我們的項(xiàng)目引入了webservice,同時嘗試對openfire進(jìn)行插件開發(fā)。
這里我可以說說asmack+openfire開發(fā)遇到的一些無力的地方,比如:
用戶無法接受離線的圖片,語音。
群成員在離線后就會離開群(細(xì)來說,smack沒有群的概念,只有個聊天室)
群聊里沒有辦法發(fā)圖片(點(diǎn)對點(diǎn)的時候發(fā)送圖片使用的是文件傳輸,只能一對一,不能一對多)
其他的問題就不在細(xì)說。對于上述的問題會在后續(xù)的文章中分享自己的解決方案。
Xmpp最大的優(yōu)勢是什么,在我看來就是開源。這種開源可以讓任意兩個使用xmpp協(xié)議的軟件進(jìn)行通信。
開發(fā)之前有必要了解一些xmpp的一些數(shù)據(jù)結(jié)構(gòu)。Xmpp連接使用xml流,這個XML流相當(dāng)于一個會話期間所有XML節(jié)的一個信封
|--------------------| | <stream> | |--------------------| | <presence> | | <show/> | | </presence> | |--------------------| | <message to='foo'> | | <body/> | | </message> | |--------------------| | <iq to='bar'> | | <query/> | | </iq> | |--------------------| | ... | |--------------------| | </stream> | |--------------------|
上圖中的幾個節(jié)點(diǎn) presence、message、IQ對應(yīng)著asmack的3個對象。這些都是packet的子類。
關(guān)于asmack的api,沒有找到單獨(dú)的asmack api,更沒有中文的。大家可以再下載jar包的同時選擇下載源碼。Eclipse引用源碼后,通過javadoc就可以看到接口說明了,和api無異。
asmack官網(wǎng):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
現(xiàn)在smack(4.1以上版本)已經(jīng)可以直接跑在Android平臺上了,以后asmack也沒有更新的必要了。這次smack做了針對Android平臺做了很多的優(yōu)化,也是smack一次里程碑式的更新。
此外設(shè)計方案上用openfire+smack+webservice 也許是更優(yōu)秀的方案。也就是說 只使用smack的通訊功能,諸如好友關(guān)系,用戶資料這些東西都交給webservice去管理維護(hù)。
Smack參考:https://community.igniterealtime.org/blogs/ignite/2015/01/14/smack-410-beta1-available