肖微,孙亚新
(常熟理工学院a.计算机科学与工程学院;b.电气与自动化工程学院,江苏常熟215500)
增氧泵自动控制系统通信协议的设计与实现
肖微a,孙亚新b
(常熟理工学院a.计算机科学与工程学院;b.电气与自动化工程学院,江苏常熟215500)
结合应用层协议设计与实现中常见的问题,给出了增氧泵自动控制系统通信协议的设计方案,在此基础上提出了增氧泵自动控制系统通信协议的制定方法.该方法建立在TCP/IP通信技术基础上,能够有效地实现增氧泵控制箱与服务器间的通信.
应用层协议;网络编程;同步通信;异步通信
现代计算机网络编程技术源于伯克利套接字技术[1].该技术提供了以C语言为基础,基于Unix平台的用于进程间通信的接口.通过TCP/IP和套接字实现自定义应用层通信协议,能够有效的实现数据的可靠传输.通信协议精确地定义了双方通信控制信息和解释信息[2].进程双方以服务器与客户端的方式进行通信.通信双方通过IP地址与通信端口进行鉴定,进而实现链接的建立、维护、关闭以及消息的传输.与人类对话相似,为了完成特定的功能,通信双方必须使用相同的“语言”——应用层协议.应用层协议规定了接送的消息内容的实际含义.应用层协议指定的好坏不仅关系到网络带宽的占用,报文解析代码的繁简,还关系到通信安全性,它直接决定着一个项目的质量.对于一个实际的项目而言,掌握如何设计应用层协议以及如何实现给定的应用层协议具有重要的意义.
在淡水渔业养殖中必须确保水中的溶氧度达到一定的指标,否则容易引起鱼因缺氧而死亡,因而必须保证增氧泵在水溶氧度低于临界值时处于启动状态.传统作业中,农户必须定时打开增氧泵,尽管这项工作的工作强度不大,但由于工作人员晚上无法正常休息,因而非常耗费精力.
为了改进农户的生活质量,常熟市智胜信息技术有限公司联合常熟理工学院计算机科学与工程学院物联网工程项目组,开发了一款智能鱼塘增氧泵控制系统.该系统通过传感器检测水中溶氧度的值,自动控制增氧泵的开启与关闭,并将数据上传服务器.用户可以远程查看水溶氧度与增氧泵状态的变化过程,也可以人工远程控制增氧泵的状态.为了达到前述功能,在系统运行过程中,需要增氧泵控制箱中的单片机与远程服务器保持实时通信.为实现控制箱与服务器间的消息传送,需要设计一个应用层协议.
应用层协议的制定既要考虑到消息的语言表达也应考虑到通信节点对消息完整性、正确性的验证.此外协议的制定应当充分考虑到开发人员的实现难度.
1.1消息完整性定义
套接字是计算机网络编程的核心和基础.计算机网络通信中,客户端与服务端所扮演的角色不同,因而套接字在客户端与服务器端的使用方法有所不同.服务端的IP地址以及通信端口在通信前对客户端公开.服务启动后,服务端程序在通信端口侦听客户端发出的链接请求.当客户端向服务端IP地址与特定通信端口发出链接请求后,服务端接受链接请求,并在服务端维护一个到该通信端口的套接.此后,双方便建立了计算机网络上的虚链接[3,4].在链接套接字关闭前,通信双方可以通过网络流的形式来进行消息的收发.
由于计算机网络中通信双方的链接是通过路由器的中转所完成的虚链接,而路由器同时服务于不同的通信链接,因此计算机通信的双方的“发送”与“接收”不存在一一对应的关系.增氧泵控制箱中的单片机与远程服务器的通信中,接收方在进行消息解析前必须确保所接收到的数据是完整和正确的.
有两种常用的技术方法可以用来验证协议中消息的完整性.第一种方法可以在消息的头部规定固定长度的字节用来描述该消息的总长度或剩余长度.当消息接收端接收到足够长度的字节后,可以确认所收数据为完整,从而开始校验与解析工作;第二种方法将一个特殊字节(如0x0D)放置到消息的最后,当消息接收方接受的最后一个字节为规定的特殊字节时,便可判定所收数据为完整,否则将所收包裹进行缓存,继续接收剩余数据[5,6].
采用头部描述消息长度的方式进行完整性验证具有通用性,可以适应不同的情况.然而当消息长度较大时,必须使用多个字节定义消息的长度,此时必须规定长度数据的编码方式(大端方式或小端方式);此外对于开发人员来讲实现这种完整性定义的协议相对较为困难.
采用尾部特征字节的方式进行完整性验证对于开发人员来讲实现起来较为容易(只需对每次接收到的数据的最后一位进行检查即可).然而,协议制定者必须确保完整性验证字节不出现在消息的其它部分,否则消息的完整性验证将无效.
增氧泵控制系统应用层协议中采用0x0D字节作为消息结束位以保证消息的完整性.
1.2消息的正确性检测
为了确保所接收的数据是发送方所发送的原始数据,在应用层协议制定时经常采用数据校验技术来对接收到的数据进行校验.通常校验位的计算建立在数学方法的基础之上,如CRC校验、异或校验等[7].
当头部字节规定数据长度时,校验数据会放置到数据的最后;当结尾完整性校验字节被采纳时,校验数据会被放置到完整性校验字节前面相邻的位置.
由于校验数据是通过消息中原始数据计算得出,因此在采用结尾完整性校验技术时有可能出现正确性校验数据中含有完整性校验字节的情况.此时如果不做任何技术处理就会出现消息解析错误.为了正确地解析消息,增氧泵控制系统应用层协议中采用字节替换的方式来解决完整性校验位与正确性校验位冲突的问题.如:以0x0D作为完整性校验字节,当正确性校验数据中出现0x0D字节时可以规定以0x20进行替换.
1.3消息体中字段的定义
应用层通信协议用于规定通信双方所发送/接收消息的功能性语意,换言之,应用层协议规定了期待对方发送的数据的具体格式,消息的组织方式等细节.
常见的协议组织方式有两种:第一种直接规定了消息中每一字节(或bit这种情况较少见)的取值范围和对应含义;第二种将消息的定义建立在字符串基础之上,这时通信协议中规定了协议躯干所采用的编码方式(通常为标准编码),并在此基础之上规定如何用字符串来表达消息的具体内容.第一种协议更为紧凑但实现时的开发任务相对繁重;第二种协议用于建立在字符串的基础上,因而完成相同功能所耗费的字节数较多,但由于大多数语言或平台都有针对字符串的强大支持,因此系统实现较为方便快捷.
应用层协议的躯干部分可以看作将结构体中的数据进行串行化的表达.当消息中所有字段都有固定的长度时,可以用定长的字节来规定特定的字段.当某些字段无法预知其长度时,应用层协议中需要规定字段标识和字段分隔符.通常在一个应用协议中,当存在定长字段与不定长字段时,建议将定长字段集中放置在消息的前部,而不定长字段放置于消息的后部,这样的定义便于协议解析程序的实现.
2.1通信协议框架
根据1中所描述的设计方案,增氧泵控制系统应用层协议格式设置如下:
由于控制箱与服务器间通过中国移动的通信网关进行交互,为区分本协议与AT命令,本协议的所有数据包前统一加入消息头0x24($).
消息头代表通信双方所发消息的鉴定值;数据段用于所传输的数据或命令;校验位为从消息头(包括消息头)到数据段结束按字节亦或运算所得到的一个字节的校验位,用于验证信息在传输中是否存在通信错误(或被篡改);结束符在本协议中固定为0x13(CR),用于判断所接收的消息是否完整.根据本文2.2中的原则,当验证字节的计算结果为0x13时,将其值修改为0x20.
以该协议中的心跳包消息对为例,该消息对包含从水泵控制箱向服务器返送的消息(消息编号003)和从服务器返回的确认消息,消息内容如下:
心跳包$<003><16字节控制芯片ID><checksum><CR>
心跳包确认$<004><16字节控制芯片ID><|><节点ID列表><checksum><CR>
该消息对中除上述描述的协议头、消息头、checksum以及结束位CR外,还包括了16字节控制箱芯片ID号和返回消息中的传感器节点芯片ID列表(一个控制箱可以链接多个传感器).控制节点间以‘|'进行分割可以方便通过split方法进行消息解析.
2.2消息同步机制
增氧泵控制系统通信双方采用标准的客户端服务器消息同步机制,连接的建立以及周期性心跳包的起始由增氧泵控制箱(客户端)完成;当连接建立后客户端和服务器均可发起消息对应答.每个消息对由一个发送消息和一个与之对应的答复消息构成.根据消息对的发起方不同可以将消息对分为两类:第一类消息对由控制箱(客户端)发起,服务器负责应答;第二类消息对由服务器发起,控制箱负责应答.
图1 系统流程
第一类消息对消息头小于等于“499”,第二类消息对消息头大于等于“500”.客户端发送消息的消息头为奇数;服务器端发送消息的消息头为偶数.
2.3系统流程设计
由于该系统采用TCP长连接,服务端与客户端均能发起消息对,因而在系统的设计中要求通过异步的方式进行消息的接收,以达到事件触发的效果.系统流程如图1所示.
系统启动后,首先从配置文件中读取配置信息并根据配置数据对系统初始化,然后进行TCP链接(客户端与服务器在此过程中实现逻辑有所差异见参考文献[1]中对此的描述).
当TCP连接建立后,系统开始侦听系统触发事件.系统触发事件由系统业务层决定,如数据库中的数据满足触发条件,系统状态信息满足触发条件等.当系统触发事件发生后,系统向通信方发送消息并处理应对消息,此后系统重新开始侦听系统触发事件;当系统中没有触发事件时,系统持续接收通信方消息直至接收到完整的消息并对之解析与应答后,系统重新开始侦听系统触发事件.
按照本文所提出的协议制定方法,常熟理工学院物联网工程项目组与常熟市智胜信息技术有限公司联合开发了智能增氧泵控制系统.目前该产品已应用于常熟市小山基地、张家港鸿屹水产养殖有限公司,已分别经过2年和1年的运行,目前系统运行稳定,达到了预期要求.
[1]王榕,许磊,樊宇涛.VxWorks下基于BSDsocket的网络通信[J].电脑编程技巧与维护,2006(08):77-80.
[2]鲁士文.计算机网络协议和实现技术[M].北京:清华大学出版社,2000:21.
[3]许锐炮.Socket在C#程序中的应用[J].科技视界,2014(21):64.
[4]李军,倪宏,陈君,等.一种应用层协议解析加速算法[J].四川大学学报(工程科学版),2014(04):14.
[5]李鹏飞,马恒太,侯玉文,等.移动代理完整性协议形式化分析方法研究[J].电子学报,2009,37(8):1669-1674.
[6]艾祝.基于ISCSI的数据完整性研究与实现[D].兰州:兰州大学,2014.
[7]杨超,张伟哲,张宏莉,等.基于检查点算法的网络计算机容错机制研究[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
肖微,助教,硕士,研究方向:物联网应用,E-mail:Xiaowei@cslg.cn.