鄭九鋒,姚凱學
(貴州大學 計算機科學與技術學院,貴州 貴陽 550025)
農業墑情監測站集成多種氣象傳感器,采集了包括土壤濕度、土壤溫度、光照強度、光合有效輻射、風向、風速、雨量、雨速、氣溫、空氣相對濕度、氣壓、海拔、土壤PH值、PM2.5等實時數據[1],并將這些數據經過下位機以及無線通信技術實時傳輸至后臺服務端,后臺將這些數據通過制定的協議解析,將合法的數據封裝后存入數據庫相應的表中。
運用QLExpress規則引擎技術設定預警規則,預警規則與實時數據綁定,規則內容包括大氣溫度報警、大氣濕度報警、墑情站離線報警等。推送系統將使用Spring定時任務每分鐘解析規則一次,滿足預警條件后就觸發相應的推送方法,將預警信息及時地發送到用戶的手機終端上,同時推送系統也支持在Web頁面手動編輯信息進行推送。用戶點擊手機通知欄就能查看消息詳情,在用戶獲取預警信息后,就可以采取相應的應對措施,避免因環境氣候因素導致農作物減產,帶來不必要的經濟損失,因此該系統在農業生產應用中意義重大。
XMPP(extensible messaging and presence protocol,可擴展通訊和表示協議)是一種基于可擴展標記語言(XML)的近端串流式即時通訊協議[2-3]。它是開源的,利用它可以實現簡單的推送功能,開發者可以修改其源代碼以適應自己的應用程序。
AndroidPn就是一個基于XMPP協議實現的開源消息推送服務,包含了完整的客戶端和服務端,其服務端是在另外一個開源項目openfire的基礎上修改實現的,其客戶端需要用到開源XMPP協議包asmack[4],這個包同樣是基于openfire下的另外一個開源項目smack。基于XMPP實現推送的優點就是簡單,開發者還可以根據自己的實際使用需求來擴展XMPP協議,實現消息的定制功能。
基于以上分析,系統采用基于XMPP協議的AndroidPn框架進行設計實現。通過集成開源的JAR包,修改開源項目,縮短開發成本,提高系統應用的穩定性和成熟性[5]。
QLExpress是一個開源的JAVA規則引擎,它一般作為一個嵌入式規則引擎在業務系統中使用[6-7]。該規則引擎技術不僅支持標準的JAVA語法,而且還支持自定義操作符號、操作符號重載、函數定義、宏定義、數據延遲加載等,所以使業務規則定義簡便并且非常靈活。
該規則的原理主要是定義規則、解析規則、執行規則幾個步驟,編譯的過程類似java class文件的編譯過程,會經過詞法分解、詞法分析、語法分析、規則執行等幾個步驟。系統按照QLExpress語法定義預警規則,Spring定時任務會每隔一分鐘解析一次預警規則,解析預警規則仍是使用QLExpress。
Spring task是Spring3.0以后自身提供的一種定時任務實現工具,該工具使用起來非常簡單,可以將它看作是一個輕量級的Quartz[8]。使用該工具時除了導入Spring相關的包外不需要再導入其他額外的包,而且支持注解和配置文件兩種形式,在Spring的配置文件中配置定時器開關
2.1.1 服務端架構
服務器端采用B/S架構,主要是在一個基于XMPP協議的開源工程openfire和高性能并發框架MINA基礎上修改實現,運用SpringMVC和Hibernate框架[9-10],結合性能高效的MySQL數據庫,服務器端軟件架構如圖1所示。服務器采用了分層的架構設計,共分為四層,分別為前端表現層、業務邏輯層、數據訪問層、數據庫管理層。

圖1 服務端架構
(1)前端表現層。
前端表現層包括兩個部分,一部分是農業墑情控制臺,主要是以圖表形式展示墑情監測站發送過來的墑情數據,預警規則管理界面主要用來進行預警規則的添加、修改、刪除、查詢等;另一部分是推送管理控制臺,主要是消息推送管理界面。在表現層,系統前端運用了jQUeryEasyUI框架,JSP2.0、CSS3、HTML以及Ajax等技術。
(2)業務邏輯層。
業務邏輯層主要是將表現層所涉及到的前端服務進行相關的邏輯實現。該系統業務邏輯層主要基于SpringMVC框架開發,SoilmoistureManager負責墑情數據的管理,WarningRuleManager負責預警規則的管理;客戶端與服務器端之間的通信使用了AndroidPn,它是一個實現了XMPP協議的開源項目,其中SessionManager負責管理客戶端App與服務器端之間的會話,AuthManager負責App用戶認證管理,PresenceManager負責管理App用戶的登錄狀態,NotificationManager負責實現服務器向客戶端App推送消息。MINA框架將網絡通信與應用程序隔離開來,開發者只需關心傳輸的數據以及業務邏輯即可,做到了高并發Socket訪問的有序管理。
(3)數據訪問層。
數據訪問層對數據庫進行一些相關業務的操作處理,例如數據的添加、刪除、修改、查詢,將業務的一系列數據操作提交到數據庫中。該系統后臺服務器采用Hibernate與SpringMVC框架開發,Spring框架本身提供了對DAO層的支持,可以提高開發者的效率,保證數據庫操作的準確性和安全性;Hibernate是一種ORM框架,用于將數據持久化。
(4)數據庫層。
該項目采用開源的關系型MySQL數據庫系統。MySQL用于記錄設備信息、用戶信息、待推送或已推送的消息內容、預警規則、墑情信息等數據。
農業墑情預警信息實時推送系統由墑情管理、預警規則管理、用戶狀態管理、會話管理、通知管理、消息記錄管理6個模塊構成。功能結構如圖2所示。

圖2 服務端功能結構
2.1.2 數據庫設計
系統采用的是MySQL數據庫,定義了用戶信息表(tb-user)、客戶表(tb-appuser)、信息表(tb-message)、預警規則表(tb-rule)、離線信息表(tb-offmessage)、墑情數據表(tb-moisture)。為了使用這些表,在Spring框架中集成Hibernate框架,在Spring配置文件中配置數據源、SessionFactory,配置實體類等實現表的建立以及數據庫的連接。
Android客戶端使用基于JAVA的開源XMPP協議包asmack,該包是基于openfire下的另外一個開源項目smack,在開發客戶端時,直接將asmack.jar包導入Android studio下的工程項目中即可使用。App利用asmack中提供的XMPPConnection類與服務器端建立起持久連接,并通過該連接進行用戶注冊和登錄認證,該連接也用于服務器端發送的消息通知[11]??蛻舳顺绦蛑蠸erviceManager負責管理消息服務以及加載相關的配置,ConnectivityReceiver負責處理網絡狀態的廣播,NotificationReceiver負責處理服務端發送的推送消息,NotificationService負責在后臺服務響應服務端的消息,PersistentConnectionListener負責監控連接關閉以及重連事件的監聽,PhoneStateChangeListener負責監聽手機狀態的事件,ReconnectionThread負責重連線程類,Notifier負責客戶端發送通知,NotificationIQ負責處理消息的數據包[12-13]。
墑情監測站將各傳感器采集到的實時數據通過下位機無線傳輸至推送系統服務端,服務端通過制定的通信協議將數據解析封裝后存入數據庫。為了更直觀地顯示這些數據,Web前端視圖層將以圖表形式顯示這些墑情數據,用戶可以查看實時墑情數據,并且可以根據條件查詢歷史墑情數據。
預警規則管理模塊主要負責預警規則的添加、查看、修改、刪除。規則內容中有的是回調系統方法,例如“獲取傳感器值(realdata,“大氣溫度”)、判斷是否再次觸發(rule,生產基地id,180)等”。這些規則運用了QLExpress規則引擎,它是阿里內部的一個開源的java規則引擎,主要是定義規則、解析規則、執行規則幾個步驟,編譯的過程類似java class文件的編譯過程,首先進行詞法分解、詞法分析、語法分析、規則執行等步驟。
例如,規則內容可以定義如下:
double溫度值=獲取傳感器值(realdata,“大氣溫度”);
String生產基地id=獲取生產基地id(realdata);
String生產基地名稱=獲取生產基地名稱(realdata);
如果 (溫度值大于30)
{boolean 再次觸發=判斷是否再次觸發(rule,生產基地id,180) ;
if (再次觸發==true) {String 觸發規則id=觸發規則(rule,生產基地id,“墑情警報”);
發APP消息(觸發規則id,生產基地id,“接收墑情報警”,“溫度超限報警”,生產基地名稱+realdata.getGathertime().toString()+“傳感器溫度為”+溫度值.toString()+“超過上限了”);
}}
客戶狀態管理模塊以列表形式展現已注冊客戶端的在線/離線、用戶名、姓名、郵件、創建日期等信息。如果客戶處于“在線”狀態,則“在線/離線”列的圖片會變成藍色;如果處于“離線”狀態,則圖片會變成灰色。用戶名是XMPP的地址JabberID中的node identifier,它由32位字母和數字隨機生成,用來唯一標識通信中的客戶端[14]。
會話管理模塊以列表形式展現當前所有客戶端與服務端建立的會話連接,“在線/離線”列的圖片全部顯示藍色,表示該列表的用戶全部在線且可以收到消息,系統可以對該列表的用戶群發消息,也可以選擇某個用戶單獨發消息,會話列表記錄了用戶名、狀態、客戶端IP等信息。
通知管理模塊分為服務器自動推送和Web端手動推送,分別介紹如下:
3.5.1 服務器自動推送
使用Spring定時器,定義實時墑情數據規則處理任務類,該類的功能是處理實時數據報警規則,主要是運用qlExpress對規則表達式進行處理,解析規則后將實時數據與規則進行綁定,最后執行規則。執行規則過程會執行規則里面的推送方法,即規則中的“發送APP消息”方法,該方法實際上是調用NotificationManager中的sendNotifcationToUser方法。
該任務每分鐘被觸發并執行一次,對實時數據報警規則進行處理,如果實時墑情數據符合規則定義要求,系統則會將預警信息發送到用戶手機端上。
3.5.2 Web端手動推送
Web端手動推送是在推送頁面編輯推送信息,然后提交信息即可完成推送,用戶點擊手機通知欄即可查看信息詳情。在該頁面選擇推送的目標用戶,可以選擇所有用戶進行推送,也可以指定用戶進行推送,還可以只推送給當前在線用戶。當選擇對所有用戶或者指定用戶進行推送時,離線用戶不會立即收到消息,服務端會把離線消息存入數據庫的離線信息表中,當用戶再次在線時,客戶端會自動請求服務器,服務器會將離線信息表中最新的信息發送到用戶手機端。標題和內容用戶可以自己定義,URI則是用戶的地址,不是必填項,點擊“提交”后請求執行的方法是NotificationManager中的sendBroadcast()、sendNotifcationToUser()或者sendNotifcationToUserOnline(),當選擇向所有用戶發送信息時會執行sendBroadcast()方法,當指定用戶時會執行sendNotifcationToUser()方法,當選擇推送給在線用戶時會執行sendNotifcationToUserOnline()方法。
消息記錄管理模塊是對所有的推送信息進行記錄,每發送一條信息則會將該信息的相關信息存入數據庫相應的表中,在該頁面可以按消息類型、狀態、開始時間、結束時間等條件查詢消息記錄,其中消息類型分為服務器自動推送和Web手動推送。點擊“查詢”按鈕,頁面會以列表的形式顯示符合該條件下的消息記錄,用戶在該頁面選中某條信息記錄雙擊可以查看消息詳情,同時,該頁面也支持消息記錄的刪除。
基于Android平臺的客戶端運用Android Studio進行開發,開發過程中在項目目錄下導入基于XMPP協議的asmack.jar包;客戶端主要進行連接信息的管理,例如XMPP協議的端口、IP、用戶登錄等信息的管理,以及定時發送連接請求以保持連接處于有效狀態。服務器端和客戶端的通信是一個session(會話)過程。會話開始時客戶端首先會通過指定的服務器的端口號,把信息發送到服務器端,而服務器發送消息是通過
文中所研究的推送系統已經在試點基地運行,目前運行情況良好;基地管理員用戶打開瀏覽器進入系統首頁后要求輸入用戶名和密碼,用戶名和密碼匹配成功后會進入系統功能頁面。
墑情管理模塊以圖表形式直觀地展示農業墑情監測站傳過來的各種傳感器的實時數據,在該頁面能夠查詢歷史數據、分析數據等。
預警規則管理模塊可以進行預警規則的添加、刪除、修改、查看詳情等操作,但該頁面需要專業人員去維護,否則系統可能會出現異常,因此對該頁面進行了權限控制。
客戶狀態管理模塊可以看到所有的已注冊用戶,在線的用戶頭像顯示藍色,離線的顯示灰色。新用戶用手機安裝客戶端并注冊后,發現該頁面會自動添加一行新客戶信息,頭像顯示藍色,當該用戶退出客戶端后,頭像立即變為灰色。
會話管理模塊完整地顯示了當前可與服務端進行會話的客戶信息,一旦用戶離線,該用戶的信息會在該頁面消失,重新上線后又會顯示。
通知管理模塊可以進行服務器自動推送和Web端手動推送,經測試,服務端能夠在滿足條件的情況下將信息自動推送給用戶,手動推送則可以按照管理員用戶的需求有針對性的推送。對于離線用戶,經過測試,當對離線用戶發送信息時,離線用戶不會立即收到信息,而是當用戶再次上線時會收到最新的推送信息。
消息記錄管理模塊記錄了每一次的消息推送信息,管理員可以在該頁面查看或刪除消息記錄。
消息推送成功后,用戶手機端會接收到相關信息,手機通知欄顯示信息如圖3所示,點擊通知欄顯示信息詳情如圖4所示。

圖3 通知欄顯示信息

圖4 顯示信息詳情
農業墑情預警信息實時推送系統包含完整的服務端與客戶端,實現了墑情信息的服務端自動推送和Web端手動推送,能夠及時地將墑情信息推送至用戶的手機客戶端上,用戶點擊手機通知欄即可查看消息詳情。該系統提供準確及時的墑情預警信息給用戶,方便用戶及時了解農作物生長環境的突變情況,及時采取應對措施,避免因環境變化而造成農作物的損失,因而在農業生產上具有很高的推廣價值,同時具有廣闊的應用前景。
參考文獻:
[1] 張 宇,張厚武,丁振磊,等.農業小氣候數據監測站的設計與實現[J].計算機工程與設計,2016,37(8):2072-2076.
[2] 楊 斌.XMPP協議分析與應用探討[J].微型機與應用,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平臺的消息推送研究與實現[J].實驗室研究與探索,2014,33(5):96-100.
[6] 陶曉俊,朱 敏.基于規則引擎的企業服務開發模式[J].計算機技術與發展,2008,18(2):115-118.
[7] 繳明洋,譚慶平.Java規則引擎技術研究[J].計算機與信息技術,2006(3):41-43.
[8] 丁振凡,李馨梅.Spring的任務定時調度方法的研究比較[J].智能計算機與應用,2012,2(4):55-56.
[9] 張 宇,王映輝,張翔南.基于Spring的MVC框架設計與實現[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協議的Android消息推送設計與實現[J].科技廣場,2015(2):40-46.
[12] 黃明恩.基于Android平臺的云推送服務的設計與實現[D].北京:北京交通大學,2015.
[13] 張克建.基于JavaEE與Android的消息推送系統的研究與實現[D].北京:華北電力大學,2015.
[14] JIN J H,LEE H C,LEE M J.Supporting collaborative workspaces over XMPP[M].Berlin:Springer,2014.
[15] 殷 昊.基于Android平臺的消息推送能力的研究與實現[D].北京:北京郵電大學,2013.