盛平+丁波
摘 要:針對智能溫室發(fā)展現(xiàn)狀,引入了跨平臺、易擴(kuò)展的思想,將WebSocket通信協(xié)議應(yīng)用到嵌入式設(shè)備通信中,結(jié)合嵌入式、Zigbee無線傳輸、傳感器采集等技術(shù),設(shè)計了一套基于WebSocket協(xié)議的智能溫室測控系統(tǒng)。一方面能夠簡化系統(tǒng)開發(fā)、克服傳統(tǒng)B/S架構(gòu)不能提供長連接的TCP雙向通信和C/S架構(gòu)開發(fā)周期長、無法跨平臺等缺點(diǎn);另一方面,用戶可以實(shí)時查看溫室環(huán)境、設(shè)備運(yùn)行狀況以及實(shí)時控制情況等,并且能夠獲得實(shí)時溫室預(yù)警等推送。實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)運(yùn)行穩(wěn)定、使用便捷,很好地滿足了溫室實(shí)時測控的功能需求。
關(guān)鍵詞關(guān)鍵詞:智能溫室;物聯(lián)網(wǎng);WebSocket;嵌入式;實(shí)時測控
DOIDOI:10.11907/rjdk.161620
中圖分類號:TP319
文獻(xiàn)標(biāo)識碼:A 文章編號:1672-7800(2016)008-0065-04
0 引言
隨著物聯(lián)網(wǎng)技術(shù)的日益普及,各式物聯(lián)網(wǎng)產(chǎn)品應(yīng)用于衣食住行等各個領(lǐng)域,為人們的日常生活提供了極大便利。同樣,在智能農(nóng)業(yè)領(lǐng)域也廣泛地應(yīng)用了物聯(lián)網(wǎng)技術(shù),這些應(yīng)用使農(nóng)業(yè)種植變得更加簡便、高效和科學(xué)。但目前這些應(yīng)用系統(tǒng)的整體通信架構(gòu)一般是基于C/S架構(gòu)或傳統(tǒng)B/S架構(gòu)設(shè)計的,基于C/S架構(gòu)的應(yīng)用系統(tǒng)具有系統(tǒng)設(shè)計復(fù)雜、開發(fā)周期長、無法跨平臺等缺陷;基于傳統(tǒng)B/S架構(gòu)的應(yīng)用系統(tǒng)雖然能夠跨平臺,但它是基于HTTP協(xié)議進(jìn)行通信的,并不能提供一個長連接的TCP雙向通信機(jī)制。而WebSocket作為HTML5的一種新協(xié)議日趨標(biāo)準(zhǔn)化,它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信,在生活中得到了廣泛應(yīng)用,如新浪微博的評論、私信通知和騰訊的WebQQ等。本文將該協(xié)議應(yīng)用到嵌入式應(yīng)用系統(tǒng)中,使嵌入式設(shè)備與服務(wù)器之間能夠基于WebSocket協(xié)議進(jìn)行通信,以克服傳統(tǒng)通信架構(gòu)的缺陷[1]。
1 系統(tǒng)整體設(shè)計
本文設(shè)計了一個基于WebSocket協(xié)議的智能溫室控制系統(tǒng),該智能溫室測控系統(tǒng)通過綜合管理系統(tǒng)實(shí)現(xiàn)溫室大棚的自動監(jiān)測,其中包括溫室內(nèi)溫濕度、光照度、溫室通風(fēng)換氣系統(tǒng)等。如圖1所示,該系統(tǒng)總體分為環(huán)境感知層、物理控制層和應(yīng)用層3部分。
(1) 在環(huán)境感知層,依靠一系列傳感器精準(zhǔn)采集溫室內(nèi)部和室外的環(huán)境數(shù)據(jù),通過Zigbee網(wǎng)絡(luò)傳輸給Zigbee中繼節(jié)點(diǎn),中繼節(jié)點(diǎn)再通過RS232/485接口傳輸給嵌入式計算機(jī)。
(2) 在物理控制層,光耦繼電器通過RS232/485接口與嵌入式計算機(jī)連接,接收基于MODEBUS-RTU協(xié)議的控制指令,控制溫室設(shè)備控制柜內(nèi)的交流接觸器,進(jìn)而控制各個溫室設(shè)備(如濕簾風(fēng)機(jī)、水泵、遮陽簾、環(huán)流風(fēng)機(jī)等)。
(3) 在應(yīng)用層,主要分為嵌入式端應(yīng)用模塊、Web管理系統(tǒng)和服務(wù)器端應(yīng)用模塊。嵌入式端應(yīng)用模塊實(shí)現(xiàn)了基于WebSocket協(xié)議與服務(wù)器的通信、解析控制協(xié)議、上傳環(huán)境數(shù)據(jù)、自動運(yùn)行等功能;Web管理系統(tǒng)實(shí)現(xiàn)了用戶通過瀏覽器實(shí)時管理溫室的功能;服務(wù)器端應(yīng)用模塊實(shí)現(xiàn)了WebSocket客戶端的連接請求、客戶端之間的通信以及數(shù)據(jù)的解析、存儲等。
通過以上幾部分的相互協(xié)作實(shí)現(xiàn)了一個完整的智能溫室測控系統(tǒng),用戶可以通過手機(jī)、PC、Pad等設(shè)備的Web瀏覽器實(shí)時查看溫室的環(huán)境數(shù)據(jù)、設(shè)備運(yùn)行狀況和設(shè)置溫室運(yùn)行參數(shù)等。
2 系統(tǒng)感知層
系統(tǒng)感知層是整個系統(tǒng)的基礎(chǔ),其作用相當(dāng)于人的五官,主要包括兩部分:溫室內(nèi)部三合一傳感器和室外氣象站。系統(tǒng)感知層可通過兩部分的傳感器獲取更加精準(zhǔn)的溫室內(nèi)外環(huán)境狀況,以達(dá)到更有效地控制操作和進(jìn)行溫室種植研究的目的。
另外,從簡化安裝、便于維護(hù)等方面考慮,本系統(tǒng)采用Zigbee無線技術(shù),將采集的環(huán)境數(shù)據(jù)集中傳輸?shù)角度胧接嬎銠C(jī)中。
2.1 傳感器采集模塊
該系統(tǒng)中的傳感器模塊[2,3]統(tǒng)一采用MODBUS-RTU通信協(xié)議[4],設(shè)備操作和回復(fù)都為16進(jìn)制數(shù)據(jù),默認(rèn)通信波特率為:9600,8,n,1,基本通信格式為:
【設(shè)備地址】【功能碼】【起始地址:2字節(jié)】【數(shù)據(jù)長度:2字節(jié)】【CRC16校驗(yàn)】
傳感器讀取、解析和發(fā)送的實(shí)現(xiàn)流程如圖2所示。首先,創(chuàng)建一個線程,打開指定串口(傳感器通過485網(wǎng)絡(luò)總線形式連接到串口)并監(jiān)聽該串口,程序每隔60秒發(fā)送傳感器查詢指令,對監(jiān)聽串口接收的傳感器反饋數(shù)據(jù)進(jìn)行數(shù)據(jù)解析;接下來判斷解析數(shù)據(jù)是否正常,如果不正常則丟棄,如果正常則存儲下來進(jìn)行CRC校驗(yàn);最后將CRC校驗(yàn)[5]后的數(shù)據(jù)發(fā)送到LED顯示器上進(jìn)行顯示。具體代碼實(shí)現(xiàn)如下:
int pthread_create(&threadSensor,NULL,WriteSensor,NULL); //創(chuàng)建線程,并綁定傳感器讀取函數(shù)
void *WriteSensor(); //傳感器讀取函數(shù),間隔60秒查詢傳感器
int optOpen(int fd,int port); //打開指定串口
int optSet(int fd,int nSpeed,int nBits,char nEvent,int nStop); //設(shè)置串口的相應(yīng)參數(shù),如串口文件描述符、串口波特率、數(shù)據(jù)流控制、數(shù)據(jù)位、停止位和校驗(yàn)類型等
int SelectRead(int fd,char rev[50],int length); //利用I/O select模型進(jìn)行串口讀取,將接收到的數(shù)據(jù)進(jìn)行解析,判斷數(shù)據(jù)是否正常[6]
unsigned short CRC16(unsigned char *pushMsg,unsigned short usDataLen); //根據(jù)CRC16校驗(yàn)算法進(jìn)行CRC校驗(yàn)
2.2 Zigbee通信模塊
Zigbee節(jié)點(diǎn)數(shù)據(jù)采集系統(tǒng)主要由兩部分組成[7,8],分別為數(shù)據(jù)中心和數(shù)據(jù)采集設(shè)備。其數(shù)據(jù)中心為中心主站,連接用戶PC或嵌入式系統(tǒng),用于接收數(shù)據(jù);數(shù)據(jù)采集設(shè)備用于數(shù)據(jù)采集。如圖3所示,該系統(tǒng)中的Zigbee節(jié)點(diǎn)采用星型網(wǎng)組網(wǎng)形式,其數(shù)據(jù)通訊流程為:電腦(或嵌入式系統(tǒng))發(fā)送IO控制命令→中心主站→中繼路由→目標(biāo)采集設(shè)備→IO狀態(tài)響應(yīng)→中繼路由→中心主站→電腦(或嵌入式系統(tǒng))。
3 系統(tǒng)控制層
控制層模塊主要使用16路無源光耦繼電器,通過RS232/485串口與嵌入式計算機(jī)進(jìn)行通信。通信協(xié)議是標(biāo)準(zhǔn)的MODBUS-RTU協(xié)議。該繼電器工作模式為本機(jī)非鎖聯(lián)動模式,在該模式下,輸入光耦與繼電器直接聯(lián)動,即:光耦輸入信號生效→對應(yīng)繼電器吸合;光耦輸入信號取消→對應(yīng)繼電器斷開。通過該模式,確保了溫室設(shè)備的準(zhǔn)確運(yùn)行,并能獲取設(shè)備的實(shí)時運(yùn)行狀況。
4 系統(tǒng)應(yīng)用層
該系統(tǒng)軟件模塊主要分為3部分:嵌入式應(yīng)用模塊、Web管理系統(tǒng)和服務(wù)器端應(yīng)用模塊。
4.1 嵌入式應(yīng)用模塊
嵌入式應(yīng)用模塊主要實(shí)現(xiàn)基于WebSocket協(xié)議建立通信、指令解析和數(shù)據(jù)封裝、自動運(yùn)行等功能,如圖4所示。
為了實(shí)現(xiàn)嵌入式客戶端與服務(wù)器進(jìn)行WebSocket通信,該系統(tǒng)引用了開源項(xiàng)目libwebsockets。libwebsockets是一個輕量級的純C庫建成的項(xiàng)目。通過libwebsockets提供的API與服務(wù)器進(jìn)行通信,并完成對接收數(shù)據(jù)的解析和上傳數(shù)據(jù)的封裝,具體實(shí)現(xiàn)代碼如下:
struct lws* lws_client_connnect_via_info(struct lws_client_connect_info *i)
//通過該函數(shù)創(chuàng)建一個到目的服務(wù)器的連接,形參i是指向結(jié)構(gòu)體lws_client_connect_info的指針
callbackRecv(struct lws *wsi, enum lws_callback_reasons reason,void *user,void *in,size_t len); //通過自定義的回調(diào)函數(shù)接收來自服務(wù)器的消息
4.2 Web管理系統(tǒng)
由于本系統(tǒng)需要通過Web瀏覽器查看溫室的實(shí)時運(yùn)行狀況,比如當(dāng)前的光、溫、濕等環(huán)境數(shù)據(jù)、溫室內(nèi)設(shè)備的運(yùn)轉(zhuǎn)情況,并控制溫室內(nèi)相關(guān)設(shè)備等,對于該功能模塊的實(shí)現(xiàn),系統(tǒng)采用JavaScript[9]提供的WebSocket API完成與服務(wù)器的實(shí)時通信。首次訪問該視圖時觸發(fā)JavaScript的onload函數(shù),判斷當(dāng)前瀏覽器是否支持WebSocket協(xié)議并創(chuàng)建WebSocket對象;當(dāng)WebSocket連接上后觸發(fā)調(diào)用onopen事件處理程序,從Seesion中獲取用戶名等信息并發(fā)送到WebSocket服務(wù)器進(jìn)行注冊;接下來通過方法send和事件處理程序onmessage即可實(shí)現(xiàn)[10]雙通道通信。具體代碼實(shí)現(xiàn)如下:
var ws=new WebSocket(“ws://xxx.xxx.xxx.xxx:9001”); //創(chuàng)建一個WebSocket實(shí)例
ws.onpen=function(evt){ ws.send(); }; //為該實(shí)例綁定onopen事件
ws.onerror = function(evt) { }; //為該實(shí)例綁定onerror事件
ws.onmessage = function(evt) { }; //為該實(shí)例綁定onmessage事件,處理數(shù)據(jù)接收
ws.onclose = function(evt) { }; //當(dāng)瀏覽器接收到服務(wù)器端發(fā)送的關(guān)閉連接請求時,觸發(fā)onclose事件
4.3 服務(wù)器端應(yīng)用模塊
服務(wù)器端應(yīng)用模塊是基于.NET4.5 Freamwork[11,12],并引用SuperWebSocket開源框架實(shí)現(xiàn)的,主要功能是接收WebSocket客戶端的連接,處理WebSocket客戶端之間的通信以及相關(guān)數(shù)據(jù)的存儲,用于建立WebSocket監(jiān)聽端口,以及客戶端連接、斷開、信息接收等觸發(fā)事件,具體實(shí)現(xiàn)如下:
protected override void Onstart(string[]args)
{
var ip=ConfigurationManager.AppSettings[“APWebSocketIP”];
var port=ConfigurationManager.AppSettings[“APWebSocketPort”];
server=new WebSocket(); //創(chuàng)建WebSocket對象
if(!server.SetUp(ip,int.Parse(port))) //設(shè)置監(jiān)聽端口,并啟動服務(wù)器應(yīng)用
return;
server.NewSessionConnected+=server_NewSessionConnected; //新的會話連接
server.SessionClosed+=server_SessionClosed; //會話斷開
server.NewMessageReceived+=server_NewMessageReceived; //接收到新信息
}
4.4 系統(tǒng)測試
本系統(tǒng)測試主要是通過手機(jī)/Pad/PC瀏覽器查看溫室的實(shí)時運(yùn)行狀況,以及能否正常控制溫室設(shè)備并設(shè)置設(shè)備溫室運(yùn)行參數(shù)等。如圖5所示,通過手機(jī)瀏覽器登錄溫室Web管理系統(tǒng)進(jìn)行實(shí)時控制和查看。經(jīng)測試,本系統(tǒng)功能完備、運(yùn)行穩(wěn)定。
5 結(jié)語
本文通過分析傳統(tǒng)B/S和C/S應(yīng)用架構(gòu)的不足,并詳細(xì)研究了WebSocket協(xié)議的特性,設(shè)計了一套基于WebSocket協(xié)議的智能溫室測控系統(tǒng)。該系統(tǒng)將WebSocket協(xié)議應(yīng)用到嵌入式開發(fā)中,實(shí)現(xiàn)了嵌入式設(shè)備與服務(wù)器的實(shí)時通信。用戶只需利用App/PC/Pad等設(shè)備的Web瀏覽器即能實(shí)時查看溫室設(shè)備狀況、控制溫室設(shè)備運(yùn)行并設(shè)定運(yùn)行參數(shù)等,達(dá)到了很好的跨平臺運(yùn)行效果,具有較高的應(yīng)用參考價值。
參考文獻(xiàn):
[1]李代立,陳榕.WebSocket在Web實(shí)時通信領(lǐng)域的研究[J].電腦知識與技術(shù),2010(10):7923-7925,7935.
[2]趙秀珍,王乃釗,毛文華.光照度、空氣溫/濕度傳感器的研究和實(shí)驗(yàn)[J].中國儀器儀表,2002(1):29-31,36.
[3]廖澤鑫.溫度傳感器的設(shè)計與研究[D].上海:復(fù)旦大學(xué),2012.
[4]舒凱.基于MODBUS-RTU協(xié)議的PLC多路數(shù)據(jù)采集系統(tǒng)[J].水電自動化與大壩監(jiān)測,2008(2):66-69.
[5]常曉明,潘衛(wèi)華,王建東.CRC校驗(yàn)及其軟件實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,1995(6):14-23.
[6]陳文武.分布式鎖技術(shù)研究[D].廣州:華南理工大學(xué),2013.
[7]王朝霞.ZigBee無線傳感器網(wǎng)絡(luò)節(jié)點(diǎn)硬件與組網(wǎng)協(xié)議設(shè)計[D].呼和浩特:內(nèi)蒙古大學(xué),2011.
[8]穆嘉松.基于節(jié)點(diǎn)移動性的ZigBee網(wǎng)絡(luò)自適應(yīng)路由策略研究[D].天津:天津大學(xué),2012.
[9]鄭強(qiáng).Web服務(wù)器推送技術(shù)的設(shè)計與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2013.
[10]楊小嬌.輕量級高并發(fā)Web服務(wù)器的研究與實(shí)現(xiàn)[D].南京:南京郵電大學(xué),2014.
[11]史建江,李世銀,黃興,等.基于ASP.NET的信息管理系統(tǒng)設(shè)計與實(shí)現(xiàn)[J].微計算機(jī)信息,2008(6):32-33,54.
[12]余建華,蔡瑞英,方壽海.使用C#中線程同步、事件及異步委托機(jī)制實(shí)現(xiàn)定單模式[J].計算機(jī)應(yīng)用與軟件,2006(7):142-144.
(責(zé)任編輯:黃 ?。?