趙華飛 徐踐 張娜

摘要? ? 為了方便對溫室環境的監控和控制,使用Netty網絡框架設計了一個農業物聯網服務器系統,能夠簡化物聯網服務器端的開發,實現下位機與上位機的實時通信。本文闡述了該系統的工作原理和總體設計,以期為實現大棚農作物生長的智能化和信息化管理。
關鍵詞? ? 農業物聯網;系統設計;Netty;數據庫
中圖分類號? ? S126? ? ? ? 文獻標識碼? ? A? ? ? ? 文章編號? ?1007-5739(2019)09-0254-02
Abstract? ? In order to facilitate the monitoring and control of the greenhouse environment,an agricultural Internet of things server system was designed using Netty network framework,which could simplify the development of the Internet of things server side and realize real-time communication between the sensor devices and the servers.This paper described the working principle and overall design of the system,in order to realize the intelligent and information management of greenhouse crop growth.
Key words? ? agricultural Internet of things;system design;Netty;database
當前,我國已是設施作物栽培第一大國,溫室承擔著生產各類蔬菜、花卉等任務[1]。在糧食安全日益重要的今天,提高溫室普及率和管理水平有助于我國糧食安全自主可控。由于溫室大棚不受外界氣候以及地域等因素的制約,是未來農作物種植的發展趨勢。大棚內的溫濕度、CO2濃度以及光照度等環境參數是影響農作物生長的主要因素[2]。因此,通過對大棚內環境參數和植物參數的采集,能夠做出有效決策,同時對溫室相關設備的控制能夠及時調節溫室環境參數,為植物生長提供適宜的環境條件。
目前,我國農業大棚作物生長管理主要以人工為主,工作量大且生產管理不精細。本文結合物聯網技術[3],設計了溫室環境監控系統,可對大棚內農作物生長進行遠程終端無線監控,實現大棚農作物生長的智能化和信息化管理,以期提高設施農業大棚農作物生產效率和農產品品質。
1? ? 系統工作原理
溫室環境監控系統采用Netty網絡框架作為底層框架。Netty是基于Java NIO的通信框架,具有高可用性、高擴展性和高可制定性等特性,已經在各大企業得到應用[4]。基于系統對用戶量并發的需要,由于傳統阻塞IO(Blocking IO,BIO)無法承受大量客戶端的并發連接,系統采用非阻塞IO(Non-blocking IO,NIO)進行高并發、高負載的開發[5]。NIO采用反應器(Reactor)模式,1個Reactor線程可聚合1個多路復用器Selector,可注冊、監聽和輪詢成千上萬個客戶端的連接[6]。
由于下位機設備一般都是低功耗、低內存、芯片級的設備,支持的網絡協議較為底層,同時,由于地理位置的原因,設備所處的網絡環境一般較差,因而不適合使用HTTP等高級協議傳輸數據。TCP/IP協議是面向連接的協議,支持雙向通信,采用此協議可以實時采集下位機的在線狀態,在下位機上報數據給服務器的同時,服務器也可以對下位機下發數據,實現遠程控制[7]。本系統使用Java語言和Netty網絡框架實現了上、下位機之間的通信過程。
2? ? 系統設計
2.1? ? 總體設計
本系統使用到的開源技術主要有Java語言、MySQL數據庫、Redis數據庫和Python語言。本系統主要分為2個模塊:WEB服務器部分和TCP服務器部分,由于物聯網應用主要在TCP服務器部分,現對TCP服務器介紹如下。本系統的總體設計如圖1所示。
2.2? ? 數據傳輸與處理
由圖1的流程可知,下位機連接并將數據發送給TCP服務器,TCP服務器收到數據后解析并將數據存入MySQL數據庫中,同時將設備的在線狀態寫入Redis數據庫中。用戶通過瀏覽器網頁可以從MySQL數據庫中查詢到下位機上報的數據,也可通過網頁發送指令給下位機,為了將指令正確地傳送到相應的下位機中,使用了Redis隊列保存指令數據,TCP服務器會檢查Redis隊列的狀態,如果隊列中有數據,則會讀取出并下發給指定的下位機。
Netty搭建服務端,僅需要綁定端口號、配置服務參數、啟動服務即可。下面的代碼就實現了一個服務端主程序。
TCP/IP協議是流式的數據傳輸協議,數據間是連續的,因而需要上位機和下位機定義并同時使用一種格式的數據定義。本次數據定義為:一是采用換行符作為2次數據之間間隔;二是采用逗號作為一次數據內部之間的間隔。
對于以上的需求,Netty已經有了內置的支持,在pipeline中添加按行的分割器即可,如下:
pipeline.addLast("framer",new DelimiterBasedFrameDeco
der(1024,Delimiters.lineDelimiter()));
如果有其他的數據切割需求,也可以添加自定義的分隔符。需要注意的是,此處的分隔符不能和數據可能出現的字符相同,否則會導致數據的完整性被破壞。對于數據內部的分隔,在獲取字符串數據之后對字符串自定義分隔即可。
為了方便記錄下位機的在線狀態和向指定的下位機發送指令,需要下位機的id和連接socket對應,在此使用同步哈希表ConcurrentHashMap,防止多線程同時修改數據導致數據錯誤。Netty的ChannelInboundHandler類提供了接入、離線、讀消息、寫消息的函數,只需要繼承這個類并重寫這些函數即可實現這些功能。channelActive函數在下位機接入時被調用,當下位機連接到服務器后就會觸發這個函數執行,在這個函數內部可以將連接的id和socket關系對應,方便后續對這個下位機連接的操作。channelInActive函數在下位機離線的時候被調用,在函數內部可以將哈希表中的此下位機的id對應關系刪除,以明確此下位機已經下線。Chan-nelRead函數在下位機發送數據時會被調用,在函數內部對數據進行解析、處理,最后將數據寫入MySQL數據庫中。
Redis(Remote Dictionary Server)基于遠程字典服務,是非關系型數據庫(Not Only SQL,NoSQL)產品之一,它支持網絡、key-value模型等存儲系統,可用作數據庫、高速緩存和消息隊列代理。其支持的存儲value類型包括string(字符串)、list(鏈表)、set(無序集合)、zset(sorted set有序集合)和hash(哈希表),也可將Redis看成一個內存數據結構服務器[8]。
為了方便數據在2個服務之間傳輸,使用了Redis數據庫作為消息系統,WEB服務和TCP服務可不用部署在同一個服務器上,只需這2個服務都可以都訪問Redis數據庫即可,提高了系統的擴展性、可用性和安全性。本系統使用了消息隊列list儲存對下位機的指令,使用哈希表hash存儲設備的在線狀態。本系統的list設計為一個先進先出的隊列,將按照寫入順序向下位機下發指令,Redis提供了一個阻塞讀取的功能(如brpop函數),使用此功能防止頻繁讀取隊列,當隊列中有數據寫入時,才會觸發。本系統需要記錄下位機的在線狀態,在Redis中可以使用普通的key-value格式記錄每個下位機的狀態,但若有大量的下位機需要管理時,就不便于操作,因而選擇hash結構來存儲這類數據。Hash 結構類似于普通的字符串key-value格式,但是其value是作為對象可以被訪問的,因而適合于存儲對象,比如有一個名為h_devices的hash,對象內部field為deivce_{id},value為在線狀態,其初始化或賦值key,field的命令為:HS-ET key field value,獲取指定key的field的命令為:HGET key field。
2.3? ? 數據展示
下位機和TCP服務器采集到了大量的數據,需要向用戶展示出來,因而本系統的WEB部分負責對用戶展示數據,提供控制下位機的按鈕,用戶不需要關注TCP服務器的存在,可以通過頁面的按鈕間接向下位機發送指令。現使用Python語言和Django框架開發了一個數據展示頁面,用戶可以查看各個下位機上報的數據,也可對下位機進行指令下發。數據展示頁面如圖2所示。
3? ? 結語
通過對農業物聯網需求和技術的學習和梳理,設計和開發了一個輕量級的農業物聯網服務器系統,能夠實現下位機的快速接入,由于采用支持長連接和雙向通信的TCP/IP協議,本系統可以實時與下位機進行通信,提高了對溫室的控制效率。本系統具有很強的可擴展性,只要是使用相同的數據格式定義,就可以接入本系統。對于其他的數據格式定義,本系統也僅需簡單修改數據解析的代碼就可以支持。
4? ? 參考文獻
[1] 何麗虹.我國設施園藝栽培面積已突破210萬公頃[EB/OL].(2002-06-26)[2018-09-15].http://www.amic.agri.gov.cn/nxtwebfreamwork/html/0/1788.htm.
[2] 熊松.基于物聯網技術的農業大棚智能管理研究[J].天津科技,2017,44(6):78-80.
[3] 劉海泉,楊盛泉,黃姝娟,等.基于物聯網技術的溫室大棚測量與控制系統的設計[J].價值工程,2017(6):108-110.
[4] 魏瑩.基于Netty框架的智能終端與服務器通信的研究[D].西安:西安電子科技大學,2017.
[5] 李林峰.Netty權威指南[M].北京:電子工業出版社,2014:11-45.
[6] 代超,鄧中亮.基于Netty的面向移動終端的推送服務設計[J].軟件,2015(12):1-4.
[7] W.RichardStevens.TCP/IP協議詳解[M].北京:機械工業出版社,2000.
[8] 梅玉娜,馮東,李展,等.基于Redis的網絡大學平臺性能優化研究[J].電力信息與通信技術,2016,14(12):112-115.
基金項目? ?糧經作物產業技術體系北京市創新團隊(BAIC09-2018)。
作者簡介? ?趙華飛(1990-),男,云南大理人,在讀碩士研究生。研究方向:農業信息化。
*通信作者
收稿日期? ?2019-01-10