萬春旭
摘要:在人力成本提升、農(nóng)業(yè)從業(yè)者結(jié)構(gòu)性短缺的今天,農(nóng)業(yè)物聯(lián)網(wǎng)成為有效提升農(nóng)業(yè)生產(chǎn)效率的最佳手段之一。農(nóng)業(yè)物聯(lián)網(wǎng)移動化監(jiān)控系統(tǒng)是農(nóng)業(yè)物聯(lián)網(wǎng)軟件系統(tǒng)中的一部分,它讓農(nóng)業(yè)生產(chǎn)管理者在空間和時(shí)間上得到解放。該文分析了農(nóng)業(yè)物聯(lián)網(wǎng)移動化監(jiān)控系統(tǒng)開發(fā)的核心技術(shù),具體介紹了這些技術(shù)的特點(diǎn)和使用方法,同時(shí)總結(jié)了一套高效、易用的開發(fā)模式。
關(guān)鍵詞:農(nóng)業(yè)物聯(lián)網(wǎng);移動監(jiān)控系統(tǒng);Android
中圖分類號:TP393? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2021)14-0004-03
1 背景
我國是一個(gè)農(nóng)業(yè)大國,但不是一個(gè)農(nóng)業(yè)強(qiáng)國。要把14億人的飯碗端在自己的手里,需要大力發(fā)展現(xiàn)代化農(nóng)業(yè)技術(shù)。從大力倡導(dǎo)發(fā)展農(nóng)業(yè)機(jī)械化、到向以色列學(xué)習(xí)設(shè)施農(nóng)業(yè),再到現(xiàn)在全面發(fā)展智慧農(nóng)業(yè),我國農(nóng)業(yè)在較短時(shí)間內(nèi)實(shí)現(xiàn)了技術(shù)上的升級[1]。隨著物聯(lián)網(wǎng)、大數(shù)據(jù)、人工智能等技術(shù)在農(nóng)業(yè)中的應(yīng)用,讓農(nóng)業(yè)產(chǎn)業(yè)精準(zhǔn)化、節(jié)約化、工業(yè)化,擺脫人力密集、靠天吃飯等傳統(tǒng)農(nóng)業(yè)的產(chǎn)業(yè)弊端。農(nóng)業(yè)物聯(lián)網(wǎng)具有技術(shù)成熟,開發(fā)成本低、建設(shè)收益明顯等特點(diǎn),在當(dāng)今的農(nóng)業(yè)產(chǎn)業(yè)中被廣泛應(yīng)用。它的典型應(yīng)用場景有智能養(yǎng)殖、智能溫室、農(nóng)業(yè)產(chǎn)品跟蹤溯源等[2]。農(nóng)業(yè)物聯(lián)網(wǎng)移動化監(jiān)控系統(tǒng)是農(nóng)業(yè)物聯(lián)網(wǎng)中的軟件部分,通過它可以實(shí)時(shí)、遠(yuǎn)程監(jiān)控農(nóng)業(yè)生產(chǎn)環(huán)境和流通環(huán)節(jié)等,節(jié)約勞動力成本,提升農(nóng)產(chǎn)品產(chǎn)量和品質(zhì)。很多農(nóng)業(yè)企業(yè)在尋求高效低成本地開發(fā)一個(gè)農(nóng)業(yè)物聯(lián)網(wǎng)移動化監(jiān)控系統(tǒng)的方法。
1 農(nóng)業(yè)物聯(lián)網(wǎng)技術(shù)
1.1 農(nóng)業(yè)物聯(lián)網(wǎng)技術(shù)架構(gòu)
一個(gè)完整的農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)在技術(shù)架構(gòu)方面,可分為感知層、傳輸層和應(yīng)用層三個(gè)層次,圖1展示了三個(gè)層的主要功能,以及層與層之間的邏輯關(guān)系。
感知層的核心功能是信息采集,傳輸層采用計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)和通信技術(shù),是進(jìn)行信息交換和傳遞數(shù)據(jù)的通路。應(yīng)用層包括數(shù)據(jù)存儲、數(shù)據(jù)分析、數(shù)據(jù)展示及任務(wù)執(zhí)行等功能。農(nóng)業(yè)物聯(lián)網(wǎng)的三個(gè)層次分別賦予了物聯(lián)網(wǎng)系統(tǒng)全面感知、可靠傳輸、有效優(yōu)化及智能處理等特征。
1.2 農(nóng)業(yè)物聯(lián)網(wǎng)移動化監(jiān)控系統(tǒng)
從項(xiàng)目工程建設(shè)角度,農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)可分為硬件和軟件兩大塊。硬件包括感知層的信息采集設(shè)備、傳輸層的網(wǎng)絡(luò)與相關(guān)設(shè)備、應(yīng)用層的控制器和電機(jī)。軟件平臺包括云平臺、大數(shù)據(jù)系統(tǒng)、專家決策支撐系統(tǒng)和物聯(lián)網(wǎng)監(jiān)控平臺等[3]。大數(shù)據(jù)系統(tǒng)、專家決策支撐系統(tǒng)由于開發(fā)成本高,中小型農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)中一般租用公共平臺或直接使用人工決策機(jī)制。云平臺是一個(gè)必要部分,不同的云平臺功能差異較大,有的只是一個(gè)數(shù)據(jù)存儲和轉(zhuǎn)發(fā)平臺,有的在數(shù)據(jù)存儲外擁有強(qiáng)大數(shù)據(jù)處理能力。云平臺可以定制開發(fā),也可以租用收費(fèi)或免費(fèi)公共云平臺。農(nóng)業(yè)物聯(lián)網(wǎng)監(jiān)控平臺用于實(shí)時(shí)數(shù)據(jù)展示,環(huán)境數(shù)值預(yù)警,遠(yuǎn)程控制等。農(nóng)業(yè)物聯(lián)網(wǎng)監(jiān)控系統(tǒng)的表現(xiàn)形式可以是PC軟件、Web網(wǎng)站和移動應(yīng)用等形式[4]。早期農(nóng)業(yè)物聯(lián)網(wǎng)監(jiān)控平臺只有PC軟件,用戶在農(nóng)業(yè)生產(chǎn)環(huán)境邊的監(jiān)控室里,通過軟件操控整個(gè)智能系統(tǒng)。后來發(fā)展為基于互聯(lián)網(wǎng)的Web應(yīng)用,通過網(wǎng)絡(luò)遠(yuǎn)程控制。隨著5G技術(shù)的應(yīng)用,移動化監(jiān)控應(yīng)用成為標(biāo)配,它在時(shí)間和空間上解放了農(nóng)業(yè)生產(chǎn)。早期建設(shè)的農(nóng)業(yè)智能化生產(chǎn)環(huán)境,在人力成本逐年提高的情況下,急需升級配置移動監(jiān)控應(yīng)用。一套高效率、低成本的農(nóng)業(yè)物聯(lián)網(wǎng)移動化監(jiān)控系統(tǒng)開發(fā)模式,可以幫助農(nóng)業(yè)企業(yè)快速搭建一個(gè)農(nóng)業(yè)移動化監(jiān)控系統(tǒng)。
2 農(nóng)業(yè)物聯(lián)網(wǎng)移動化監(jiān)控系統(tǒng)開發(fā)關(guān)鍵技術(shù)
2.1 JSON數(shù)據(jù)格式
JSON 是存儲和交換文本信息的語法,它與平臺和語言無關(guān),主要用于跨平臺的數(shù)據(jù)交換,與XML類似,但它比XML更小、更快,更易解析。在基于Android的移動應(yīng)用開發(fā)中,JSON體積小、傳遞速度快的特性,具有更大的優(yōu)勢,在農(nóng)業(yè)物聯(lián)網(wǎng)移動化監(jiān)控系統(tǒng)開發(fā)中被廣泛使用。移動監(jiān)控系統(tǒng)與物聯(lián)網(wǎng)云平臺之間交換的數(shù)據(jù)大部分采用JSON格式。上傳云平臺時(shí),需要把數(shù)據(jù)包裝成JSON格式,從云平臺取回JSON格式數(shù)后,需要從中解析出需要的數(shù)據(jù)。Android通過JSONObject類來生成和解析JSON格式數(shù)據(jù),JSONObject類下有g(shù)etString()、getJSONObject()和getJSONArray()三個(gè)方法用于處理不同數(shù)據(jù)類型。當(dāng)數(shù)據(jù)嵌套多層時(shí),需要從外到里一層層的解析。為提高開發(fā)效率和降低出錯的可能,建議使用開源插件,常用的有Gson、JackJson、FastJson等幾種。其中GSON是Google官方開發(fā)的Java類庫,它實(shí)現(xiàn)了用面向?qū)ο蟮姆绞教幚鞪SON格式數(shù)據(jù),它可以很方便地實(shí)現(xiàn)JSON字符串與Java對象之間的相互轉(zhuǎn)化。
2.2 網(wǎng)絡(luò)訪問與線程
農(nóng)業(yè)物聯(lián)網(wǎng)移動管理系統(tǒng)與物聯(lián)網(wǎng)云平臺需要進(jìn)行頻繁的數(shù)據(jù)交換,與其他多媒體類系統(tǒng)相比,農(nóng)業(yè)物聯(lián)網(wǎng)移動管理系統(tǒng)的網(wǎng)絡(luò)訪問數(shù)據(jù)量相對較少。因此,大部分物聯(lián)網(wǎng)云平臺采用URL通信方式。在Android 6.0以后的版本中通過HttpURLConnection實(shí)現(xiàn)HTTP請求,網(wǎng)絡(luò)訪問過程可分為以下幾個(gè)環(huán)節(jié):
1)生成URL類地址對象,具體語句為:URL url = new URL(url);
2)通過URL對象建立與服務(wù)器的連接:HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3)設(shè)置HttpURLConnection的相關(guān)參數(shù),例如請求方式、請求時(shí)限等;
4)從HttpURLConnection連接中取得數(shù)據(jù)輸入流InputStream,由輸入流讀入字符輸入流。輸入的數(shù)據(jù)如果有中文,還需要對中文進(jìn)行編碼處理;
5)在線程中讀入數(shù)據(jù)無法直接顯示到界面中,需要使用Handler對象處理線程之間的消息處理。
由于網(wǎng)絡(luò)訪問的非即時(shí)響應(yīng)特性,執(zhí)行網(wǎng)絡(luò)訪問時(shí)需要開啟子線程。網(wǎng)絡(luò)訪問與線程處理混合在一起,讓實(shí)現(xiàn)難度加備。Android開發(fā)團(tuán)隊(duì)于2013年推出了綜合的網(wǎng)絡(luò)通信框架Volley,它適用于“一次網(wǎng)絡(luò)通信中傳輸?shù)臄?shù)據(jù)量較少,但網(wǎng)絡(luò)通信業(yè)務(wù)比較頻繁的應(yīng)用”,這一特點(diǎn)非常契合農(nóng)業(yè)物聯(lián)網(wǎng)移動管理系統(tǒng)的網(wǎng)絡(luò)訪問。Volley最核心的兩個(gè)類分別是: JSON請求類:JsonObjectRequest和請求隊(duì)列類:RequestQueue。RequestQueue主要負(fù)責(zé)網(wǎng)絡(luò)請求的線程處理,所有網(wǎng)絡(luò)請求都需要加入到RequestQueue隊(duì)列中,才能被系統(tǒng)調(diào)度執(zhí)行。JsonObjectRequest是一個(gè)Json格式的網(wǎng)絡(luò)請求類,通過網(wǎng)絡(luò)響應(yīng)返回監(jiān)聽Response.Listener和Response.ErrorListener來處理網(wǎng)絡(luò)通信結(jié)果。
RequestQueue myQue = Volley.newRequestQueue(context);
StringRequest stringRequest = new StringRequest(Request.Method.GET,url,
new Response.Listener
@Override
public void onResponse(String response) {
//網(wǎng)絡(luò)請求成功后,回調(diào)處理代碼在該方法中
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//網(wǎng)絡(luò)請求失敗后,回調(diào)處理代碼在該方法中
}
});
stringRequest.setTag(tag);
myQue.add(stringRequest); //網(wǎng)絡(luò)訪問加入線程隊(duì)列中
2.3 數(shù)據(jù)庫技術(shù)
Android系統(tǒng)配備了SQLite數(shù)據(jù)庫,它占用系統(tǒng)資源少、功能全面,同時(shí)也保留了JDBC操作方法和SQL指令體系。SQLite提供了兩個(gè)數(shù)據(jù)庫操作類,分別是SQLiteDatabase和SQLiteOpenHelper。SQLiteOpenHelper用于數(shù)據(jù)庫的創(chuàng)建、打開和版本更新,但它是一個(gè)抽象類,不用直接使用,需要自己定義一個(gè)繼承于它的類,并實(shí)現(xiàn)主要方法。SQLiteDatabase是一個(gè)數(shù)據(jù)庫訪問類,是SQLite數(shù)據(jù)庫操作的基礎(chǔ),這個(gè)類里面封裝了一系列數(shù)據(jù)庫操作的API,通過它可以進(jìn)行數(shù)據(jù)庫相關(guān)操作,如添加、查詢、更新、刪除等[5]。SQLite類操作數(shù)據(jù)庫時(shí),需要自己撰寫SQL語句,當(dāng)數(shù)據(jù)表的字段較多時(shí),編碼與后期維護(hù)的工作量將非常大。ORMLite數(shù)據(jù)庫框架采用“對象關(guān)系映射”方式管理數(shù)據(jù)庫,數(shù)據(jù)庫表與Java對象一一對應(yīng),通過使用Java類中的方法實(shí)現(xiàn)對數(shù)據(jù)表操作。Java類中的“屬性”對應(yīng)用數(shù)據(jù)表中的“字段”,ORMLite通過給Java類中的“屬性”和“方法”添加Java注解的方式,讓Java類與數(shù)據(jù)表之間建立映射關(guān)系,實(shí)現(xiàn)操作Java類的屬性和方法就能直接改變數(shù)據(jù)表中的數(shù)據(jù)。下面這段代碼是ORMLite“對象關(guān)系映射”的應(yīng)用實(shí)例,數(shù)據(jù)表名稱為:senseInfo,對應(yīng)的類名為:SensenInfo。這個(gè)類里面的id屬性,對應(yīng)數(shù)據(jù)表中名為id的字段,該字段為自增類型主鍵。
@DatabaseTable(tableName = "senseInfo") //建立表與類之間一對一的關(guān)系
public class SenseInfo {
//建立字段名與類屬性之間一對一的關(guān)系
@DatabaseField(generatedId = true,columnName = "id")
public int id;
//空的構(gòu)造方法一定要有,否則數(shù)據(jù)庫會創(chuàng)建失敗
public SenseInfo(){}
}
2.4 數(shù)據(jù)的圖表展示
將農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)采集到的數(shù)據(jù)以圖表形式呈現(xiàn)出來,可以幫助管理者更好地了解不同數(shù)據(jù)間的比例關(guān)系和變化趨勢,方便管理者做出合理的推斷和預(yù)測。Android原生API支持圖表種類多,但功能繁復(fù),操作難度大。為了減少開發(fā)難度,推薦使用開源圖表框架,如MPAndroidChart、achartengine、GraphView等,每種框架都有各自的特色,根據(jù)應(yīng)用需要選擇一種直接套用即可。MPAndroidChart因其功能強(qiáng)大和使用簡單成為主流圖表框架。它支持線狀圖、柱狀圖、散點(diǎn)圖、柱狀圖、氣泡圖、餅狀圖和蜘蛛網(wǎng)狀圖,同時(shí)支持圖表的縮放、拖動、選擇和動畫等運(yùn)行功能。
MPAndroidChart中不同圖表的生成方式不盡相同,但總體上可以歸納為7個(gè)步:step1:實(shí)例化圖表對象-> step2:生成圖中所有點(diǎn)的坐標(biāo)數(shù)據(jù)(Entry組成的List)-> step3:生成數(shù)據(jù)軸標(biāo)簽(String類型組成的List,與上一步的List數(shù)量相等)-> step4:生成坐標(biāo)點(diǎn)集生成一條線的數(shù)據(jù)集(DataSet)-> step5:由數(shù)據(jù)集生成圖表數(shù)據(jù)源對象(Data)-> step6:把數(shù)據(jù)源加載到圖表中-> step7:刷新圖表。
2.5 App Inventor的快速搭建模式
前面介紹了農(nóng)業(yè)物聯(lián)網(wǎng)移動化監(jiān)控系統(tǒng)開發(fā)中用到的數(shù)據(jù)庫、網(wǎng)絡(luò)、圖表等開發(fā)技術(shù),但對于項(xiàng)目開發(fā)經(jīng)驗(yàn)不足的程序員,即使全部掌握了這些技術(shù),要獨(dú)立開發(fā)一個(gè)完整的項(xiàng)目,難度還是很大。如果遇上項(xiàng)目開發(fā)時(shí)間緊、技術(shù)能力不足、團(tuán)隊(duì)人員又少的情況,推薦使用可視化快速移動應(yīng)用開發(fā)工具:App Inventor。App Inventor簡稱ai2,是谷歌公司開發(fā)的基于web的可視化Android系統(tǒng)應(yīng)用開發(fā)工具,現(xiàn)轉(zhuǎn)由麻省理工學(xué)院(MIT)運(yùn)維。ai2采用的是在線編碼+手機(jī)或模擬器測試的開發(fā)模式,本地計(jì)算機(jī)只需Java運(yùn)行環(huán)境和瀏覽器,再配一個(gè)Android系統(tǒng)的手機(jī)用于項(xiàng)目測試。在線開發(fā)最核心的是服務(wù)器,ai2官方服務(wù)器在麻省理工,國內(nèi)目前有兩三個(gè)漢化的、持續(xù)更新并穩(wěn)定運(yùn)行的服務(wù)器,華南理工大學(xué)楊道全開發(fā)管理的WxBit漢化版(服務(wù)器地址為:https://app.wxbit.com/)運(yùn)行比較穩(wěn)定。
ai2中UI通過拖拽和屬性設(shè)置方式實(shí)現(xiàn)組件的擺放和樣式設(shè)計(jì),功能邏輯采用圖形化編程模式,有過樂高開發(fā)經(jīng)驗(yàn)的人對這種方式會非常的熟悉。ai2外在表現(xiàn)形式是“圖形化”“積木式”,但它本質(zhì)上還是一個(gè)面向?qū)ο蟮木幊陶Z言,跳出積木編程思維,從面向?qū)ο蟮倪壿嫿嵌冉鈽?gòu),ai2的項(xiàng)目結(jié)構(gòu)如圖2所示。組件和行為是一個(gè)應(yīng)用的核心,變量、方法是一種編程手段和方式。ai2中有常用的標(biāo)簽、文本框、按鈕、動畫等可視化組件,還有傳感器、數(shù)據(jù)庫、網(wǎng)絡(luò)訪問等不可見的組件。事件和事件響應(yīng)模塊幾乎涵蓋了所有程序邏輯相關(guān)功能。能滿足農(nóng)業(yè)物聯(lián)網(wǎng)移動化監(jiān)控系統(tǒng)開發(fā)的大部分需求,但在數(shù)據(jù)存儲和圖表展示方面還需要利用其他資源配套使用。
ai2提供的網(wǎng)絡(luò)微數(shù)據(jù)庫是一個(gè)開發(fā)者共享數(shù)據(jù)庫,采用“key:value”存儲方式,如果遇到key相同時(shí),后存的value會覆蓋前面的value值。為了數(shù)據(jù)安全性,ai2為深入開發(fā)用戶也提供了自己建立數(shù)據(jù)庫的方法,官方數(shù)據(jù)庫平臺(http:// appinventorapi.com /create-a-web-database-python-2-7)上面有創(chuàng)建自己的網(wǎng)絡(luò)數(shù)據(jù)庫的詳細(xì)介紹,按照上面的說明操作就可以建立起屬于自己的部署在互聯(lián)網(wǎng)上的數(shù)據(jù)庫,而且與App Inventor的協(xié)議兼容,谷歌的云服務(wù)工具會分配給你一個(gè)網(wǎng)址,把網(wǎng)絡(luò)微數(shù)據(jù)庫中的網(wǎng)址改成這個(gè)網(wǎng)址,就可以訪問個(gè)人數(shù)據(jù)庫,并用它來創(chuàng)建基于網(wǎng)絡(luò)的移動應(yīng)用建立屬于自己的互聯(lián)網(wǎng)上的數(shù)據(jù)庫。ai2網(wǎng)絡(luò)微數(shù)據(jù)采用標(biāo)準(zhǔn)的HTTP請求來向服務(wù)器發(fā)送數(shù)據(jù),如果要向網(wǎng)絡(luò)微數(shù)據(jù)庫里“保存數(shù)據(jù)”時(shí),發(fā)送的頭部參數(shù)為Accept:application/json,發(fā)送的數(shù)據(jù)為:["STORED","標(biāo)簽","值"]。如果要從網(wǎng)絡(luò)微數(shù)據(jù)庫中取數(shù)據(jù)時(shí),發(fā)送的數(shù)據(jù)為:["VALUE", "標(biāo)簽"],根據(jù)這些特性,也可以自己編寫網(wǎng)絡(luò)數(shù)據(jù)庫存取服務(wù)器。
ai2在圖形化方面提供了最基礎(chǔ)的圖形繪制功能,從理論角度來說,通過這些線條、圖形的繪制功能也能夠畫出一張圖表來。但用這種模式繪制一張圖表,就類似于憑借個(gè)人力量蓋一座樓。要比較快捷的制作一張圖表,可以借助一些圖表專用工具,如Google Chart API和ECharts等。這兩個(gè)工具都用于生成基本網(wǎng)頁的圖表,在ai2中需要借助“網(wǎng)絡(luò)瀏覽”組件,通過瀏覽器組件展示靜態(tài)圖表。
3 結(jié)束語
農(nóng)業(yè)物聯(lián)網(wǎng)移動監(jiān)控系統(tǒng)因?yàn)橐苿踊h(yuǎn)程控制的優(yōu)勢,成為新建的農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)的標(biāo)配。同時(shí),很多早期建設(shè)的農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng),也在做移動化升級。如何高效、低成本的開發(fā)一個(gè)實(shí)用性強(qiáng)的移動監(jiān)控應(yīng)用,是很多農(nóng)業(yè)企業(yè)最關(guān)心的問題。使用本文給出的核心開發(fā)技術(shù),農(nóng)業(yè)企業(yè)信息化從業(yè)人員也能開發(fā)出實(shí)用的農(nóng)業(yè)物聯(lián)網(wǎng)移動監(jiān)控系統(tǒng),節(jié)約農(nóng)業(yè)生產(chǎn)成本,從而助力鄉(xiāng)村振興。
參考文獻(xiàn):
[1] 趙春江.發(fā)展智慧農(nóng)業(yè) 建設(shè)數(shù)字鄉(xiāng)村[J].農(nóng)機(jī)科技推廣,2020(6):6-9.
[2] 億歐智庫.2018智慧農(nóng)業(yè)發(fā)展研究報(bào)告——新科技驅(qū)動農(nóng)業(yè)變革[EB/OL].[2020-04-08].https://www.iyiou.com/research/20180508555.
[3] 徐曉雨,張旭,朱勇.基于物聯(lián)網(wǎng)技術(shù)的智慧農(nóng)業(yè)監(jiān)控系統(tǒng)設(shè)計(jì)[J].信息記錄材料,2018,19(5):100-102.
[4] 王英杰,鄭明輝.基于物聯(lián)網(wǎng)技術(shù)的智慧農(nóng)業(yè)管理系統(tǒng)設(shè)計(jì)[J].福建農(nóng)業(yè)科技,2019(6):56-59.
[5] 劉劍英.基于Android的智能小車控制系統(tǒng)軟件設(shè)計(jì)與開發(fā)[J].軟件工程,2020,23(10):46-48.
【通聯(lián)編輯:謝媛媛】