,張偉
(1.湖北大學(xué) 計算機與信息工程學(xué)院,武漢 430062; 2.烽火通信科技股份有限公司,武漢 430073)
傳統(tǒng)農(nóng)業(yè)生產(chǎn)主要依賴人工,生產(chǎn)效率難以提高,極易受環(huán)境氣候的約束,難以形成產(chǎn)業(yè)化、規(guī)模化[1]。為了減小以上限制,實現(xiàn)生產(chǎn)的現(xiàn)代化,智能農(nóng)業(yè)物聯(lián)網(wǎng)應(yīng)運而生。智能農(nóng)業(yè)物聯(lián)網(wǎng)依托物聯(lián)網(wǎng)、大數(shù)據(jù)、云計算等技術(shù)[2],實現(xiàn)對農(nóng)業(yè)生產(chǎn)、加工、銷售等各個方面的優(yōu)化。
現(xiàn)今,農(nóng)業(yè)物聯(lián)網(wǎng)在我國的產(chǎn)業(yè)化仍處在進行中。當(dāng)前農(nóng)業(yè)物聯(lián)網(wǎng)面臨的主要問題是無論是前期開發(fā)還是后期維護都需要投入大量成本,并且實際的農(nóng)業(yè)生產(chǎn)人員難以準(zhǔn)確使用農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)。基于Android平臺的農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng),通過LoRa無線網(wǎng)絡(luò)結(jié)合以太網(wǎng)/4G網(wǎng)絡(luò),將感知層采集的傳感器信息、實時監(jiān)控視頻等數(shù)據(jù)上行發(fā)送至農(nóng)業(yè)物聯(lián)網(wǎng)智能云服務(wù)器[3],通過云服務(wù)器將數(shù)據(jù)分發(fā)至移動終端。Lora網(wǎng)絡(luò)成本低、可靠性高,結(jié)合農(nóng)業(yè)物聯(lián)網(wǎng)智能云平臺使得開發(fā)及維護成本降低??蒲腥藛T及農(nóng)業(yè)生產(chǎn)人員通過Android手機、平板等移動設(shè)備遠程查看并控制智能農(nóng)業(yè)物聯(lián)網(wǎng),避免了系統(tǒng)復(fù)雜難以操作等問題。
本文基于Android平臺對農(nóng)業(yè)物聯(lián)網(wǎng)移動終端軟件進行設(shè)計,使用戶能在具備網(wǎng)絡(luò)的任何時間、任何地點對農(nóng)業(yè)生產(chǎn)進行查看以及控制。
系統(tǒng)整體架構(gòu)可分為感知層、傳輸層和應(yīng)用層。智慧農(nóng)業(yè)系統(tǒng)通過感知層收集農(nóng)業(yè)大棚內(nèi)的各項環(huán)境數(shù)據(jù)、監(jiān)控視頻,感知層的數(shù)據(jù)使用Lora無線網(wǎng)絡(luò)進行傳輸,每個LoRa基站可以傳輸多個農(nóng)業(yè)大棚內(nèi)收集的數(shù)據(jù)。系統(tǒng)將感知層收集的數(shù)據(jù)經(jīng)過有線、無線網(wǎng)絡(luò)發(fā)往應(yīng)用層。應(yīng)用層包括云服務(wù)器、云數(shù)據(jù)庫及移動終端。云服務(wù)器實現(xiàn)對上下行各項數(shù)據(jù)的處理,云數(shù)據(jù)庫實現(xiàn)對相應(yīng)數(shù)據(jù)的存儲管理,移動端實現(xiàn)對數(shù)據(jù)的展示實現(xiàn)與用戶的交互。系統(tǒng)整體架構(gòu)如圖1所示。系統(tǒng)支持對數(shù)據(jù)的上行下行雙向傳輸。從下自上時,傳感器收集各個農(nóng)業(yè)大棚的環(huán)境數(shù)據(jù),經(jīng)過Lora自組網(wǎng)絡(luò)發(fā)往Lora基站,Lora基站經(jīng)過有線、無線、3G/4G網(wǎng)絡(luò)傳輸將數(shù)據(jù)發(fā)送至云服務(wù)器,云服務(wù)器對數(shù)據(jù)進行處理,用戶通過移動客戶端實現(xiàn)對數(shù)據(jù)的訪問。自上而下時,用戶通過移動端發(fā)出指令,云服務(wù)接收指令并處理發(fā)放,云服務(wù)器通過有線、無線、3G/4G網(wǎng)絡(luò)將指令發(fā)往Lora基站,Lora基站通過Lora網(wǎng)絡(luò)將指令發(fā)往對應(yīng)控制設(shè)備。
圖1 系統(tǒng)整體架構(gòu)
系統(tǒng)上下級以不同的協(xié)議傳輸數(shù)據(jù)。Lora節(jié)點與Lora基站以Lorawan協(xié)議傳輸數(shù)據(jù),Lora基站與云服務(wù)器以tcp/ip協(xié)議傳輸數(shù)據(jù),云服務(wù)與移動端以http,websocket等協(xié)議傳輸數(shù)據(jù)。系統(tǒng)設(shè)計5種通用幀結(jié)構(gòu)用于系統(tǒng)數(shù)據(jù)的上行下行傳達。分別為上行數(shù)據(jù)幀、上行到達應(yīng)答幀、上行執(zhí)行應(yīng)答幀、下行控制指令幀和下行設(shè)備掃描幀。其中上行數(shù)據(jù)幀攜帶感知層采集的各項數(shù)據(jù);上行數(shù)據(jù)幀發(fā)出后,上行到達應(yīng)答幀向下層反應(yīng)數(shù)據(jù)到達情況;下行控制指令幀攜帶從移動端發(fā)出的指令;指令到達下層,上行執(zhí)行應(yīng)答幀向上層反應(yīng)指令到達情況;下行設(shè)備掃描幀用于啟動感知層各個各個設(shè)備。
Lora基站、云服務(wù)器和移動端等各層的通信協(xié)議上荷載通用數(shù)據(jù)幀,每層對數(shù)據(jù)幀進行拆包、數(shù)據(jù)處理、裝包然后發(fā)出。通用數(shù)據(jù)幀格式如圖2所示,包括開始、類型、站點id、大棚id、設(shè)備類型、數(shù)據(jù)內(nèi)容、校驗位和結(jié)束字節(jié)。
圖2 數(shù)據(jù)幀格式
Android平臺發(fā)展迅速,2019年安卓系統(tǒng)的份額已經(jīng)達到87%。本文旨在實現(xiàn)移動終端與云平臺之間的數(shù)據(jù)交互,使得用戶在遠程狀態(tài)下可以通過網(wǎng)絡(luò)對農(nóng)業(yè)生產(chǎn)數(shù)據(jù)進行訪問和控制,即實現(xiàn)一個C/S架構(gòu)的應(yīng)用系統(tǒng)。
基于Android平臺的移動終端是用戶對農(nóng)業(yè)物聯(lián)網(wǎng)進行操作的入口。依據(jù)主要功能可以劃分為用戶管理、數(shù)據(jù)監(jiān)控塊、設(shè)備控制和系統(tǒng)設(shè)置共4個模塊。
用戶管理模塊實現(xiàn)用戶登陸與用戶權(quán)限管理。數(shù)據(jù)監(jiān)控模塊采集并實時地顯示農(nóng)業(yè)大棚外內(nèi)的光照強度、風(fēng)力大小、降水強度、溫度、濕度、二氧化碳濃度等影響農(nóng)業(yè)生產(chǎn)的環(huán)境數(shù)據(jù),各個設(shè)備運行狀態(tài)以及監(jiān)控視頻。設(shè)備控制模塊通過數(shù)據(jù)采集模塊采集到的各項數(shù)據(jù)對農(nóng)業(yè)大棚中生產(chǎn)設(shè)備[5],包括對內(nèi)外遮陽、頂通風(fēng)、水簾補水、苗床灌溉、肥料攪拌、施肥泵、增氧機、照明和熱風(fēng)機等,進行手動或者自動控制,并對各種設(shè)備進行添、刪除等管理操作。系統(tǒng)設(shè)置主要是對農(nóng)業(yè)大棚的各項參數(shù)如環(huán)境數(shù)據(jù)閾值、設(shè)備控制參數(shù)進行設(shè)置。功能模塊如圖3所示。
圖3 移動端功能模塊
云平臺服務(wù)器使用JAVA語言進行開發(fā),使用jdk8在IDEA軟件進行開發(fā),使用mysql數(shù)據(jù)庫,1核cup、2G內(nèi)存的阿里云服務(wù)器。
Android移動終端使用JAVA語言進行開發(fā),使用jdk8在Android studio軟件進行開發(fā)。調(diào)試環(huán)境為一臺Android8.1.0系統(tǒng)版本的小米手機。
用戶登陸模塊需要實現(xiàn)用戶登陸和用戶注冊功能[6]。當(dāng)用戶登陸時,移動終端發(fā)起請求時,云服務(wù)器接收用到請求,并在云數(shù)據(jù)庫中查找用戶信息進行驗證。第一次使用的用戶需要進行注冊。移動端使用MVP架構(gòu)使得登陸注冊的界面與數(shù)據(jù)的交互分類。MVP架構(gòu)可以分為以下三個層面:
View層:Android 的Activity或Fragment通常用作View層,負(fù)責(zé)對登陸注冊頁面進行數(shù)據(jù)展示,便于實現(xiàn)界面交互功能。
Model層:即圖3中的Repository,Model層將通過網(wǎng)絡(luò)請求云服務(wù)器,取得數(shù)據(jù)庫信息,驗證用戶登陸。
Presenter層:對View層和Model層進行邏輯連接與處理。
View層和Model層不直接進行交互,在Presenter層以面向接口編程方式實現(xiàn)功能。View層和Model層以接口形式引入到Presenter層。Presenter層將View層和Model層隔離,并將具體實現(xiàn)代碼交由Presenter接口實現(xiàn)類處理,保證View層和Model層解耦合,易于測試和維護[7]。其實現(xiàn)過程如圖4所示。
圖4 用戶登陸/注冊流程圖
智慧農(nóng)業(yè)移動端系統(tǒng)擁有查看各項環(huán)境、設(shè)置環(huán)境參數(shù)閾值、查看監(jiān)控視頻、查看設(shè)備運行狀態(tài)、控制設(shè)備運行狀態(tài)及管理設(shè)備等功能。不同用戶的使用需求不同,并且出于對智慧農(nóng)業(yè)移動端系統(tǒng)的安全保障,需對用戶進行權(quán)限分類管理。普通用戶可以查看當(dāng)前數(shù)據(jù)監(jiān)控模塊中的環(huán)境數(shù)據(jù)和監(jiān)控視頻。一級管理員可以查看數(shù)據(jù)監(jiān)控模塊的所有數(shù)據(jù)并擁有設(shè)備控制操作權(quán)限。二級管理員擁有設(shè)備控制管理權(quán)限和系統(tǒng)設(shè)置權(quán)限。三級管理員可對賬戶管理、站點管理等進行操作。每級管理員擁有當(dāng)前及以下等級用戶權(quán)限。權(quán)限管理流程如圖5所示。
圖5 權(quán)限管理流程圖
數(shù)據(jù)監(jiān)控模塊包括環(huán)境數(shù)據(jù)、監(jiān)控視頻和設(shè)備運行狀態(tài)監(jiān)控,圖6為數(shù)據(jù)監(jiān)控模塊流程圖。
圖6 數(shù)據(jù)監(jiān)控流程圖
視頻監(jiān)控使用HLS協(xié)議,延時在可接受范圍內(nèi)。HSL協(xié)議的特性使得客戶端在不同的網(wǎng)絡(luò)情況下,可以依據(jù)網(wǎng)速對視頻流在不同的碼率中進行切換,使用戶能更方便在遠程查看農(nóng)業(yè)大棚中情況。監(jiān)控視頻在移動終端上通過HTML5播放,HTML5的VIDEO標(biāo)簽支持HLS協(xié)議[8]。
環(huán)境數(shù)據(jù)監(jiān)控和設(shè)備運行狀態(tài)監(jiān)控使用WebSocket協(xié)議。感知層將底層的各項數(shù)據(jù)通過網(wǎng)關(guān)/DTU發(fā)送到云服務(wù)器。云服務(wù)器將收到的數(shù)據(jù)解析為不同的環(huán)境信息,并持久化到數(shù)據(jù)庫,同時通過WebSocket協(xié)議與移動終端傳輸信息。
WebSocket協(xié)議是HTTP/1.1協(xié)議的升級,可以實現(xiàn)基于服務(wù)器推送并保持長連接[9]。在移動終端對服務(wù)器發(fā)起請求時,服務(wù)器讀取HTTP請求首部,讀取相應(yīng)的WebSocket請求字段,服務(wù)器將請求識別為WebSocket請求并與移動終端建立連接。
云服務(wù)器端實現(xiàn)WebSocket的onopen, onmessage, onclose和onerror消息。當(dāng)成功接收到一個WebSocket請求后,建立一個WebSocket連接接收onopen消息并將這個WebSocket連接加入隊列。當(dāng)WebSocket連接接收 onclose和onerro消息[10],表明連接出現(xiàn)錯誤或已經(jīng)關(guān)閉。服務(wù)器將當(dāng)前WebSocket連接從連接隊列中移除。當(dāng)收到傳感器信息時發(fā)送當(dāng)前隊列所有WebSocket連接的onmessage消息,將傳感器信息發(fā)送至移動終端。
移動終端在用戶登陸成功后,立刻發(fā)送一個Webocket請求建立與云平臺建立連接,等待推送消息。為了保證WebSocket連接能持續(xù)運行在后臺,移動終端使用Android四大組件之一的Service組件。通過Service組件保持WebSocket連接的使用方法如下:
1)Activity組件在收到服務(wù)器返回的登陸成功信息后,通過startService()啟動服務(wù),Service服務(wù)在生命周期的onStartCommand,服務(wù)開始運行。
2)Service組件在Android系統(tǒng)中優(yōu)先級比較低,當(dāng)內(nèi)存不足時會被系統(tǒng)回收。通過startForeground()開啟前臺服務(wù),將Service通過通知的方式運行在后臺。
3)在onStartCommand()中對WebSock- et連接進行初始化并發(fā)起連接。當(dāng)WebSo- cket接收到服務(wù)器發(fā)送的onMessage消息,Service組件發(fā)送廣播,向展示環(huán)境信息的Activity和Fragment發(fā)送消息。
4)當(dāng)用戶退出登陸,Service進入onDestroy狀態(tài),WebSocket發(fā)起onClose消息,斷開WebSocket連接。
設(shè)備控制模塊包括設(shè)備控制和設(shè)備管理,設(shè)備控制模塊流程如圖7所示。
圖7 設(shè)備控制流程圖
設(shè)備控制主要實現(xiàn)移動端控制用于農(nóng)業(yè)生產(chǎn)的設(shè)備,如燈光、通風(fēng)、水簾、肥料攪拌等。當(dāng)用戶通過移動終端對任意一個控制設(shè)備進行操作時,移動終端會對云服務(wù)發(fā)送一個POST請求,并帶有操作類型id的JSON請求體。
設(shè)備管理主要實現(xiàn)對設(shè)備的添加、刪除等操作。在實際農(nóng)業(yè)生產(chǎn)的不同時期,對各類設(shè)備的需求有所不同,因此涉及到設(shè)備的添加、刪除管理。移動終端會對云端發(fā)送POST請求,發(fā)送帶有操作設(shè)備id和操作類型的JSON請求體。
移動終端的網(wǎng)絡(luò)請求架構(gòu)使用Square公司的Retrofit2。Retrofit2是常用于移動端開發(fā)的OkHttp網(wǎng)絡(luò)請求框架的升級。通過Retrofit2構(gòu)建網(wǎng)請求的方法如下:
1)創(chuàng)建一個實體類,用于接收服務(wù)器端發(fā)送的數(shù)據(jù)。
2)創(chuàng)建一個用于Http請求的java接口,接口標(biāo)注表示Http請求方法和參數(shù)的注解。方法注解與請求方法同名,用戶登陸使用POST請求方法,用于登陸的接口使用@POST標(biāo)注。接口使用@Body標(biāo)注為非表單請求體,請求體為JSON類型。
3)構(gòu)建網(wǎng)絡(luò)請求實例。創(chuàng)建Retrofit事件,設(shè)置網(wǎng)絡(luò)請求的URL(統(tǒng)一資源定位符)設(shè)置OkHttp請求的連接超時等參數(shù),設(shè)置Gson數(shù)據(jù)解析器用于處理服務(wù)器返回的數(shù)據(jù),通過retrofit.create(ApiService.class) 創(chuàng)建網(wǎng)絡(luò)請求。
4)轉(zhuǎn)換線程,發(fā)送網(wǎng)絡(luò)請求,并對服務(wù)器返回數(shù)據(jù)進行處理。
系統(tǒng)設(shè)置模塊主要實現(xiàn)對底層設(shè)備包括數(shù)據(jù)監(jiān)控設(shè)備和控制設(shè)備進行初始化設(shè)置和各項參數(shù)調(diào)整。對環(huán)境數(shù)據(jù)可以進行采集頻率設(shè)置,采集頻率包括秒、分鐘、小時等單位;對數(shù)據(jù)精度進行設(shè)置,如對光照強度單位設(shè)置;對環(huán)境數(shù)據(jù)閾值進行區(qū)間設(shè)定,當(dāng)高于或低于閾值區(qū)間時,云服務(wù)器向移動終端推送警報信息。對設(shè)備控制可以設(shè)置設(shè)備的運行情況,如運行速度、運行方向等。根據(jù)生產(chǎn)人員的經(jīng)驗,在系統(tǒng)運行初期進行初始化系統(tǒng)設(shè)置。系統(tǒng)進入穩(wěn)定運行后,分析已產(chǎn)生的數(shù)據(jù)對系統(tǒng)參數(shù)進行相應(yīng)的調(diào)整以根據(jù)滿足生產(chǎn)。系統(tǒng)設(shè)置流程如圖8所示。
圖8 系統(tǒng)設(shè)置流程圖
移動終端會依據(jù)系統(tǒng)設(shè)置內(nèi)容通過Retrofit2向服務(wù)器發(fā)送http請求,請求體為包括設(shè)置設(shè)備和設(shè)置內(nèi)容的JSON字符串。
移動終端主要測試對服務(wù)器的請求能否正常提交,云服務(wù)器是正常接收傳感器數(shù)據(jù)并通過WebSocket與移動終端進行連接各項傳輸數(shù)據(jù),視頻監(jiān)控監(jiān)控能否實時傳輸?shù)揭苿咏K端,移動端控制指令能否正確發(fā)送。
測試時以測試用戶test登陸,如圖9所示。當(dāng)test用戶登陸成功時,移動終端開啟與云服務(wù)器的WebSocket連接。如圖10所示,建立WebSocket連接成功,移動終端接收的消息可以在數(shù)據(jù)監(jiān)控模塊查看,表明數(shù)據(jù)上行成功。
圖10 部分環(huán)境數(shù)據(jù)
移動終端可以對底層多個控制設(shè)進行多項操作。如圖11所示,測試用戶控制外遮陽1開啟正轉(zhuǎn),說明數(shù)據(jù)下行成功。
圖11 外遮陽正轉(zhuǎn)指令
如圖12所示,移動終端可以在任意時間查看監(jiān)控視頻。
圖12 視頻監(jiān)控夜間情況
系統(tǒng)功能測試主要測試websocket連接傳輸數(shù)據(jù)的頻率和移動端發(fā)起http請求控制底層設(shè)備的延時。
在系統(tǒng)設(shè)置頁面將數(shù)據(jù)采集設(shè)備的設(shè)采集頻率設(shè)置為為3分鐘。以一天中四個時間段測試,記錄每個時間段平均時間間隔,測試結(jié)果如表1所示。
表1 采集頻率測試結(jié)果
從移動端發(fā)起對控制設(shè)備的操作請求,記錄每組請求從發(fā)起請求到完成操作的平均時間,測試結(jié)果如表2,用戶從移動端發(fā)起指令到底層設(shè)備響應(yīng)延時在合理范圍以內(nèi),用戶使用感流暢。
表2 設(shè)備控制延時
測試結(jié)果表明,移動終端對服務(wù)器的請求,與服務(wù)器的WebSocket連接以及視頻監(jiān)控的傳輸?shù)裙δ芏颊_\行,能夠滿足農(nóng)業(yè)物聯(lián)網(wǎng)的各項需求。
本文旨在設(shè)計基于Lora的智慧農(nóng)業(yè)Android移動終端系統(tǒng)。移動終端實現(xiàn)功能幫助農(nóng)業(yè)生產(chǎn)人員或研究人員,在任何時間、任何地點可通過數(shù)據(jù)采集模塊查看農(nóng)業(yè)大棚的各項環(huán)境數(shù)據(jù),通過視頻監(jiān)控模塊掌握作物的生長情況。通過對各項環(huán)境數(shù)據(jù)實時情況的分析,農(nóng)業(yè)生產(chǎn)人員或研究人員可以使用設(shè)備控制模塊調(diào)整農(nóng)業(yè)大棚的環(huán)境以滿足作物生長。經(jīng)測試,智能農(nóng)業(yè)移動終端系統(tǒng)運行穩(wěn)定。通過對環(huán)境數(shù)據(jù)的長時間收集,可以實現(xiàn)對各項設(shè)備的自動控制,軟件具有較強的可擴展性。