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