鄭九鋒,姚凱學(xué)
(貴州大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,貴州 貴陽(yáng) 550025)
農(nóng)業(yè)墑情監(jiān)測(cè)站集成多種氣象傳感器,采集了包括土壤濕度、土壤溫度、光照強(qiáng)度、光合有效輻射、風(fēng)向、風(fēng)速、雨量、雨速、氣溫、空氣相對(duì)濕度、氣壓、海拔、土壤PH值、PM2.5等實(shí)時(shí)數(shù)據(jù)[1],并將這些數(shù)據(jù)經(jīng)過(guò)下位機(jī)以及無(wú)線通信技術(shù)實(shí)時(shí)傳輸至后臺(tái)服務(wù)端,后臺(tái)將這些數(shù)據(jù)通過(guò)制定的協(xié)議解析,將合法的數(shù)據(jù)封裝后存入數(shù)據(jù)庫(kù)相應(yīng)的表中。
運(yùn)用QLExpress規(guī)則引擎技術(shù)設(shè)定預(yù)警規(guī)則,預(yù)警規(guī)則與實(shí)時(shí)數(shù)據(jù)綁定,規(guī)則內(nèi)容包括大氣溫度報(bào)警、大氣濕度報(bào)警、墑情站離線報(bào)警等。推送系統(tǒng)將使用Spring定時(shí)任務(wù)每分鐘解析規(guī)則一次,滿足預(yù)警條件后就觸發(fā)相應(yīng)的推送方法,將預(yù)警信息及時(shí)地發(fā)送到用戶的手機(jī)終端上,同時(shí)推送系統(tǒng)也支持在Web頁(yè)面手動(dòng)編輯信息進(jìn)行推送。用戶點(diǎn)擊手機(jī)通知欄就能查看消息詳情,在用戶獲取預(yù)警信息后,就可以采取相應(yīng)的應(yīng)對(duì)措施,避免因環(huán)境氣候因素導(dǎo)致農(nóng)作物減產(chǎn),帶來(lái)不必要的經(jīng)濟(jì)損失,因此該系統(tǒng)在農(nóng)業(yè)生產(chǎn)應(yīng)用中意義重大。
XMPP(extensible messaging and presence protocol,可擴(kuò)展通訊和表示協(xié)議)是一種基于可擴(kuò)展標(biāo)記語(yǔ)言(XML)的近端串流式即時(shí)通訊協(xié)議[2-3]。它是開(kāi)源的,利用它可以實(shí)現(xiàn)簡(jiǎn)單的推送功能,開(kāi)發(fā)者可以修改其源代碼以適應(yīng)自己的應(yīng)用程序。
AndroidPn就是一個(gè)基于XMPP協(xié)議實(shí)現(xiàn)的開(kāi)源消息推送服務(wù),包含了完整的客戶端和服務(wù)端,其服務(wù)端是在另外一個(gè)開(kāi)源項(xiàng)目openfire的基礎(chǔ)上修改實(shí)現(xiàn)的,其客戶端需要用到開(kāi)源XMPP協(xié)議包asmack[4],這個(gè)包同樣是基于openfire下的另外一個(gè)開(kāi)源項(xiàng)目smack。基于XMPP實(shí)現(xiàn)推送的優(yōu)點(diǎn)就是簡(jiǎn)單,開(kāi)發(fā)者還可以根據(jù)自己的實(shí)際使用需求來(lái)擴(kuò)展XMPP協(xié)議,實(shí)現(xiàn)消息的定制功能。
基于以上分析,系統(tǒng)采用基于XMPP協(xié)議的AndroidPn框架進(jìn)行設(shè)計(jì)實(shí)現(xiàn)。通過(guò)集成開(kāi)源的JAR包,修改開(kāi)源項(xiàng)目,縮短開(kāi)發(fā)成本,提高系統(tǒng)應(yīng)用的穩(wěn)定性和成熟性[5]。
QLExpress是一個(gè)開(kāi)源的JAVA規(guī)則引擎,它一般作為一個(gè)嵌入式規(guī)則引擎在業(yè)務(wù)系統(tǒng)中使用[6-7]。該規(guī)則引擎技術(shù)不僅支持標(biāo)準(zhǔn)的JAVA語(yǔ)法,而且還支持自定義操作符號(hào)、操作符號(hào)重載、函數(shù)定義、宏定義、數(shù)據(jù)延遲加載等,所以使業(yè)務(wù)規(guī)則定義簡(jiǎn)便并且非常靈活。
該規(guī)則的原理主要是定義規(guī)則、解析規(guī)則、執(zhí)行規(guī)則幾個(gè)步驟,編譯的過(guò)程類似java class文件的編譯過(guò)程,會(huì)經(jīng)過(guò)詞法分解、詞法分析、語(yǔ)法分析、規(guī)則執(zhí)行等幾個(gè)步驟。系統(tǒng)按照QLExpress語(yǔ)法定義預(yù)警規(guī)則,Spring定時(shí)任務(wù)會(huì)每隔一分鐘解析一次預(yù)警規(guī)則,解析預(yù)警規(guī)則仍是使用QLExpress。
Spring task是Spring3.0以后自身提供的一種定時(shí)任務(wù)實(shí)現(xiàn)工具,該工具使用起來(lái)非常簡(jiǎn)單,可以將它看作是一個(gè)輕量級(jí)的Quartz[8]。使用該工具時(shí)除了導(dǎo)入Spring相關(guān)的包外不需要再導(dǎo)入其他額外的包,而且支持注解和配置文件兩種形式,在Spring的配置文件中配置定時(shí)器開(kāi)關(guān)
2.1.1 服務(wù)端架構(gòu)
服務(wù)器端采用B/S架構(gòu),主要是在一個(gè)基于XMPP協(xié)議的開(kāi)源工程openfire和高性能并發(fā)框架MINA基礎(chǔ)上修改實(shí)現(xiàn),運(yùn)用SpringMVC和Hibernate框架[9-10],結(jié)合性能高效的MySQL數(shù)據(jù)庫(kù),服務(wù)器端軟件架構(gòu)如圖1所示。服務(wù)器采用了分層的架構(gòu)設(shè)計(jì),共分為四層,分別為前端表現(xiàn)層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問(wèn)層、數(shù)據(jù)庫(kù)管理層。
圖1 服務(wù)端架構(gòu)
(1)前端表現(xiàn)層。
前端表現(xiàn)層包括兩個(gè)部分,一部分是農(nóng)業(yè)墑情控制臺(tái),主要是以圖表形式展示墑情監(jiān)測(cè)站發(fā)送過(guò)來(lái)的墑情數(shù)據(jù),預(yù)警規(guī)則管理界面主要用來(lái)進(jìn)行預(yù)警規(guī)則的添加、修改、刪除、查詢等;另一部分是推送管理控制臺(tái),主要是消息推送管理界面。在表現(xiàn)層,系統(tǒng)前端運(yùn)用了jQUeryEasyUI框架,JSP2.0、CSS3、HTML以及Ajax等技術(shù)。
(2)業(yè)務(wù)邏輯層。
業(yè)務(wù)邏輯層主要是將表現(xiàn)層所涉及到的前端服務(wù)進(jìn)行相關(guān)的邏輯實(shí)現(xiàn)。該系統(tǒng)業(yè)務(wù)邏輯層主要基于SpringMVC框架開(kāi)發(fā),SoilmoistureManager負(fù)責(zé)墑情數(shù)據(jù)的管理,WarningRuleManager負(fù)責(zé)預(yù)警規(guī)則的管理;客戶端與服務(wù)器端之間的通信使用了AndroidPn,它是一個(gè)實(shí)現(xiàn)了XMPP協(xié)議的開(kāi)源項(xiàng)目,其中SessionManager負(fù)責(zé)管理客戶端App與服務(wù)器端之間的會(huì)話,AuthManager負(fù)責(zé)App用戶認(rèn)證管理,PresenceManager負(fù)責(zé)管理App用戶的登錄狀態(tài),NotificationManager負(fù)責(zé)實(shí)現(xiàn)服務(wù)器向客戶端App推送消息。MINA框架將網(wǎng)絡(luò)通信與應(yīng)用程序隔離開(kāi)來(lái),開(kāi)發(fā)者只需關(guān)心傳輸?shù)臄?shù)據(jù)以及業(yè)務(wù)邏輯即可,做到了高并發(fā)Socket訪問(wèn)的有序管理。
(3)數(shù)據(jù)訪問(wèn)層。
數(shù)據(jù)訪問(wèn)層對(duì)數(shù)據(jù)庫(kù)進(jìn)行一些相關(guān)業(yè)務(wù)的操作處理,例如數(shù)據(jù)的添加、刪除、修改、查詢,將業(yè)務(wù)的一系列數(shù)據(jù)操作提交到數(shù)據(jù)庫(kù)中。該系統(tǒng)后臺(tái)服務(wù)器采用Hibernate與SpringMVC框架開(kāi)發(fā),Spring框架本身提供了對(duì)DAO層的支持,可以提高開(kāi)發(fā)者的效率,保證數(shù)據(jù)庫(kù)操作的準(zhǔn)確性和安全性;Hibernate是一種ORM框架,用于將數(shù)據(jù)持久化。
(4)數(shù)據(jù)庫(kù)層。
該項(xiàng)目采用開(kāi)源的關(guān)系型MySQL數(shù)據(jù)庫(kù)系統(tǒng)。MySQL用于記錄設(shè)備信息、用戶信息、待推送或已推送的消息內(nèi)容、預(yù)警規(guī)則、墑情信息等數(shù)據(jù)。
農(nóng)業(yè)墑情預(yù)警信息實(shí)時(shí)推送系統(tǒng)由墑情管理、預(yù)警規(guī)則管理、用戶狀態(tài)管理、會(huì)話管理、通知管理、消息記錄管理6個(gè)模塊構(gòu)成。功能結(jié)構(gòu)如圖2所示。
圖2 服務(wù)端功能結(jié)構(gòu)
2.1.2 數(shù)據(jù)庫(kù)設(shè)計(jì)
系統(tǒng)采用的是MySQL數(shù)據(jù)庫(kù),定義了用戶信息表(tb-user)、客戶表(tb-appuser)、信息表(tb-message)、預(yù)警規(guī)則表(tb-rule)、離線信息表(tb-offmessage)、墑情數(shù)據(jù)表(tb-moisture)。為了使用這些表,在Spring框架中集成Hibernate框架,在Spring配置文件中配置數(shù)據(jù)源、SessionFactory,配置實(shí)體類等實(shí)現(xiàn)表的建立以及數(shù)據(jù)庫(kù)的連接。
Android客戶端使用基于JAVA的開(kāi)源XMPP協(xié)議包asmack,該包是基于openfire下的另外一個(gè)開(kāi)源項(xiàng)目smack,在開(kāi)發(fā)客戶端時(shí),直接將asmack.jar包導(dǎo)入Android studio下的工程項(xiàng)目中即可使用。App利用asmack中提供的XMPPConnection類與服務(wù)器端建立起持久連接,并通過(guò)該連接進(jìn)行用戶注冊(cè)和登錄認(rèn)證,該連接也用于服務(wù)器端發(fā)送的消息通知[11]??蛻舳顺绦蛑蠸erviceManager負(fù)責(zé)管理消息服務(wù)以及加載相關(guān)的配置,ConnectivityReceiver負(fù)責(zé)處理網(wǎng)絡(luò)狀態(tài)的廣播,NotificationReceiver負(fù)責(zé)處理服務(wù)端發(fā)送的推送消息,NotificationService負(fù)責(zé)在后臺(tái)服務(wù)響應(yīng)服務(wù)端的消息,PersistentConnectionListener負(fù)責(zé)監(jiān)控連接關(guān)閉以及重連事件的監(jiān)聽(tīng),PhoneStateChangeListener負(fù)責(zé)監(jiān)聽(tīng)手機(jī)狀態(tài)的事件,ReconnectionThread負(fù)責(zé)重連線程類,Notifier負(fù)責(zé)客戶端發(fā)送通知,NotificationIQ負(fù)責(zé)處理消息的數(shù)據(jù)包[12-13]。
墑情監(jiān)測(cè)站將各傳感器采集到的實(shí)時(shí)數(shù)據(jù)通過(guò)下位機(jī)無(wú)線傳輸至推送系統(tǒng)服務(wù)端,服務(wù)端通過(guò)制定的通信協(xié)議將數(shù)據(jù)解析封裝后存入數(shù)據(jù)庫(kù)。為了更直觀地顯示這些數(shù)據(jù),Web前端視圖層將以圖表形式顯示這些墑情數(shù)據(jù),用戶可以查看實(shí)時(shí)墑情數(shù)據(jù),并且可以根據(jù)條件查詢歷史墑情數(shù)據(jù)。
預(yù)警規(guī)則管理模塊主要負(fù)責(zé)預(yù)警規(guī)則的添加、查看、修改、刪除。規(guī)則內(nèi)容中有的是回調(diào)系統(tǒng)方法,例如“獲取傳感器值(realdata,“大氣溫度”)、判斷是否再次觸發(fā)(rule,生產(chǎn)基地id,180)等”。這些規(guī)則運(yùn)用了QLExpress規(guī)則引擎,它是阿里內(nèi)部的一個(gè)開(kāi)源的java規(guī)則引擎,主要是定義規(guī)則、解析規(guī)則、執(zhí)行規(guī)則幾個(gè)步驟,編譯的過(guò)程類似java class文件的編譯過(guò)程,首先進(jìn)行詞法分解、詞法分析、語(yǔ)法分析、規(guī)則執(zhí)行等步驟。
例如,規(guī)則內(nèi)容可以定義如下:
double溫度值=獲取傳感器值(realdata,“大氣溫度”);
String生產(chǎn)基地id=獲取生產(chǎn)基地id(realdata);
String生產(chǎn)基地名稱=獲取生產(chǎn)基地名稱(realdata);
如果 (溫度值大于30)
{boolean 再次觸發(fā)=判斷是否再次觸發(fā)(rule,生產(chǎn)基地id,180) ;
if (再次觸發(fā)==true) {String 觸發(fā)規(guī)則id=觸發(fā)規(guī)則(rule,生產(chǎn)基地id,“墑情警報(bào)”);
發(fā)APP消息(觸發(fā)規(guī)則id,生產(chǎn)基地id,“接收墑情報(bào)警”,“溫度超限報(bào)警”,生產(chǎn)基地名稱+realdata.getGathertime().toString()+“傳感器溫度為”+溫度值.toString()+“超過(guò)上限了”);
}}
客戶狀態(tài)管理模塊以列表形式展現(xiàn)已注冊(cè)客戶端的在線/離線、用戶名、姓名、郵件、創(chuàng)建日期等信息。如果客戶處于“在線”狀態(tài),則“在線/離線”列的圖片會(huì)變成藍(lán)色;如果處于“離線”狀態(tài),則圖片會(huì)變成灰色。用戶名是XMPP的地址JabberID中的node identifier,它由32位字母和數(shù)字隨機(jī)生成,用來(lái)唯一標(biāo)識(shí)通信中的客戶端[14]。
會(huì)話管理模塊以列表形式展現(xiàn)當(dāng)前所有客戶端與服務(wù)端建立的會(huì)話連接,“在線/離線”列的圖片全部顯示藍(lán)色,表示該列表的用戶全部在線且可以收到消息,系統(tǒng)可以對(duì)該列表的用戶群發(fā)消息,也可以選擇某個(gè)用戶單獨(dú)發(fā)消息,會(huì)話列表記錄了用戶名、狀態(tài)、客戶端IP等信息。
通知管理模塊分為服務(wù)器自動(dòng)推送和Web端手動(dòng)推送,分別介紹如下:
3.5.1 服務(wù)器自動(dòng)推送
使用Spring定時(shí)器,定義實(shí)時(shí)墑情數(shù)據(jù)規(guī)則處理任務(wù)類,該類的功能是處理實(shí)時(shí)數(shù)據(jù)報(bào)警規(guī)則,主要是運(yùn)用qlExpress對(duì)規(guī)則表達(dá)式進(jìn)行處理,解析規(guī)則后將實(shí)時(shí)數(shù)據(jù)與規(guī)則進(jìn)行綁定,最后執(zhí)行規(guī)則。執(zhí)行規(guī)則過(guò)程會(huì)執(zhí)行規(guī)則里面的推送方法,即規(guī)則中的“發(fā)送APP消息”方法,該方法實(shí)際上是調(diào)用NotificationManager中的sendNotifcationToUser方法。
該任務(wù)每分鐘被觸發(fā)并執(zhí)行一次,對(duì)實(shí)時(shí)數(shù)據(jù)報(bào)警規(guī)則進(jìn)行處理,如果實(shí)時(shí)墑情數(shù)據(jù)符合規(guī)則定義要求,系統(tǒng)則會(huì)將預(yù)警信息發(fā)送到用戶手機(jī)端上。
3.5.2 Web端手動(dòng)推送
Web端手動(dòng)推送是在推送頁(yè)面編輯推送信息,然后提交信息即可完成推送,用戶點(diǎn)擊手機(jī)通知欄即可查看信息詳情。在該頁(yè)面選擇推送的目標(biāo)用戶,可以選擇所有用戶進(jìn)行推送,也可以指定用戶進(jìn)行推送,還可以只推送給當(dāng)前在線用戶。當(dāng)選擇對(duì)所有用戶或者指定用戶進(jìn)行推送時(shí),離線用戶不會(huì)立即收到消息,服務(wù)端會(huì)把離線消息存入數(shù)據(jù)庫(kù)的離線信息表中,當(dāng)用戶再次在線時(shí),客戶端會(huì)自動(dòng)請(qǐng)求服務(wù)器,服務(wù)器會(huì)將離線信息表中最新的信息發(fā)送到用戶手機(jī)端。標(biāo)題和內(nèi)容用戶可以自己定義,URI則是用戶的地址,不是必填項(xiàng),點(diǎn)擊“提交”后請(qǐng)求執(zhí)行的方法是NotificationManager中的sendBroadcast()、sendNotifcationToUser()或者sendNotifcationToUserOnline(),當(dāng)選擇向所有用戶發(fā)送信息時(shí)會(huì)執(zhí)行sendBroadcast()方法,當(dāng)指定用戶時(shí)會(huì)執(zhí)行sendNotifcationToUser()方法,當(dāng)選擇推送給在線用戶時(shí)會(huì)執(zhí)行sendNotifcationToUserOnline()方法。
消息記錄管理模塊是對(duì)所有的推送信息進(jìn)行記錄,每發(fā)送一條信息則會(huì)將該信息的相關(guān)信息存入數(shù)據(jù)庫(kù)相應(yīng)的表中,在該頁(yè)面可以按消息類型、狀態(tài)、開(kāi)始時(shí)間、結(jié)束時(shí)間等條件查詢消息記錄,其中消息類型分為服務(wù)器自動(dòng)推送和Web手動(dòng)推送。點(diǎn)擊“查詢”按鈕,頁(yè)面會(huì)以列表的形式顯示符合該條件下的消息記錄,用戶在該頁(yè)面選中某條信息記錄雙擊可以查看消息詳情,同時(shí),該頁(yè)面也支持消息記錄的刪除。
基于Android平臺(tái)的客戶端運(yùn)用Android Studio進(jìn)行開(kāi)發(fā),開(kāi)發(fā)過(guò)程中在項(xiàng)目目錄下導(dǎo)入基于XMPP協(xié)議的asmack.jar包;客戶端主要進(jìn)行連接信息的管理,例如XMPP協(xié)議的端口、IP、用戶登錄等信息的管理,以及定時(shí)發(fā)送連接請(qǐng)求以保持連接處于有效狀態(tài)。服務(wù)器端和客戶端的通信是一個(gè)session(會(huì)話)過(guò)程。會(huì)話開(kāi)始時(shí)客戶端首先會(huì)通過(guò)指定的服務(wù)器的端口號(hào),把信息發(fā)送到服務(wù)器端,而服務(wù)器發(fā)送消息是通過(guò)
文中所研究的推送系統(tǒng)已經(jīng)在試點(diǎn)基地運(yùn)行,目前運(yùn)行情況良好;基地管理員用戶打開(kāi)瀏覽器進(jìn)入系統(tǒng)首頁(yè)后要求輸入用戶名和密碼,用戶名和密碼匹配成功后會(huì)進(jìn)入系統(tǒng)功能頁(yè)面。
墑情管理模塊以圖表形式直觀地展示農(nóng)業(yè)墑情監(jiān)測(cè)站傳過(guò)來(lái)的各種傳感器的實(shí)時(shí)數(shù)據(jù),在該頁(yè)面能夠查詢歷史數(shù)據(jù)、分析數(shù)據(jù)等。
預(yù)警規(guī)則管理模塊可以進(jìn)行預(yù)警規(guī)則的添加、刪除、修改、查看詳情等操作,但該頁(yè)面需要專業(yè)人員去維護(hù),否則系統(tǒng)可能會(huì)出現(xiàn)異常,因此對(duì)該頁(yè)面進(jìn)行了權(quán)限控制。
客戶狀態(tài)管理模塊可以看到所有的已注冊(cè)用戶,在線的用戶頭像顯示藍(lán)色,離線的顯示灰色。新用戶用手機(jī)安裝客戶端并注冊(cè)后,發(fā)現(xiàn)該頁(yè)面會(huì)自動(dòng)添加一行新客戶信息,頭像顯示藍(lán)色,當(dāng)該用戶退出客戶端后,頭像立即變?yōu)榛疑?/p>
會(huì)話管理模塊完整地顯示了當(dāng)前可與服務(wù)端進(jìn)行會(huì)話的客戶信息,一旦用戶離線,該用戶的信息會(huì)在該頁(yè)面消失,重新上線后又會(huì)顯示。
通知管理模塊可以進(jìn)行服務(wù)器自動(dòng)推送和Web端手動(dòng)推送,經(jīng)測(cè)試,服務(wù)端能夠在滿足條件的情況下將信息自動(dòng)推送給用戶,手動(dòng)推送則可以按照管理員用戶的需求有針對(duì)性的推送。對(duì)于離線用戶,經(jīng)過(guò)測(cè)試,當(dāng)對(duì)離線用戶發(fā)送信息時(shí),離線用戶不會(huì)立即收到信息,而是當(dāng)用戶再次上線時(shí)會(huì)收到最新的推送信息。
消息記錄管理模塊記錄了每一次的消息推送信息,管理員可以在該頁(yè)面查看或刪除消息記錄。
消息推送成功后,用戶手機(jī)端會(huì)接收到相關(guān)信息,手機(jī)通知欄顯示信息如圖3所示,點(diǎn)擊通知欄顯示信息詳情如圖4所示。
圖3 通知欄顯示信息
圖4 顯示信息詳情
農(nóng)業(yè)墑情預(yù)警信息實(shí)時(shí)推送系統(tǒng)包含完整的服務(wù)端與客戶端,實(shí)現(xiàn)了墑情信息的服務(wù)端自動(dòng)推送和Web端手動(dòng)推送,能夠及時(shí)地將墑情信息推送至用戶的手機(jī)客戶端上,用戶點(diǎn)擊手機(jī)通知欄即可查看消息詳情。該系統(tǒng)提供準(zhǔn)確及時(shí)的墑情預(yù)警信息給用戶,方便用戶及時(shí)了解農(nóng)作物生長(zhǎng)環(huán)境的突變情況,及時(shí)采取應(yīng)對(duì)措施,避免因環(huán)境變化而造成農(nóng)作物的損失,因而在農(nóng)業(yè)生產(chǎn)上具有很高的推廣價(jià)值,同時(shí)具有廣闊的應(yīng)用前景。
參考文獻(xiàn):
[1] 張 宇,張厚武,丁振磊,等.農(nóng)業(yè)小氣候數(shù)據(jù)監(jiān)測(cè)站的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2016,37(8):2072-2076.
[2] 楊 斌.XMPP協(xié)議分析與應(yīng)用探討[J].微型機(jī)與應(yīng)用,2005,24(8):32-34.
[3] LI Chengzhe,HSIEH M Y,HSU K H.An extended SOA for distributing workload to service providers using XMPP[J].Frontiers in Artificial Intelligence & Applications,2015,274:1743-1752.
[4] WAGENER J, SPJUTH O, WILLIGHAGEN E L, et al.XMPP for cloud computing in bioinformatics supporting discovery and invocation of asynchronous web services[J].BMC Bioinformatics,2009,10:279.
[5] 倪紅軍.基于Android平臺(tái)的消息推送研究與實(shí)現(xiàn)[J].實(shí)驗(yàn)室研究與探索,2014,33(5):96-100.
[6] 陶曉俊,朱 敏.基于規(guī)則引擎的企業(yè)服務(wù)開(kāi)發(fā)模式[J].計(jì)算機(jī)技術(shù)與發(fā)展,2008,18(2):115-118.
[7] 繳明洋,譚慶平.Java規(guī)則引擎技術(shù)研究[J].計(jì)算機(jī)與信息技術(shù),2006(3):41-43.
[8] 丁振凡,李馨梅.Spring的任務(wù)定時(shí)調(diào)度方法的研究比較[J].智能計(jì)算機(jī)與應(yīng)用,2012,2(4):55-56.
[9] 張 宇,王映輝,張翔南.基于Spring的MVC框架設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2010,36(4):59-62.
[10] AHUJA S,YANG J L.Performance evaluation of java web services:a developer’s perspective[J].Communications and Network,2010,2(3):200-206.
[11] 汪海占,邸 萌,黃祥林.基于XMPP協(xié)議的Android消息推送設(shè)計(jì)與實(shí)現(xiàn)[J].科技廣場(chǎng),2015(2):40-46.
[12] 黃明恩.基于Android平臺(tái)的云推送服務(wù)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京交通大學(xué),2015.
[13] 張克建.基于JavaEE與Android的消息推送系統(tǒng)的研究與實(shí)現(xiàn)[D].北京:華北電力大學(xué),2015.
[14] JIN J H,LEE H C,LEE M J.Supporting collaborative workspaces over XMPP[M].Berlin:Springer,2014.
[15] 殷 昊.基于Android平臺(tái)的消息推送能力的研究與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2013.