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