肖微,孫亞新
(常熟理工學院a.計算機科學與工程學院;b.電氣與自動化工程學院,江蘇常熟215500)
增氧泵自動控制系統(tǒng)通信協(xié)議的設計與實現(xiàn)
肖微a,孫亞新b
(常熟理工學院a.計算機科學與工程學院;b.電氣與自動化工程學院,江蘇常熟215500)
結合應用層協(xié)議設計與實現(xiàn)中常見的問題,給出了增氧泵自動控制系統(tǒng)通信協(xié)議的設計方案,在此基礎上提出了增氧泵自動控制系統(tǒng)通信協(xié)議的制定方法.該方法建立在TCP/IP通信技術基礎上,能夠有效地實現(xiàn)增氧泵控制箱與服務器間的通信.
應用層協(xié)議;網(wǎng)絡編程;同步通信;異步通信
現(xiàn)代計算機網(wǎng)絡編程技術源于伯克利套接字技術[1].該技術提供了以C語言為基礎,基于Unix平臺的用于進程間通信的接口.通過TCP/IP和套接字實現(xiàn)自定義應用層通信協(xié)議,能夠有效的實現(xiàn)數(shù)據(jù)的可靠傳輸.通信協(xié)議精確地定義了雙方通信控制信息和解釋信息[2].進程雙方以服務器與客戶端的方式進行通信.通信雙方通過IP地址與通信端口進行鑒定,進而實現(xiàn)鏈接的建立、維護、關閉以及消息的傳輸.與人類對話相似,為了完成特定的功能,通信雙方必須使用相同的“語言”——應用層協(xié)議.應用層協(xié)議規(guī)定了接送的消息內(nèi)容的實際含義.應用層協(xié)議指定的好壞不僅關系到網(wǎng)絡帶寬的占用,報文解析代碼的繁簡,還關系到通信安全性,它直接決定著一個項目的質量.對于一個實際的項目而言,掌握如何設計應用層協(xié)議以及如何實現(xiàn)給定的應用層協(xié)議具有重要的意義.
在淡水漁業(yè)養(yǎng)殖中必須確保水中的溶氧度達到一定的指標,否則容易引起魚因缺氧而死亡,因而必須保證增氧泵在水溶氧度低于臨界值時處于啟動狀態(tài).傳統(tǒng)作業(yè)中,農(nóng)戶必須定時打開增氧泵,盡管這項工作的工作強度不大,但由于工作人員晚上無法正常休息,因而非常耗費精力.
為了改進農(nóng)戶的生活質量,常熟市智勝信息技術有限公司聯(lián)合常熟理工學院計算機科學與工程學院物聯(lián)網(wǎng)工程項目組,開發(fā)了一款智能魚塘增氧泵控制系統(tǒng).該系統(tǒng)通過傳感器檢測水中溶氧度的值,自動控制增氧泵的開啟與關閉,并將數(shù)據(jù)上傳服務器.用戶可以遠程查看水溶氧度與增氧泵狀態(tài)的變化過程,也可以人工遠程控制增氧泵的狀態(tài).為了達到前述功能,在系統(tǒng)運行過程中,需要增氧泵控制箱中的單片機與遠程服務器保持實時通信.為實現(xiàn)控制箱與服務器間的消息傳送,需要設計一個應用層協(xié)議.
應用層協(xié)議的制定既要考慮到消息的語言表達也應考慮到通信節(jié)點對消息完整性、正確性的驗證.此外協(xié)議的制定應當充分考慮到開發(fā)人員的實現(xiàn)難度.
1.1消息完整性定義
套接字是計算機網(wǎng)絡編程的核心和基礎.計算機網(wǎng)絡通信中,客戶端與服務端所扮演的角色不同,因而套接字在客戶端與服務器端的使用方法有所不同.服務端的IP地址以及通信端口在通信前對客戶端公開.服務啟動后,服務端程序在通信端口偵聽客戶端發(fā)出的鏈接請求.當客戶端向服務端IP地址與特定通信端口發(fā)出鏈接請求后,服務端接受鏈接請求,并在服務端維護一個到該通信端口的套接.此后,雙方便建立了計算機網(wǎng)絡上的虛鏈接[3,4].在鏈接套接字關閉前,通信雙方可以通過網(wǎng)絡流的形式來進行消息的收發(fā).
由于計算機網(wǎng)絡中通信雙方的鏈接是通過路由器的中轉所完成的虛鏈接,而路由器同時服務于不同的通信鏈接,因此計算機通信的雙方的“發(fā)送”與“接收”不存在一一對應的關系.增氧泵控制箱中的單片機與遠程服務器的通信中,接收方在進行消息解析前必須確保所接收到的數(shù)據(jù)是完整和正確的.
有兩種常用的技術方法可以用來驗證協(xié)議中消息的完整性.第一種方法可以在消息的頭部規(guī)定固定長度的字節(jié)用來描述該消息的總長度或剩余長度.當消息接收端接收到足夠長度的字節(jié)后,可以確認所收數(shù)據(jù)為完整,從而開始校驗與解析工作;第二種方法將一個特殊字節(jié)(如0x0D)放置到消息的最后,當消息接收方接受的最后一個字節(jié)為規(guī)定的特殊字節(jié)時,便可判定所收數(shù)據(jù)為完整,否則將所收包裹進行緩存,繼續(xù)接收剩余數(shù)據(jù)[5,6].
采用頭部描述消息長度的方式進行完整性驗證具有通用性,可以適應不同的情況.然而當消息長度較大時,必須使用多個字節(jié)定義消息的長度,此時必須規(guī)定長度數(shù)據(jù)的編碼方式(大端方式或小端方式);此外對于開發(fā)人員來講實現(xiàn)這種完整性定義的協(xié)議相對較為困難.
采用尾部特征字節(jié)的方式進行完整性驗證對于開發(fā)人員來講實現(xiàn)起來較為容易(只需對每次接收到的數(shù)據(jù)的最后一位進行檢查即可).然而,協(xié)議制定者必須確保完整性驗證字節(jié)不出現(xiàn)在消息的其它部分,否則消息的完整性驗證將無效.
增氧泵控制系統(tǒng)應用層協(xié)議中采用0x0D字節(jié)作為消息結束位以保證消息的完整性.
1.2消息的正確性檢測
為了確保所接收的數(shù)據(jù)是發(fā)送方所發(fā)送的原始數(shù)據(jù),在應用層協(xié)議制定時經(jīng)常采用數(shù)據(jù)校驗技術來對接收到的數(shù)據(jù)進行校驗.通常校驗位的計算建立在數(shù)學方法的基礎之上,如CRC校驗、異或校驗等[7].
當頭部字節(jié)規(guī)定數(shù)據(jù)長度時,校驗數(shù)據(jù)會放置到數(shù)據(jù)的最后;當結尾完整性校驗字節(jié)被采納時,校驗數(shù)據(jù)會被放置到完整性校驗字節(jié)前面相鄰的位置.
由于校驗數(shù)據(jù)是通過消息中原始數(shù)據(jù)計算得出,因此在采用結尾完整性校驗技術時有可能出現(xiàn)正確性校驗數(shù)據(jù)中含有完整性校驗字節(jié)的情況.此時如果不做任何技術處理就會出現(xiàn)消息解析錯誤.為了正確地解析消息,增氧泵控制系統(tǒng)應用層協(xié)議中采用字節(jié)替換的方式來解決完整性校驗位與正確性校驗位沖突的問題.如:以0x0D作為完整性校驗字節(jié),當正確性校驗數(shù)據(jù)中出現(xiàn)0x0D字節(jié)時可以規(guī)定以0x20進行替換.
1.3消息體中字段的定義
應用層通信協(xié)議用于規(guī)定通信雙方所發(fā)送/接收消息的功能性語意,換言之,應用層協(xié)議規(guī)定了期待對方發(fā)送的數(shù)據(jù)的具體格式,消息的組織方式等細節(jié).
常見的協(xié)議組織方式有兩種:第一種直接規(guī)定了消息中每一字節(jié)(或bit這種情況較少見)的取值范圍和對應含義;第二種將消息的定義建立在字符串基礎之上,這時通信協(xié)議中規(guī)定了協(xié)議軀干所采用的編碼方式(通常為標準編碼),并在此基礎之上規(guī)定如何用字符串來表達消息的具體內(nèi)容.第一種協(xié)議更為緊湊但實現(xiàn)時的開發(fā)任務相對繁重;第二種協(xié)議用于建立在字符串的基礎上,因而完成相同功能所耗費的字節(jié)數(shù)較多,但由于大多數(shù)語言或平臺都有針對字符串的強大支持,因此系統(tǒng)實現(xiàn)較為方便快捷.
應用層協(xié)議的軀干部分可以看作將結構體中的數(shù)據(jù)進行串行化的表達.當消息中所有字段都有固定的長度時,可以用定長的字節(jié)來規(guī)定特定的字段.當某些字段無法預知其長度時,應用層協(xié)議中需要規(guī)定字段標識和字段分隔符.通常在一個應用協(xié)議中,當存在定長字段與不定長字段時,建議將定長字段集中放置在消息的前部,而不定長字段放置于消息的后部,這樣的定義便于協(xié)議解析程序的實現(xiàn).
2.1通信協(xié)議框架
根據(jù)1中所描述的設計方案,增氧泵控制系統(tǒng)應用層協(xié)議格式設置如下:
由于控制箱與服務器間通過中國移動的通信網(wǎng)關進行交互,為區(qū)分本協(xié)議與AT命令,本協(xié)議的所有數(shù)據(jù)包前統(tǒng)一加入消息頭0x24($).
消息頭代表通信雙方所發(fā)消息的鑒定值;數(shù)據(jù)段用于所傳輸?shù)臄?shù)據(jù)或命令;校驗位為從消息頭(包括消息頭)到數(shù)據(jù)段結束按字節(jié)亦或運算所得到的一個字節(jié)的校驗位,用于驗證信息在傳輸中是否存在通信錯誤(或被篡改);結束符在本協(xié)議中固定為0x13(CR),用于判斷所接收的消息是否完整.根據(jù)本文2.2中的原則,當驗證字節(jié)的計算結果為0x13時,將其值修改為0x20.
以該協(xié)議中的心跳包消息對為例,該消息對包含從水泵控制箱向服務器返送的消息(消息編號003)和從服務器返回的確認消息,消息內(nèi)容如下:
心跳包$<003><16字節(jié)控制芯片ID><checksum><CR>
心跳包確認$<004><16字節(jié)控制芯片ID><|><節(jié)點ID列表><checksum><CR>
該消息對中除上述描述的協(xié)議頭、消息頭、checksum以及結束位CR外,還包括了16字節(jié)控制箱芯片ID號和返回消息中的傳感器節(jié)點芯片ID列表(一個控制箱可以鏈接多個傳感器).控制節(jié)點間以‘|'進行分割可以方便通過split方法進行消息解析.
2.2消息同步機制
增氧泵控制系統(tǒng)通信雙方采用標準的客戶端服務器消息同步機制,連接的建立以及周期性心跳包的起始由增氧泵控制箱(客戶端)完成;當連接建立后客戶端和服務器均可發(fā)起消息對應答.每個消息對由一個發(fā)送消息和一個與之對應的答復消息構成.根據(jù)消息對的發(fā)起方不同可以將消息對分為兩類:第一類消息對由控制箱(客戶端)發(fā)起,服務器負責應答;第二類消息對由服務器發(fā)起,控制箱負責應答.
圖1 系統(tǒng)流程
第一類消息對消息頭小于等于“499”,第二類消息對消息頭大于等于“500”.客戶端發(fā)送消息的消息頭為奇數(shù);服務器端發(fā)送消息的消息頭為偶數(shù).
2.3系統(tǒng)流程設計
由于該系統(tǒng)采用TCP長連接,服務端與客戶端均能發(fā)起消息對,因而在系統(tǒng)的設計中要求通過異步的方式進行消息的接收,以達到事件觸發(fā)的效果.系統(tǒng)流程如圖1所示.
系統(tǒng)啟動后,首先從配置文件中讀取配置信息并根據(jù)配置數(shù)據(jù)對系統(tǒng)初始化,然后進行TCP鏈接(客戶端與服務器在此過程中實現(xiàn)邏輯有所差異見參考文獻[1]中對此的描述).
當TCP連接建立后,系統(tǒng)開始偵聽系統(tǒng)觸發(fā)事件.系統(tǒng)觸發(fā)事件由系統(tǒng)業(yè)務層決定,如數(shù)據(jù)庫中的數(shù)據(jù)滿足觸發(fā)條件,系統(tǒng)狀態(tài)信息滿足觸發(fā)條件等.當系統(tǒng)觸發(fā)事件發(fā)生后,系統(tǒng)向通信方發(fā)送消息并處理應對消息,此后系統(tǒng)重新開始偵聽系統(tǒng)觸發(fā)事件;當系統(tǒng)中沒有觸發(fā)事件時,系統(tǒng)持續(xù)接收通信方消息直至接收到完整的消息并對之解析與應答后,系統(tǒng)重新開始偵聽系統(tǒng)觸發(fā)事件.
按照本文所提出的協(xié)議制定方法,常熟理工學院物聯(lián)網(wǎng)工程項目組與常熟市智勝信息技術有限公司聯(lián)合開發(fā)了智能增氧泵控制系統(tǒng).目前該產(chǎn)品已應用于常熟市小山基地、張家港鴻屹水產(chǎn)養(yǎng)殖有限公司,已分別經(jīng)過2年和1年的運行,目前系統(tǒng)運行穩(wěn)定,達到了預期要求.
[1]王榕,許磊,樊宇濤.VxWorks下基于BSDsocket的網(wǎng)絡通信[J].電腦編程技巧與維護,2006(08):77-80.
[2]魯士文.計算機網(wǎng)絡協(xié)議和實現(xiàn)技術[M].北京:清華大學出版社,2000:21.
[3]許銳炮.Socket在C#程序中的應用[J].科技視界,2014(21):64.
[4]李軍,倪宏,陳君,等.一種應用層協(xié)議解析加速算法[J].四川大學學報(工程科學版),2014(04):14.
[5]李鵬飛,馬恒太,侯玉文,等.移動代理完整性協(xié)議形式化分析方法研究[J].電子學報,2009,37(8):1669-1674.
[6]艾祝.基于ISCSI的數(shù)據(jù)完整性研究與實現(xiàn)[D].蘭州:蘭州大學,2014.
[7]楊超,張偉哲,張宏莉,等.基于檢查點算法的網(wǎng)絡計算機容錯機制研究[J].微電子學與計算機,2006,23(9):82-84.
Design and Implementation of Communication Protocol of Oxygen Pump Controllingsystem
XIAO Weia,SUN Yaxinb
(a.School of Computerscience and Engineering;b.School of Electric and Automatic Engineering,Changshu Institute of Technology,Changshu 215500,China)
It is effective to improve aquaculture technology and automation level of aquatic products by oxygen pump controllingsystem.Pond water oxygen lack willseriously affect the growth of aquatic products,and even cause death.At thesame time,over-aeration will cause unnecessary waste.Thus the oxygen pump automatic controlsystem undertakes communication tasks in thestate of emergency.Considering common problems on the application layer protocol design and implementation,the paper gives the communication protocol design of the oxygen pump automatic controlsystem,and on the basis of it,a method is presented for designing communication protocol applied on oxygen pump controllingsystem.Based on TCP/IP communication technology,this method can effectively achieve the communication between the oxygen pump control box andservers.
application protocol;network programming;synchronous communication;asynchronous communication
TP311
A
1008-2794(2015)04-0085-04
2016-04-10
肖微,助教,碩士,研究方向:物聯(lián)網(wǎng)應用,E-mail:Xiaowei@cslg.cn.