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