毛林,成維莉,夏偉偉,楊明全
(江蘇農(nóng)牧科技職業(yè)學院,江蘇 泰州 225300)
農(nóng)業(yè)物聯(lián)網(wǎng)綜合運用微電子、嵌入式、無線通信、RFID等技術(shù),通過無線傳感等設(shè)備,按約定通信協(xié)議將物與物相連接進行信息互聯(lián)互通、交換和共享,使茶葉生產(chǎn)管理從傳統(tǒng)方式快速向現(xiàn)代管理方式轉(zhuǎn)變。茶葉環(huán)境監(jiān)控系統(tǒng)是基于物聯(lián)網(wǎng)的自動化管理系統(tǒng),在智慧農(nóng)業(yè)發(fā)展中充當重要角色,對茶葉生產(chǎn)環(huán)境進行精準識別、定位、感知、監(jiān)控,提升茶葉生產(chǎn)管理信息化、自動化、智能化水平,實現(xiàn)管理效能和經(jīng)濟效益最大化目標。
茶園環(huán)境遠程監(jiān)控物聯(lián)網(wǎng)系統(tǒng)能夠支持以網(wǎng)站、瀏覽器、視頻等客戶端訪問方式提供遠程監(jiān)測與控制管理。隨著3G/4G通信技術(shù)與裝備的快速發(fā)展與應(yīng)用,運用移動互聯(lián)技術(shù)構(gòu)建面向智能終端應(yīng)用的遠程監(jiān)控系統(tǒng),可隨時隨地為用戶提供方便快捷的服務(wù)。本文結(jié)合江蘇農(nóng)牧科技職業(yè)學院茶園基地物聯(lián)網(wǎng)平臺-JTP平臺,進行移動終端業(yè)務(wù)流程分析及功能設(shè)計,重點研究服務(wù)數(shù)據(jù)交換、數(shù)據(jù)轉(zhuǎn)換、客戶端通信、數(shù)據(jù)解析等關(guān)鍵技術(shù)及實現(xiàn)方法,提出基于Android的茶園環(huán)境遠程監(jiān)控智能終端解決方案,對提升茶園自動化、智能化管理效能和服務(wù)質(zhì)量,具有重要現(xiàn)實意義。
JTP平臺分本地系統(tǒng)(下位機)、遠程系統(tǒng)(上位機)與中間網(wǎng)絡(luò),由底層硬件系統(tǒng)、無線傳感網(wǎng)絡(luò)(WSN)、網(wǎng)關(guān)和遠程服務(wù)器、客戶機、監(jiān)控屏幕構(gòu)成。底層(感知層)無線傳感網(wǎng)絡(luò)是平臺環(huán)境數(shù)據(jù)的主要來源,采用層次分簇異構(gòu)增強型結(jié)構(gòu)[1],縱向及橫向上具有良好伸縮性、可擴展性,適應(yīng)感知對象、監(jiān)測范圍、覆蓋密度、感知數(shù)據(jù)、通信距離等變化要求,滿足大規(guī)模復雜形態(tài)的服務(wù)質(zhì)量需求[2]。平臺包括數(shù)據(jù)采集、遠程監(jiān)測、歷史數(shù)據(jù)查看、遠程控制、視頻監(jiān)控、緊急報警等功能模塊,采用基于J2EE的SSI框架部署、整合應(yīng)用程序,實現(xiàn)總體整體業(yè)務(wù)聯(lián)動。
JTP平臺業(yè)務(wù)流程包括數(shù)據(jù)采集與處理、遠程傳輸、統(tǒng)計分析、實時瀏覽、報警、視頻監(jiān)控。通過平臺業(yè)務(wù)流程,對現(xiàn)場實時環(huán)境數(shù)據(jù)進行采集、轉(zhuǎn)換、壓縮、融合處理和遠程傳輸,提供數(shù)據(jù)持久化存儲、統(tǒng)計分析處理。用戶可隨時隨地登錄平臺進行環(huán)境監(jiān)控,瀏覽現(xiàn)場溫度、濕度、光照、土壤成分等環(huán)境因子變化,查看歷史數(shù)據(jù)、監(jiān)測報警、瀏覽監(jiān)控視頻,實現(xiàn)遠程控制。
智能終端系統(tǒng)采用基于C/S的三層結(jié)構(gòu),即Android客戶端、4G移動通信網(wǎng)絡(luò)、服務(wù)端??蛻舳讼到y(tǒng)部署在智能終端設(shè)備(如Android手機、Ipad等),提供無線通信接口、數(shù)據(jù)解析等中間層業(yè)務(wù)組件,為用戶查詢、控制等應(yīng)用服務(wù)所調(diào)用。底層Android操作系統(tǒng)、硬件、移動網(wǎng)絡(luò)、軟件工具作為應(yīng)用服務(wù)的支撐平臺。移動終端存儲空間和計算資源有限,本地數(shù)據(jù)存儲、處理要求不高時,可滿足輕量級應(yīng)用需求,保證客戶端系統(tǒng)基本性能要求[3]。
服務(wù)端構(gòu)建于JTP平臺服務(wù)器,平臺服務(wù)器搭建云計算平臺,包括IaaS、PaaS、SaaS三層,提供多操作系統(tǒng)、虛擬化硬軟件資源,統(tǒng)一調(diào)度管理資源使用,承擔海量數(shù)據(jù)存儲、計算、復雜業(yè)務(wù)處理,快速提供用戶所需服務(wù)[4]。在JTP平臺開發(fā)服務(wù)端數(shù)據(jù)交換接口、數(shù)據(jù)轉(zhuǎn)換處理等業(yè)務(wù)組件,滿足客戶端數(shù)據(jù)訪問需求。
平臺服務(wù)器為智能終端客戶端提供遠程訪問、查詢環(huán)境數(shù)據(jù)??蛻舳说卿浐筮M入軟件操作界面,發(fā)送監(jiān)測、查詢、控制遠程訪問請求時,經(jīng)ISP移動通信網(wǎng)絡(luò)提交至服務(wù)器,首先訪問服務(wù)端接口,測試與平臺服務(wù)端建立連接。連接成功后,服務(wù)端與客戶端建立會話,服務(wù)端生成客戶端唯一的會話標識SessionID,保存客戶端標識,在會話期間識別客戶端。服務(wù)端交換接口接受訪問請求信息,調(diào)用相關(guān)業(yè)務(wù)組件查詢數(shù)據(jù)庫,獲取所需信息內(nèi)容,轉(zhuǎn)換為預(yù)定交換格式數(shù)據(jù)后返回給服務(wù)端接口,連同客戶端標識一并發(fā)送至客戶端??蛻舳蓑炞C來自服務(wù)端傳輸數(shù)據(jù)后,接收數(shù)據(jù)并解析數(shù)據(jù),通過操作系統(tǒng)將最終結(jié)果展示到客戶端用戶頁面[3]。
Android為Google發(fā)布的主流開源智能終端操作系統(tǒng),是基于Linux的開放式嵌入式系統(tǒng),具有版本更新快、功能強大、開發(fā)效率高等特點。Android智能終端(手機、iPad、PDA)用戶使用廣,占據(jù)目前國內(nèi)市場80%以上份額。Android包括Activity(活動)、Service(服務(wù))、Broadcast Receiver(組播接收器)、Content Provider(內(nèi)容提供商)四大組件,內(nèi)置控件箱擁有豐富、美觀的UI控件,支持輕量級數(shù)據(jù)庫SQLite數(shù)據(jù)存取,提供網(wǎng)絡(luò)接口通信、多媒體、GPS功能和通用工具類等服務(wù)[5]。
本設(shè)計選用Google開源IDE工具Android Studio開發(fā)客戶端系統(tǒng)。Android Studio集成了Android所有開發(fā)工具包SDK(包括ADT、第三方開源庫等),開發(fā)環(huán)境更易于搭建、配置簡單,功能、效率和便捷性高[5]。服務(wù)端基于J2EE架構(gòu)的MVC設(shè)計模式[4],部署SSI輕量級開源框架[6],保存與JTP平臺相一致。Struts框架使Web服務(wù)交換層與控制層相互分離,iBatis充當DAO層數(shù)據(jù)庫訪問組件,Spring框架組裝和管理全局應(yīng)用程序,實現(xiàn)數(shù)據(jù)交換接口與數(shù)據(jù)庫的交互。SSI自適應(yīng)、可擴展的半成品框架特性,使服務(wù)端應(yīng)用開發(fā)與維護更加快捷、便利與高效。
服務(wù)端部署于JTP平臺服務(wù)器,在服務(wù)端應(yīng)用程序工作區(qū)src的com.jsmy.jtp.mobile包下分層,包括webservice層(Web服務(wù)交換)、action層(控制)、biz層(業(yè)務(wù))、dao層(數(shù)據(jù)訪問)、po層(持久化),各層僅含一個組件,組件內(nèi)定義和實現(xiàn)業(yè)務(wù)方法,避免組件過多引起服務(wù)端資源開銷過大,利用SSI框架簡化應(yīng)用程序組裝,以即插即用方式管理全局應(yīng)用程序,降低軟件模塊耦合度,減少系統(tǒng)開銷、提高運行效率。
3.1.1 數(shù)據(jù)交換
Web服務(wù)接口實現(xiàn)服務(wù)端、客戶端之間的交互和數(shù)據(jù)交換。Web服務(wù)運用SOAP、WSDD、UDDI在服務(wù)端應(yīng)用程序上對外共享開放式網(wǎng)絡(luò)服務(wù),提供客戶端遠程訪問服務(wù)端功能,運用消息或請求服務(wù)發(fā)現(xiàn)處理機制,接收網(wǎng)絡(luò)請求、做出響應(yīng)[3]。互聯(lián)網(wǎng)應(yīng)用中,HTTP協(xié)議是網(wǎng)絡(luò)通信的普適標準[7],提供webservice層數(shù)據(jù)交換接口規(guī)則描述,被網(wǎng)絡(luò)信息系統(tǒng)廣泛采用,用以Internet網(wǎng)絡(luò)資源定位與交換服務(wù)。
基于Webservice及HTTP規(guī)則開發(fā)服務(wù)交換接口,開發(fā)過程為:設(shè)置Web服務(wù)交換地址,JTP平臺服務(wù)端應(yīng)用程序主要包括用戶登錄、實時監(jiān)測、遠程控制、緊急報警、歷史查詢、基礎(chǔ)設(shè)置等六大服務(wù)接口,接口形式為http://localhost:8080/jmob/jmob_XXX.action,分別與客戶端通信接口地址URL對應(yīng);設(shè)置接口交換規(guī)則。依據(jù)HTTP協(xié)議定義交換接口數(shù)據(jù)交換規(guī)則,包括請求參數(shù)、HTTP請求方法、消息類型及處理方式、返回值等,接口規(guī)則除請求參數(shù)種類與個數(shù)、功能不同外,其他規(guī)則類同;配置和發(fā)布Web服務(wù),在JTP平臺項目WebRoot/WEB-INF目錄deploy.wsdd文件中配置,指示對外共享的Web服務(wù)類MobService;配置完成后,使用Apache axis2發(fā)布工具AdminClient發(fā)布Web服務(wù),在服務(wù)端IE瀏覽器地址欄中輸入http://localhost:8080/AxisWebService/servlet/Axis Servlet測試,顯示發(fā)布成功信息。
交換接口通過業(yè)務(wù)組件與底層數(shù)據(jù)庫交互,服務(wù)端數(shù)據(jù)交換過程是:Spring容器監(jiān)聽來自客戶端通信請求,獲取請求訪問的服務(wù)端接口,傳遞給交換層組件MobileWebService;struts.xml中配置MobileWebService調(diào)用action層組件mobileAction業(yè)務(wù)方法,如login(登錄)、monitor(監(jiān)測)、statistics(歷史查詢)、control(控制)等,將請求參數(shù)打包成持久化對象PO或HashMap對象;Spring框架定義action層、biz層、dao層組件調(diào)用,通過applicationContext.xml配置依賴注入(DI)和反轉(zhuǎn)控制(IoC)實現(xiàn);在ibatis框架配置文件mobileDao.ibatis.xml中注冊sqlMap標簽訪問數(shù)據(jù)庫,執(zhí)行指定SQL查詢操作。
3.1.2 數(shù)據(jù)轉(zhuǎn)換
數(shù)據(jù)交換接口接受客戶端HTTP請求做出響應(yīng),調(diào)用各層業(yè)務(wù)組件查詢數(shù)據(jù)庫,讀取到的數(shù)據(jù)包括HashMap、持久化對象Vo、ArrayList三種類型數(shù)據(jù),進行JSON數(shù)據(jù)轉(zhuǎn)換處理后,通過網(wǎng)絡(luò)發(fā)送到客戶端。JSON為輕量級交換格式數(shù)據(jù),有效壓縮了數(shù)據(jù)容量,網(wǎng)絡(luò)寬帶占用小、傳輸效率高,可快速送達客戶端。與XML、PULL、SAX相比[8],JSON數(shù)據(jù)降低或消除了Android解析復雜性,客戶端讀取、解析簡單方便。
設(shè)計中利用action層mobileAction組件完成數(shù)據(jù)格式轉(zhuǎn)換。服務(wù)端數(shù)據(jù)轉(zhuǎn)換過程為:(1)在mobileAction中定義轉(zhuǎn)換方法parseDataToJson(data),data為來自數(shù)據(jù)庫返回的數(shù)據(jù),data包括HashMap、持久化對象Vo、ArrayList三種類型。(2)parseDataToJson中依據(jù)data類型,將data轉(zhuǎn)換成JSON格式數(shù)據(jù),JSON數(shù)據(jù)通過JSONObject或JSONArray實例對象來存儲。(3)當data為HashMap或Vo時,以JSONObject保存JSON。HashMap使用get(key)取得鍵值對key-value,Vo使用getXXX屬性方法獲得鍵值對。通過JSONObject實例的put(key,value)保存鍵值對到JSONObject中。(4)data為ArrayList時,利用get方法依次取出Vo,將Vo中的鍵值對保存到JSONObject,再使用put將JSONObject保存到JSONArray。
客戶端系統(tǒng)包含用戶登錄、環(huán)境監(jiān)測、控制、歷史查詢、報警等功能模塊。Android中,視圖與業(yè)務(wù)是相互分離的??蛻舳艘晥DUI包括登錄等用戶操作界面,界面中安置Button按鈕、ListView列表、Spinner下拉框、DatePicker時間、ImageView圖片等控件,添加HelloCharts 圖表繪制工具,界面布局、控件樣式通過LinearLayout、RelativeLayout等布局方式設(shè)置,在res/layout工程目錄xml文件中進行定義和編輯。Activity充當事件處理器,綁定視圖界面,接收事件對象或消息,進行業(yè)務(wù)處理,將處理結(jié)果展示到視圖界面。Activity通過AndroidManifest.xml注冊生效。Activity事件處理程序是,用戶進入界面時,首先由onCreate保存當前Activity狀態(tài),setContentView鎖定視圖界面UI;當用戶操作時,監(jiān)聽器onClickListener監(jiān)聽事件對象,觸發(fā)onClick事件對用戶操作執(zhí)行一次業(yè)務(wù)處理。Activity可通過Intent對象轉(zhuǎn)向另一個Activity,實現(xiàn)客戶端不同界面切換,響應(yīng)速度快??蛻舳斯δ軐崿F(xiàn)中,接口通信、數(shù)據(jù)解析是Activity事件業(yè)務(wù)處理的關(guān)鍵。
3.2.1 接口通信
通信接口實現(xiàn)與遠程服務(wù)器交互,測試服務(wù)端連接、發(fā)送遠程請求與服務(wù)端建立會話、接收返回結(jié)果。本設(shè)計采用自定義外部公共類ClientUtility,類中定義重載方法getJSONByInterface來創(chuàng)建客戶端通信接口。通信接口實現(xiàn)過程為,在getJSONByInterface中為HttpURLConnection實例對象設(shè)置請求訪問的服務(wù)端交換地址URL、提交方式(GET/POST)、時延(Timeout)、協(xié)議頭類型(Content-Type)、是否允許緩存(UseCaches)等特性,設(shè)置參數(shù)由外部Activity調(diào)用時傳入;通過JSONObject將請求參數(shù)包裝成支持網(wǎng)絡(luò)傳輸編碼格式HTTP.UTF-8的鍵值對,存入JSONArray;JSONArray轉(zhuǎn)換成String字符串,再經(jīng)getBytes轉(zhuǎn)換后寫入BufferedOutputStream(緩沖字節(jié)輸出流),追加到URL,以POST方式提交,測試連接服務(wù)端;通過getResponseCode獲取服務(wù)端響應(yīng)碼,判斷連接狀態(tài),響應(yīng)碼為200時表示已建立連接;連接成功后,獲取服務(wù)端響應(yīng)數(shù)據(jù),包裝成BufferedReader(緩沖字符流),讀取BufferedReader保存為字符串responseData,再使用decodeUnicode解碼成UTF-8編碼格式的JSON數(shù)據(jù)。初次連接時通過HttpURLConnection的getHeaderFields獲取服務(wù)端分配的客戶端標識SessionId,存入客戶端Cookie中。
客戶端系統(tǒng)涉及登錄、實時監(jiān)測、歷史查詢、遠程控制等操作,每項操作需執(zhí)行接口通信、數(shù)據(jù)處理。用戶操作時,綁定視圖界面UI的Activity作為主線程,Activity內(nèi)部onCreate、onClick開啟子線程來調(diào)用通信接口,通信結(jié)束后,關(guān)閉子線程、返回主線程,確保主線程暢通,增強用戶體驗??蛻舳送ㄐ胚^程為:(1)初次登錄訪問時,Activity開啟子線程調(diào)用接口方法getJSONByInterface,傳遞登錄接口地址及帳號、密碼,提交至服務(wù)端;(2)與服務(wù)端連接成功后,服務(wù)端返回響應(yīng)數(shù)據(jù),讀取狀態(tài)碼驗證通過后,保存客戶端標識編號,返回主線程;(3)用戶點擊進入其他界面進行監(jiān)測、查詢、控制等操作時,開啟子線程再次調(diào)用getJSONByInterface,傳入對應(yīng)服務(wù)接口地址URL、客戶端SessionId等相關(guān)參數(shù)后提交服務(wù)端,服務(wù)端返回響應(yīng)結(jié)果,讀取狀態(tài)碼有效且返回值不為空時,提取響應(yīng)結(jié)果,經(jīng)UTF-8解碼存儲JSON數(shù)據(jù),進行后續(xù)解析處理。
3.2.2 數(shù)據(jù)解析
從服務(wù)端響應(yīng)數(shù)據(jù)中提取JSON數(shù)據(jù),數(shù)據(jù)解析是將JSON數(shù)據(jù)轉(zhuǎn)換為加載到可視化操作界面的顯示數(shù)據(jù),包括數(shù)字、文本、符號、圖表等。JSON數(shù)據(jù)分鍵/值對集合對象、鍵/值對有序列表兩種類型。對于前者,解析時通過JSONObject獲取所有鍵/值對,封裝成持久化對象VO;對于后者,同時利用JSONArray和JSONObject將JSON數(shù)據(jù)轉(zhuǎn)換為持久化對象VO的列表ArrayList。本設(shè)計使用Google提供的GSON方法解析JSON數(shù)據(jù)[9],使復雜類型數(shù)據(jù)解析和處理更為簡單。解析過程是,在ClientUtility類中自定義解析方法getDataFromJSON,通信接口子線程結(jié)束后,Activity主線程啟動子線程調(diào)用該方法,并傳遞JSON數(shù)據(jù)jsonResponse;分析JSON類型,通過Gson實例方法fromJson直接轉(zhuǎn)換,將JSONObject轉(zhuǎn)換為VO對象,JSONArray轉(zhuǎn)換為ArrayList
以JTP平臺實際數(shù)據(jù)為樣本測試智能終端系統(tǒng),用戶登錄后進入功能主界面。通過實時監(jiān)測模塊可查看茶園環(huán)境實時監(jiān)測數(shù)據(jù),展示動態(tài)數(shù)值變化曲線,通過手動方式滾動查看;遠程控制模塊可根據(jù)當前環(huán)境狀態(tài)開啟/關(guān)閉執(zhí)行機,調(diào)節(jié)溫濕度、光照度、土壤成分等數(shù)值至合理區(qū)間。通過歷史查詢模塊顯示某段時間內(nèi)環(huán)境監(jiān)測最高值、最低值、平均值信息,實現(xiàn)茶園監(jiān)控地點異常情況的實時報警;基礎(chǔ)設(shè)置模塊可設(shè)置各項環(huán)境參數(shù)閾值。通過測試,能夠達到智能手機遠程監(jiān)控管理的目標。
本研究將移動互聯(lián)與農(nóng)業(yè)物聯(lián)網(wǎng)應(yīng)用相融合,以智能手機快捷、便利方式,對茶園環(huán)境情況進行實時監(jiān)控、報警和遠程控制,查詢歷史數(shù)據(jù),實現(xiàn)茶葉生產(chǎn)環(huán)境自動化管理,提高了智能化、自動化管理服務(wù)效能。