水资源SZY206-2016通讯协议是国家制定的水资源监控标准数据通讯协议,用于遥测终端机与网络平台之间数据通讯。我将此协议用于公司产品--遥测终端机上,并取得南京水文局检测报告,对于此协议的了解也算颇为熟悉。
这个协议总体来说还是比较全的,对于检测来说基本功能差不多能够实现,当然在应用过程中为了方便自己也添加了不少功能报文,本协议优点是比较简单,基本能满足水文检测需求,当然也有一些不明确的地方以及一些不太合理的地方,在此主要讲述通讯协议的优化以及一些使用心得。
第一,密码功能,密码的使用在协议中的解释不是很到位,实际上意思就是说你根据自己的需要自己制定一个密码的计算方法,用于终端与服务器之间数据通讯,保证数据的安全与可靠,在实际应用之中建议使用较为简单的密码算法,算是锦上添花的一个功能。除了密码之外,校验是非常重要的,在终端与服务器交互时,一定要确保校验是正确的再进行解析,本协议的校验算法是CRC-8校验,有一个单独的多项式,与一般用到的CRC-8校验不太一样,计算时要注意一些。
第二,数据格式,数据报文使用的是BCD码格式,低字节在前,这里在使用的时候比较别扭,因为人一般的习惯是高字节在前读起来顺一些,也便于使用过程中分析报文。在我们应用过程中常常会用到数据格式转换,最常用的是hex数与BCD码之间的转换,因为我们在数据计算、处理是往往用的是hex格式,在协议传输或者显示时往往用的是BCD码格式,这种转换函数建议写成一个独立函数,或者模块,我们在使用时直接去调用,便可实现数据的转换,需要注意的是,如果是有符号数的转换要单独写,另一点需要注意区分单字节、双字节、四字节hex数与单、双、三、四字节的BCD码之间的相互转化。
第三,数据交互,此协议中有些设置功能是没有查询功能的,这就导致在使用时这些没有查询功能的设置参数我们不知道有没有真的设置成功,比如设置遥测终端参数固态存储时间段间隔和参数起报阈值,这个功能没有查询对应的功能码,对于一个对这个协议不懂的人来说如何才能知道固态存储时间段间隔和起报阈值呢?这里就需要我们手动去添加自己的私有协议了,我在做这个协议时将所有没有查询功能的设置项都加上了,也不多,就三四条。除此之外,自己根据应用中的实际情况,也添加了十几条为方便使用而添加的功能码,例如水位传感器量程设置,都是非常好用非常有必要添加的。
第四,图片传输,这个协议在图片传输这里做的有些不好,因为图片在传输的时候比较大,需要进行分包,正常来说每一包服务器都应该返回一个确认帧,但是本协议没有,协议只要求最后一包回复确认帧,这就使得图片传输非常不可靠,一旦网络不好,很可能传输失败 ,因为我们是定时发送的。后来我修改了这条协议,要求每一包服务器必须回复,每次收到回复我就发送下一包,收不到回复我继续发送当前这一包,每一包有三次机会。这样会即迅速又安全。
最后,欢迎与我交流通讯协议相关问题,大家互相帮助互相成长。