方耀耀++李同剛
摘要:該文面向Android系統(tǒng),利用MQTT[1]協(xié)議基于發(fā)布與訂閱的特性,在mosquitto開源項目原有的模型基礎上,設計實現(xiàn)了一款個性化鎖屏應用。完成了注冊登錄,精準推送,頻道訂閱等功能。同時從推送及時性和代理服務器的負載壓力上對其進行了性能測試,實驗結果表明2G雙核單臺服務器可以支持的客戶端在12000以上。
關鍵詞:Android;內容;推送;鎖屏;MQTT
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2016)07-0028-04
Research and Application of Content Push Based on the Android Platform
FANG Yao-yao, LI Tong-gang
(North China University of Technology , Beijing 100041, China)
Abstract:This article is for Android system,, by taking advantange of publishing and subscription features in MQTT, and based on the Mosquitto,a open source MQTT project, the authors design and implement a personalized screenlock application, which includes registration and login, content push, channel subscription and some other functions.at last, timely and precise push test and stress test are carried out on the servers, The experimental results show that the 2G dual core single server can support clients in more than 12000
Key words:Android; content; Push;ScreenLock; MQTT
隨著智能手機和WIFI的普及,人們使用手機的習慣上變得碎片化。年輕的手機用戶平均每人每天劃屏解鎖的次數(shù)能達到幾十次,如果每次解鎖能通過鎖屏的界面獲取到一些對用戶有用或感興趣的信息,那將是非常有意義和有價值的[2]。實際上,手機鎖屏已經成為一種手機端產品信息實時發(fā)布的重要媒介和網絡營銷的重要手段。鎖屏應用將手機鎖屏位置變成廣告位。通過廣告主投放廣告用戶看廣告返現(xiàn),的形式獲得極大的商業(yè)價值。網絡資源的迅速膨脹,也為鎖屏應用提供了豐富的內容,本文的內容不僅指單一的文本消息,還包括圖片、音頻、視頻,動畫等多媒體資源。
本文面向Android系統(tǒng),基于MQTT 協(xié)議設計并實現(xiàn)了一款個性化鎖屏應用及配套的內容管理與推送系統(tǒng), 著重闡述和解決了推什么和怎么推的問題。本文共分為四個部分,第一部分分析說明了應用的推送技術方案。第二部分闡述了鎖屏應用的幾個主要功能及其設計實現(xiàn)思想, 第三部分別對客戶端進行功能測試和對代理服務器進行壓力測試,最后對全文作出總結, 并提出不足,同時對下一步工作進行了展望。
1 推送技術現(xiàn)狀
Android系統(tǒng)下的推送解決方案主要有GCM[3],XMPP[4],MQTT以及第三方推送平臺四種解決方案。GCM由于網絡的問題,其服務在國內不穩(wěn)定。XMPP協(xié)議比較復雜和冗余,數(shù)據(jù)負載重。第三方推送平臺安全性低,可能會收費和有一定的限制。綜合考慮,我們選取MQTT這一輕量級的消息傳輸協(xié)議作為移動平臺下的推送技術。
MQTT是IBM開發(fā)的一個基于發(fā)布/訂閱模式的輕量級消息傳輸協(xié)議, 其設計思想是輕量、簡單、易于實現(xiàn), 適用于計算能力有限, 低帶寬、網絡不可靠的環(huán)境。MQTT定義了三種角色,消息發(fā)布者,消息代理和消息訂閱者,訂閱者與代理之間建立一條長連接,發(fā)布者。
2 內容推送設計
圖1是應用的結構圖,共分為四層,第一層存有用戶信息,內容信息等基礎數(shù)據(jù);第二層提供協(xié)議棧和統(tǒng)一通信的接口[5],用來序列化和標準化基礎數(shù)據(jù);第三層是本應用中主要功能的集合;第四層在界面層定義了兩種用戶角色。
2.1 用戶信息的獲取與存儲
向用戶信息包括用戶基本信息和用戶使用設備的信息。用戶基本信息通過用戶手動注冊或修改的時候提交給內容服務器的。設備信息是在用戶注冊或登錄時提交一次。
用戶安裝鎖屏應用后,會在該設備生成一個配置文件config.info,里面保存了加密處理后的用戶和設備的相關信息,其中就有用戶的id和設備的id,同時會把這些信息反饋到內容服務器上,內容服務器會把這些信息保存下來,當用戶配置文件丟失或過期時,可以重新登錄,驗證用戶名,密碼后重新獲取之前保存的用戶配置信息。值得注意的是,一個用戶不能同時登錄兩臺設備,一當用戶使用另一臺設備登錄時,會將新設備的id賦給該用戶,同時發(fā)送一條消息命令給上個上線設備,通知它下線[6]。圖2是用戶注冊和登錄的流程圖。
2.2 內容管理與推送
本文以圖片為例說明內容到用戶的推送過程。同時我們在定義內容時,也為除圖片以外的內容數(shù)據(jù)保留了兼容性,下面是關于內容的實體定義:
Class content { //推送內容
String contentid; //系統(tǒng)分配的id
String name; //內容名稱
String starttime; //內容在客戶端開始顯示的時間
String endtime;//內容在客戶端結束顯示的時間
String format;//內容格式,取文件的后綴名
...
}
本內容服務器對內容進行推送時,不是以單個內容為單位,而是以一個到多個內容組成的內容序列為單位。序列中的每一個內容都有起止時間,表示它在客戶端設備上顯示的有效時間。當客戶端接收到這個序列的時候,會根據(jù)這些內容的contentid和起止時間即starttime和endtime進行篩選,將客戶端沒有的內容且并未過期(endtime小于當前時間)的內容添加或更新到客戶端的內容顯示播放序列中。
結合mqtt協(xié)議,我們給系統(tǒng)定義了四個角色,管理員,內容服務器,代理服務器以及客戶端。管理員負責對內容的上傳和管理,也是推送的發(fā)起者;內容服務器記錄和保存了要推送的內容,序列信息以及接收設備。內容服務器先將要推送的內容按照服務器與客戶端約定的應用層協(xié)議組織報文,并把這個報文發(fā)布到代理服務器上,由代理服務器轉發(fā)給推送對象,代理服務器可以根據(jù)客戶端的設備id進行點對點的信息傳送,也可以給訂閱相同主題的客戶端群推;代理服務器在維持與客戶端的長連接的同時,存儲轉發(fā)內容服務器發(fā)來的消息給客戶端;客戶端在安裝鎖屏應用后,會將自身的設備信息(設備imei,型號等)注冊登記到內容服務器以及代理服務器上,同時將用戶信息(手機號,用戶名,密碼等)提交給內容服務器,為篩選推送對象提供數(shù)據(jù)基礎??蛻舳嗽谂c代理服務器建立連接后通過不斷向代理服務器發(fā)送心跳包的方式來維持一個長連接[7],并通過一個監(jiān)聽服務不斷接收并處理接收由代理服務器轉發(fā)的協(xié)議報文,再根據(jù)解析后的信息,到內容服務器上獲取相應的內容信息。圖3是推送的活動圖。
管理員在選擇被推送的設備時,主要是根據(jù)用戶在客戶端注冊登記的用戶名,手機號,設備號等性質相對穩(wěn)定的靜態(tài)屬性進行手動推送。
另外,根據(jù)根據(jù)手機地理位置的變化或者用戶使用習慣的改變,管理員在不同的變化狀態(tài)下設置好對應序列,當客戶端程序檢測到狀態(tài)變化時,會通知內容服務器將相應狀態(tài)下的序列推送到客戶端。
2.3 用戶自定義推送頻道
實際上,客戶端用戶既可以作為內容信息的接收者,也可以作為信息的發(fā)起者[8]。作為接收者是對代理服務器而言, 需要向其注冊并接收的內容信息. 作為發(fā)起者是對設備本身而言, 通過訂閱主題使服務器向自身投放特定類別的信息。
本文介紹的鎖屏應用不僅可以在服務器端推送指定內容和設備,手機用戶還可以在客戶端訂閱自己喜歡的內容頻道。管理員將上傳的內容按照一定的規(guī)則和方法分類成多個內容頻道,如體育頻道,財經頻道等等,每個頻道下面賦予一組相關的內容序列,當然,也可以細分為更多的子頻道,當用戶在客戶端訂閱其中的某一個頻道時,內容服務器就會把這個頻道下的內容序列推送到用戶的手機上。
3 應用實現(xiàn)方案
3.1 代理服務器
Mosquitto[9]是一個實現(xiàn)了MQTTv3.1的開源代理軟件,它提供了非常理想的輕量級數(shù)據(jù)交換的解決方案。本文選擇在Ubuntu12.04上進行安裝與配置Mosquitto。首先在系統(tǒng)終端輸入sudo apt-get install mosquitto,也可以到其官網獲取最新源碼包進行解壓并安裝,安裝完在終端輸入mosquitto來啟動代理服務。Mosquitto提供了mosquitto、mosquitto_passwd、mosquitto_pub和mosquitto_sub四個工具,分別用于啟動代理、管理密碼、發(fā)布消息和訂閱消息。在目錄/etc/mosquitto/下存在配置文件mosquitto.conf,其中定義了端口、心跳時間、客戶端最大并發(fā)數(shù)等重要參數(shù)。另外mosquitto為多個代理之間提供了橋接[10]功能以增加客戶端的并發(fā)數(shù)量。下面代碼是橋接部分的配置:
connecttion conn1
address 10.5.113.251
topic # both 1
connecttion conn2
address 10.5.113.253
topic # both 1
3.2 內容服務器
內容服務器端是基于myeclipse+mysql+tomcat的環(huán)境下進行開發(fā)的,MQTT協(xié)議的開發(fā)包wmqqt.jar是本次開發(fā)所需要的最重要的一個包,該包可在IBM官網上免費下載,導入服務器端工程目錄下。內容服務器端主要實現(xiàn)四個類usersevice,contentservice,queueservice和pushservice,usersevice為pc端的操作員提供注冊,登錄及權限分配提供服務,contentservice負責內容的增刪改查,queueservice將內容組織成序列,并對序列進行管理,pushservice為推送提供了一系列的接口,如pc端業(yè)務員通過設備的id或用戶id給用戶進行推送內容時需要用到的PushByDeviceid和pushByUserid,給訂閱過某一個主題的客戶端群用戶推送相關主題的內容時會調用的方法PushByTopic。
3.3 客戶端
Android客戶端是基于Eclipse+AndroidSDK+ADT的環(huán)境下進行開發(fā)的,同樣也要導入開發(fā)包wmqqt.jar到Android客戶端工程。Android客戶端主要實現(xiàn)三個類,userservice,pushservice和mqttservice,userservice實現(xiàn)手機端用戶的注冊和登錄功能,對用戶的基本信息和設備信息進行分析和提交,pushservice實現(xiàn)諸如頻道訂閱,顯示內容等業(yè)務的處理和封裝.mqttservice直接處理服務器推送過來的內容協(xié)議報文以及負責與代理服務器之間諸如建立連接,斷開連接,發(fā)送心跳包等通信業(yè)務。
4 測試
系統(tǒng)設有一個內容服務器,兩個代理服務器以及若干手機客戶端。圖4是系統(tǒng)設備配置情況和部署情況的縮略圖:
4.1功能測試
功能測試由兩部組成:PC端登錄到系統(tǒng)中,先導入和填寫內容信息,再根據(jù)內容組織好要推送的序列,如圖5所示。然后在圖6所示的界面中選擇手機尾號是9865的用戶進行推送;客戶端在安裝和注冊后,開啟該鎖屏應用,在連網的狀態(tài)下,接受到服務器端推送過來的內容,如圖7所示??蛻舳嗽诔晒邮盏綀D片后會給服務器一個回執(zhí),圖6中該用戶的接收狀態(tài)會變成已經已接收。
4.2代理服務器壓力測試
Tsung[11]是一個開源的多協(xié)議分布式負載測試工具,由于采用的epoll技術,單臺tsung客戶機就可以打出很大的壓力。從1.5.1版開始tsung加入對mqtt協(xié)議的支持。這里我們只對單臺的代理服務器進行負載測試,測試的時候我們選取內容服務器為客戶機,代理服務器和客戶機都是ubuntu系統(tǒng)。首先消除兩臺機子上的ulimit -n的限制,在配置文件/etc/security/limits.conf尾追加兩行
* hard nofile 65535
* soft nofile 65535
然后在代理服務器上開啟mosquitto服務,在客戶機上下載安裝tsung(>=1.5.1),在目錄.tsung下創(chuàng)建配置文件mqtt.xml設置好相關的測試參數(shù)(如圖8)測試持續(xù)時間1800秒,每秒試圖向代理服務器發(fā)起3000個連接,其中1%為發(fā)布者,99%為訂閱者。
在終端輸入命令tsung -f .tsung/mqtt.xml start開啟對代理服務器的壓力測試。測試結束后,進入到終端提示的本次測試數(shù)據(jù)存放目錄并輸入命令/usr/lib/tsung/bin/tsung_stats.pl將其轉換為圖表:
從圖8中可以看出,可以看出內容從服務器推送到客戶端的時間大概在0到180msec之間。并呈現(xiàn)階段性的擁塞?,F(xiàn)實應用中,網絡,帶寬等因素影響比例較高。從圖9中可以看出,客戶機在建立用戶達到18000左右后,立即下降到0,代理服務器的連接數(shù)也從12000多回落到0。造成這種現(xiàn)象,從當時的cpu和內存的使用情況來看:
可以判斷單臺客戶機已不能測出代理服務器可支持連接數(shù)的峰值。值得一提的是當代理服務器的連接數(shù)達到12000多的時候,其內存使用率并不高,因此,可以判斷其最大并發(fā)數(shù)還有很大的上升空間。
5 結束語
本文論述了如何將文本,圖像等內容資源準確地推送到手機客戶端,并以鎖屏解鎖的形式展示給用戶。目前系統(tǒng)可以根據(jù)用戶的注冊信息進行篩選并有針對性地進行推送,用戶也可以根據(jù)自身興趣愛好進行訂閱推送內容。功能上已經實現(xiàn),性能上進行了一定的壓力測試。但是依然存在著一些不足,如代理服務器的最大并發(fā)數(shù),如何根據(jù)用戶的行為習慣及畫像[12]進行觸發(fā)式地推送等等,未來在著重解決這些問題的同時,還會給推送內容賦予不同的積分值,并建立配套的積分商城,以獲取更高的用戶留存率和更好的用戶體驗。
參考文獻:
[1] IBM. MQTT V3.1 Protocol Specification[EB/OL].[2010-08-19].http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html.
[2] 詹海寶,張立國.大學英語詞匯鎖屏移動學習軟件的設計與應用[J].DISTANCE EDUCATION IN CHINA, 2015(4):43-48.
[3] CHEN Wei,GONG Peihua,YU Le,YANG Geng. An Adaptive Push-Styled Command and Control Mechanism in Mobile Botnets[J]. Wuhan University Journal of Natural Sciences,2013(5):427-434.
[4] 高明鵬. 基于XMPP協(xié)議的Android手機即時通信應用研究與實現(xiàn)[D]. 南昌:南昌大學,2012.
[5] 王克鋒.基于Android 的信息推送管理系統(tǒng)的設計和實現(xiàn)[D].大連:大連理工大學,2012.
[6] 關慶余,李鴻彬,于波.MQTT協(xié)議在Android平臺上的研究與應用[J].計算機系統(tǒng)應用,2014,23(4):197-200.
[7] 林佳作. 基于長連接的移動終端消息推送系統(tǒng)的設計與實現(xiàn)[D]. 西安:西安電子科技大學,2014.
[8] 許金喜,張新有.Android平臺基于MQTT協(xié)議的推送機制[J].計算機系統(tǒng)應用,2015,24(1):185-190.
[9] mosquitto — an MQTT broker[EB/OL].[2015-04-03].http://mosquitto.org/man/mosquitto-8.html.
[10] 任亨. 基于MQTT協(xié)議的消息推送集群系統(tǒng)的設計與實現(xiàn)[D].北京:中國科學院研究生院,2014.
[11] Tsung main features[EB/OL].[2014-04-09].http://tsung.erlang-projects.org/user_manual/features.html#mqtt-related-features.
[12] 余孟杰. 產品研發(fā)中用戶畫像的數(shù)據(jù)模建——從具象到抽象[J]. 設計藝術研究,2014(6):60-64.