閆俊英 李熙明 曹錫貴
摘 要:隨著移動互聯(lián)網(wǎng)的快速發(fā)展,消息推送在移動互聯(lián)網(wǎng)領(lǐng)域智能終端的應(yīng)用越來越廣泛,成為智能終端產(chǎn)品實(shí)時(shí)發(fā)布信息的一種重要手段。本文主要研究了目前基于Android的消息推送的幾種解決方案,并選擇基于XMPP協(xié)議,實(shí)現(xiàn)了一個(gè)基于Android的消息推送系統(tǒng)。
關(guān)鍵詞:Android,消息推送,XMPP協(xié)議
1.引言
隨著移動互聯(lián)網(wǎng)的發(fā)展,智能手機(jī)和各種智能終端的用戶越來越多,移動互聯(lián)網(wǎng)已經(jīng)成為人們獲取信息的一個(gè)最佳平臺。如何及時(shí)或定時(shí)地向用戶發(fā)送各種信息越來越成為目前研究的熱點(diǎn),消息推送就被用在了傳送信息的各個(gè)領(lǐng)域。IOS平臺已經(jīng)提供了官方的消息推送的解決方案[1],但是Android平臺的解決方案卻比較復(fù)雜。本文分析了Android平臺的消息推送的幾種不同的解決方案,最后基于XMPP協(xié)議實(shí)現(xiàn)了一個(gè)消息推送系統(tǒng)。
2.消息推送技術(shù)
消息推送技術(shù)主要有兩種方式[2]:一種是客戶端使用PULL的方式,就是隔一段時(shí)間就去服務(wù)器上獲取信息;另一種就是服務(wù)器使用PUSH的方式,當(dāng)服務(wù)器端把最新的信息Push到客戶端上。
2.1 GCM云推送
Google Cloud Messaging for Android(簡稱GCM),是谷歌新推出的云推送消息服務(wù),即第二代的C2DM。該服務(wù)可以將服務(wù)器端的消息發(fā)送給客戶端,簡單,無需實(shí)現(xiàn)和部署服務(wù)端。但是受到Android版本的限制,而且需要連接Google的服務(wù)器,因此該服務(wù)在國內(nèi)還不夠穩(wěn)定。另外,對于不同的硬件廠商平臺,他們可能把Google所提供的這種服務(wù)去掉。
2.2 MQTT協(xié)議
MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測傳輸)是IBM開發(fā)的一個(gè)輕量級的消息發(fā)布/訂閱協(xié)議,是一種實(shí)現(xiàn)基于手機(jī)客戶端的消息推送服務(wù)器的理想解決方案。該協(xié)議支持所有平臺,幾乎可以把所有聯(lián)網(wǎng)物品和外部連接起來,被用來當(dāng)做傳感器和致動器的通信協(xié)議。該協(xié)議的優(yōu)點(diǎn)是:協(xié)議簡潔、小巧、可擴(kuò)展性強(qiáng)、省流量、省電,目前已經(jīng)應(yīng)用到企業(yè)領(lǐng)域。但是目前還不夠成熟、實(shí)現(xiàn)較復(fù)雜、服務(wù)端組件RSMB不開源,部署硬件成本較高。
2.3 XMPP協(xié)議
XMPP協(xié)議是一種基于標(biāo)準(zhǔn)通用標(biāo)記語言的子集XML的協(xié)議,它繼承了在XML環(huán)境中靈活的發(fā)展性。因此,基于XMPP的應(yīng)用具有超強(qiáng)的可擴(kuò)展性。該協(xié)議的前身是Jabber,目前已由IETF國際標(biāo)準(zhǔn)化組織完成了標(biāo)準(zhǔn)化工作。XMPP協(xié)議目前已經(jīng)比較成熟,可擴(kuò)展性強(qiáng),協(xié)議是自由、源碼開放的,這些都可以為開發(fā)人員直接使用,有利于減小項(xiàng)目的開發(fā)難度。
2.4 第三方平臺
許多互聯(lián)網(wǎng)公司看到了移動終端的消息推送的應(yīng)用前景,推出了很多種成熟的第三方推送解決方案。對于一般用戶來說,采用第三方解決方案,應(yīng)用成本低,操作簡單,第三方所提供的技術(shù)比較可靠。但是第三方解決方案,都需要連接第三方的服務(wù)器,因此數(shù)據(jù)的安全性方面可能會受到一定影響。另外,目前對于一些入門級別的服務(wù)目前是不收費(fèi)的,但是從長遠(yuǎn)來看,收費(fèi)是一種必然趨勢。
3.系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
本文采用XMPP協(xié)議作為消息推送系統(tǒng)的解決方案,XMPP協(xié)議也是目前最流行的一種消息推送協(xié)議。
XMPP中定義了三個(gè)角色,客戶端,服務(wù)器,網(wǎng)關(guān)。通信能夠在這三者的任意兩個(gè)之間雙向發(fā)生。服務(wù)器同時(shí)承擔(dān)了客戶端信息記錄,連接管理和信息的路由功能。網(wǎng)關(guān)承擔(dān)著與異構(gòu)即時(shí)通信系統(tǒng)的互聯(lián)互通?;镜木W(wǎng)絡(luò)形式是單客戶端通過TCP/IP連接到單服務(wù)器,然后在之上傳輸XML。
基于XMPP協(xié)議的開源的客戶端框架是smack,它主要封裝了一些XMPP的實(shí)現(xiàn),asmack是改進(jìn)版的 smack。而另外一個(gè)開源框架的誕生,則是對在引用smack的基礎(chǔ)上實(shí)現(xiàn)和服務(wù)器端的持久連接,以實(shí)現(xiàn)服務(wù)器對客戶端的推送,那就是Android push notification,簡稱Androidpn。
3.1 服務(wù)器端
Androidpn 客戶端需要用到一個(gè)基于java的開源XMPP協(xié)議包asmack,這個(gè)包同樣也是基于openfire下的另外一個(gè)開源項(xiàng)目smack,不過我們不需要自己編譯,可以直接把Androidpn客戶端里面的asmack.jar拿來使用??蛻舳死胊smack中提供的XMPPConnection類與服 務(wù)器建立持久連接,并通過該連接進(jìn)行用戶注冊和登錄認(rèn)證,同樣也是通過這條連接,接收服務(wù)器發(fā)送的通知。
Androidpn服務(wù)器端也是java語言實(shí)現(xiàn)的,基于openfire開源工程,Web部分采用的是spring框架。Androidpn服務(wù)器包含兩個(gè)部分,一個(gè)是偵聽在5222端口上的XMPP服務(wù),負(fù)責(zé)與客戶端的 XMPPConnection類進(jìn)行通信,作用是用戶注冊和身份認(rèn)證,并發(fā)送推送通知消息。另一個(gè)是Web服務(wù)器,采用一個(gè)輕量級的HTTP服務(wù)器,負(fù)責(zé)接收用戶的Web請求。
最上層包含四個(gè)組成部分,分別是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager負(fù)責(zé)管理客戶端與服務(wù)器之間的會話,Auth Manager負(fù)責(zé)客戶端用戶認(rèn)證管理,Presence Manager負(fù)責(zé)管理客戶端用戶的登錄狀態(tài),NotificationManager負(fù)責(zé)實(shí)現(xiàn)服務(wù)器向客戶端推送消息功能。
3.2 客戶端
Androidpn在客戶端集成了asmack。這樣就可以很容易的簡立一個(gè)和服務(wù)器端的基于xmpp協(xié)議的socket連接。Androidpn的客戶端中,進(jìn)行管理連接的類是XmppManager,它主要用來管理連接的信息,比如XMPP的端口、IP、登錄的用戶名密碼,以及對連接的維護(hù)。整個(gè)服務(wù)器端和客戶端的通信是基于一個(gè)session(會話)過程。
4.系統(tǒng)實(shí)現(xiàn)
4.1 搭建平臺[3]
首先去官網(wǎng)下載AndroidPN源碼服務(wù)端和客戶端,用Eclipse導(dǎo)入AndroidPN server即服務(wù)端。由于AndroidPn 默認(rèn)采用的數(shù)據(jù)庫是HSQLDB 數(shù)據(jù)庫,并不具有普適性,這里采用服務(wù)器端本地的MySQL 數(shù)據(jù)庫進(jìn)行部署。修改服務(wù)器端配置文件jdbc.properties文件,修改jdbcurl項(xiàng)為:jdbc:mysql://localhost/apn?&useUnicode;=true&characterEncoding;=utf8,修改jdbcusername和jdbcpassword為MySql的連接賬號和密碼。若采用SQLServer 數(shù)據(jù)庫系統(tǒng),可修改為相應(yīng)的數(shù)據(jù)庫連接內(nèi)容,并導(dǎo)入相應(yīng)jar 包,新建一個(gè)對應(yīng)的空數(shù)據(jù)庫。然后,運(yùn)行并導(dǎo)出war文件,上傳到tomcat服務(wù)器。
解壓androidpn-client-0.5.0.zip,導(dǎo)入eclipse工程,運(yùn)行前更改一處IP地址,修改res/raw/androidpn.properties文件中的xmppHost為xmppHost=10.0.2.2。
4.2服務(wù)器端
Androidpn平臺可以實(shí)現(xiàn)手動信息推送,但是不能實(shí)現(xiàn)自動消息推送,因此需要自己編寫接口調(diào)用推送服務(wù)來實(shí)現(xiàn)信息的自動推送。在Androidpn Sever創(chuàng)建Apicontroller類,用于接收應(yīng)用程序發(fā)送過來的數(shù)據(jù),并將消息推送出去。應(yīng)用程序可以通過接口調(diào)用來實(shí)現(xiàn)消息的自動推送。
4.3 客戶端
獲得NotificationManager對象,構(gòu)建一個(gè)Notification對象,該對象描述了通知的標(biāo)題和內(nèi)容,然后再調(diào)用NotificationManager.notify方法發(fā)起通知,發(fā)起后的通知就會在消息欄提示。
5.結(jié)束語
移動終端的消息推送服務(wù)目前得到了廣泛的應(yīng)用,本文基于目前比較主流的消息推送協(xié)議XMPP協(xié)議,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)消息推送系統(tǒng),利用Androidpn框架可以實(shí)現(xiàn)由服務(wù)器端向客戶端的文本信息的推送。
參考文獻(xiàn)
[1]王美妮,王穎,趙偉.基于XMPP協(xié)議消息推送機(jī)制的研究與實(shí)現(xiàn)[J].長春師范學(xué)院學(xué)報(bào)(自然科學(xué)版). 2014,33.
[2]黃河清,陳文. Android平臺消息推送服務(wù)的實(shí)現(xiàn)[J].網(wǎng)絡(luò)與通信.2014,18.
[3]常新峰,呂樂樂. Android平臺下消息推送機(jī)制的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)軟件與應(yīng)用. 2014,14.