黃 剛,黃子娟
(南京郵電大學計算機學院、軟件學院,南京 210003)
?
Android消息推送機制在分析交互系統中的應用
黃剛,黃子娟
(南京郵電大學計算機學院、軟件學院,南京210003)
摘要:探討一種基于Apache Mina的網絡應用框架的推送方案,方案設計一個應用在移動終端的Web服務性能的移動分析系統,該系統可及時推送消息到客戶端程序。實驗結果表明,該推送方案具有良好的開放性與安全性,有效地降低移動應用開發者的開發周期。
關鍵詞:移動互聯網;Android;Apache Mina;數據推送
新世紀是一個互聯網的時代,人們的生活方式發生很大的變化,移動互聯網的快速發展使人們獲取信息的方式更加方便,智能化的移動終端的使用也更加普及,為了提高辦公效率,如何能夠充分地利用以及有效地運用移動終端,成為企業關注的重要問題。消息推送技術是由服務器主動發送消息給客戶端,當有新消息的時候,可以及時地通知手機用戶正在發生的事情,由于推送技術具有高可靠性、高安全性、實時到達等眾多優點,目前已經被各行各業所采納應用。
Web服務性能的移動分析系統旨在將具體應用的性能分析結果同時發送給所有感興趣的用戶,讓用戶及時了解相關應用的性能特點,它的主要功能是負責提供性能分析結果信息列表,當用戶對某一Web應用進行性能分析后將分析結果推送給相關用戶,或者某一Web應用的性能問題被解決之后及時通知相關聯用戶,從而達到消息的及時性以及準確性。
Web服務性能的移動分析系統所提供的主要功能和信息如下:(1)預警提醒:當有新的性能更新信息出現時,會增加一個紅色圓點數字標識提醒用戶注意查看。(2)歷史記錄:主要展示以前所更新過的Web應用性能信息,用于了解Web應用性能狀態的變化。(3)性能分析:用戶首先選擇相應的Web應用,然后輸入期望響應時間、選擇分類器模型,根據不同需要輸入不同類別條件,然后點擊開始分析,便可以對相應的Web應用進行分析了。(4)綜合查詢:進行更加詳細的條款關鍵字查詢,用于快速定位具體信息。(5)個人信息:可以查看登錄人的姓名、賬號以及當前軟件的版本號等。上面提到Web服務性能的移動分析系統的5個功能,其中第一個“預警提醒”中最體現消息的及時性,此模塊需要用到本文中主要論述的Android消息推送技術。
消息推送類似于互聯網中常見的信息推送,但在移動設備越來越多也加入互聯網的時代,對于移動客戶端的App應用來說,所推送的信息的主要以消息的方式呈現給用戶。
參考有關文獻資料中信息推送的定義,以及各種包含消息推送的應用[1],結合分析推知,消息推送是采取某種共同約定的網絡協議,主動將用戶所需要的或者是感興趣的消息發送到用戶移動終端的一種獲取最新通知等消息的方式。消息推送會分析用戶的喜好來判斷用戶希望接收到的消息,然后將分析后的消息推送給用戶,使用戶獲得盡可能有價值的消息。
消息推送有各種各樣的實現方式,包括輪詢方式、PushMail方式、持久連接以及SMS短消息方式等,這么多的實現方式或者是表現形式,歸根結底大體可以分為以下兩類[2],第一種是客戶端主動拉取方式,當滿足預設條件的時候,直接采用pull方式到服務器獲取數據;第二種是服務端主動推送方式,Push技術則是根據用戶的需要,當服務器有新消息的時候,判斷新消息是否為用戶所感興趣的信息,如果是則把最新的消息有目的、按時地主動推送到客戶端。
3.1 Android系統簡介
Android是谷歌公司發布的一種基于Linux內核的開放智能手機操作系統,Android系統架構采用了分層架構的思想[3],如圖1所示。從上層到底層共包括四層,依次為(1)應用程序層:該層直接由運行在Dalvik虛擬機上的應用程序組成(如SMS短信客戶端程序、Web瀏覽器、日歷等)。(2)應用框架層:該層主要由一些供開發人員直接調用的API組成,如Activity Manager(活動管理器)、View System(視圖系統)等,主要作用是簡化了組件的重用,使應用間盡可能多地復用組件模塊。(3)系統運行庫層:是對應用框架層提供支持的層,而該層提供的NDK使得Java能夠通過其來訪問硬件,這一層主要包含C語言標準庫、多媒體庫、SQLite、Dalvik虛擬機等。(4)Linux內核層:該層主要包括驅動、內存管理、進程管理、網絡協議棧等組件。四層架構相互依存同時也相互獨立,這種明確的層次分工結構降低了層與層之間的耦合性,從而當某一層發生變動時,并不需要對其他的層進行改變。
3.2 Apache Mina
Mina是Apache軟件基金會下的開源項目[4],是一個能夠幫助用戶開發高性能和高伸縮性的網絡應用程序的框架。Mina包括以下特點:(1)高效的I/O操作:Mina框架的一個重要特點是其支持非阻塞的I/O,在非阻塞模式下,所有的工作都處于異步狀態,在進行讀寫操作的時候若數據未就緒,則可返回處理其他消息,從而提高其處理效率。(2)基于事件驅動:Mina采用了事件驅動機制而非類似輪詢的機制,這樣當數據到達的時候,其會自動對數據進行相關的預處理,調用對應的解碼器和處理邏輯,從而提高了系統的執行效率和可靠性。(3)具有良好的移植性和可擴展性。
Mina框架可以分為三個層次[5],分別為I/O服務層、過濾器鏈、業務邏輯接口層,如圖2所示。Mina同時提供了網絡通信的Server端、Client端的封裝,使得網絡通信與應用程序真正地隔離開來,使用者只需要處理其業務邏輯即可。

圖1 Android體系架構

圖2 Mina的整體結構
對于所提出的系統主要由三個部分組成:系統應用服務器、移動終端消息推送服務器以及移動客戶端。系統應用服務器一方面接收移動客戶端提交的信息,另一方面將所需推送的消息數據發送給移動終端消息推送服務器;消息推送服務器對數據進行加工過濾,然后發送給指定的移動終端用戶。對于應用服務器和移動客戶端規定了相應的API接口以及對應的數據格式。
考慮到每次需要創建新連接時造成的系統開銷,故采用長連接的方式,長連接就是長時間保存連接,不能斷開,長連接要求系統必須實現以下功能:a.穩定的長連接:移動客戶端在用戶登錄成功之后就必須和消息推送服務器維持一條穩定的連接通道,來保證當服務器有消息需要推送給用戶的時候,能夠及時發送出去。b.斷線重連:即在連接斷開的情況下能夠及時處理,并能夠有效地自我恢復。c.多客戶端連接:系統消息推送服務器是為多個用戶提供推送服務的,能夠進行有針對性的一對一推送,因此該服務器須能夠連接更多的客戶端。
如果只有移動客戶端,而沒有應用服務端,那么所有的應用數據必須都保存在手機本地,然而又由于手機內存小以及運算速度的限制,將會成為此應用的瓶頸,故系統專門設立了應用服務器來處理具體的數據業務。服務器端的開發技術主流的有微軟的.NET、甲骨文的JavaEE以及一些開源體系,在這里選擇JavaEE作為應用服務器端的開發技術,一方面由于它同終端一樣采用Java開發,使得編程更有效率;另一方面JavaEE包含很多優秀的框架可以使Web應用有更好的結構。
由于Java NIO支持TCP和UDP協議,另外還支持RS232和VM內通訊,而Mina自身就是封裝Java NIO的,又因為Mina有清晰的架構,所以能很簡單地實現一個底層網絡協議。Mina自身帶有一些常用的過濾器[6],例如LoggingFilter(日志記錄)、BlackListFilter(黑名單過濾)、CompressionFilter(壓縮)、SSLFilter(SSL加密)等。在本文的項目中,主要的工作是在發送消息的部分,所以Mina框架的實現主要是圍繞著IoHandler 和IoSession進行展開。
(1)客戶端的設計:首先需要在應用程序用戶登錄成功的時候建立一個timer()定時器保持應用程序與服務器的長連接,當服務器有與該登錄用戶ID相匹配的消息出現時便會及時推送到用戶端。消息接收客戶端的設計主要分為三步:①建立一個NioSocket Connector對象;②設定過濾器;③設定消息處理器。
在實際應用中,可以使用下面的代碼創建一個用戶發送消息的客戶端。
NioSocketConnector connector = new NioSocketConnector(); //初始化connector
LoggingFilter lf = new LoggingFilter();
lf.setSessionOpenedLogLevel(LogLevel.ERROR);
connector.getFilterChain().addLast("logger", lf);
connector.getFilterChain().addLast("codec",new Protocol CodecFilter(new ObjectSerializationCodecFactory())); //設置通信協議
connector.setConnectTimeoutMillis(30000); //連接服務器,超時時間為3秒
connector.setHandler(new ClientHanlder(context)); //設定客戶端的消息處理器
ConnectorFutere cf = connector.connect(new InetSocket Address("221.226.27.14", 19148));
cf.awaitUninterruptibly(); //等待連接創建完成
session = cf.getSession(); //獲取會話
這樣便可以使用session的write方法進行消息發送,創建一個WriteFuture就可以將信息發送出去了。其中在接收到推送數據后ClientHanlder進行主要的業務邏輯處理,并通過以下方法推送消息至手機端通知欄,其中NotificationService.class中具體設置了通知欄的操作,用戶根據通知便可以進入對應的應用及時查看所收到的消息。
private void sendMsgToService(String key, Context context, String content){
Intent intent = new Intent(context, NotificationService. class);
intent.putExtra(NotificationService.KEY, key);
intent.putExtra(NotificationService.KEYCONTENT, content);
context.startService(intent); //開啟推送服務
}
(2)服務端的設計:當移動端提交的消息需要被推送給指定用戶的時候,首先提交到Web端,經過Web端經分析后把該消息推送到推送服務器,最后由推送服務器推送給指定用戶。與客戶端類似消息發送服務端的設計也主要分為三步:①建立一個SocketAcceptor,除了啟動server之外它還可以為我們可以生成過濾器DefaultIoFilterChainBuilder、設置消息處理器等功能;②設置過濾器;③設置消息處理器。
(3)推送測試:登錄系統,使用考當前賬戶對某一Web應用進行性能分析,用另外一個手機使用與前面所選Web應用相關聯的其他用戶賬戶登錄系統,便可以看到通知欄會出現如圖3所示。

圖3 消息推送界面
點擊通知欄提示便可進入當前App應用中查看新信息詳情,如圖4所示。

圖4 查看消息界面
文中結合實際應用場景分析了推送平臺的設計方案和解決方案,隨著移動互聯網的不斷發展,各種移動終端的應用都有進行消息推送的需求,而本文中方案提供的基于Mina的推送方案具有可靠性高、安全性高、實時性高并且其實施簡單,易于推廣等優點,在實際的生活應用中具有極大的研究意義。
參考文獻:
[1]律智堅,吳廣財.消息推送在移動高級應用中的研究和實現[J].廣東電力,2014,27(2):117-120.
[2]Mark Richards,Richard Monson-Haefel,David A. Chappell.Java Message Service[M].南京:東南大學出版社,2010.88-102.
[3]胡偉. Android體系架構及其驅動研究[N].廣州廣播電視大學學報,2010(4):96-102.
[4]林佳作.基于長連接的移動終端消息推送系統的設計與實現[D].西南電子科技大學,2014.
[5]韓東東.基于MINA框架的RTSP移動流媒體代理服務器設計與實現[D].西南交通大學,2011.
[6]范旭.基于Mina的Android消息推送系統研究與實現[D].廈門大學,2012.
黃剛(1961-),男,江蘇人,研究生導師,教授,研究方向為計算機在通信中的應用,海量數據管理,移動商務平臺設計開發
黃子娟(1991-),女,山西人,碩士研究生,研究方向為移動互聯網、信息網絡與通信軟件
Application of Message Push Mechanism in the Analysis and Interactive System Based on Android Platform
HUANG Gang,HUANG Zi-juan
(College of Computer Science & Technology, Nanjing University of Posts and Telecommunications, Nanjing 210003)
Abstract:Discusses a push scheme based on network application framework of Apache Mina, designs an application of analyzing the Web Service`s performance in the mobile terminal. The system can timely push message to the client application. The experimental results show that this push scheme has the characteristics of openness and security. And it also reduces the development cycle of a mobile application effectively for developers.
Keywords:The Mobile Internet; Android; Apache Mina; Message Push
收稿日期:2015-12-30修稿日期:2016-03-02
作者簡介:
文章編號:1007-1423(2016)09-0066-04
DOI:10.3969/j.issn.1007-1423.2016.09.017
基金項目:國家自然科學基金資助項目(No.61171053)