Sb3:近期处理的一个面向对象的用电协议数据的解析问题解决方法的日记

题记:关于DL/T698协议数据的解析问题,我想很多与电气相关公司都会有所涉及,但是很多初学者可能都很陌生,很多看懂协议之后去编程解析数据的工程师可能会一筹莫展,本人通过近两个月的阅读、思考总结了一点心得体会,在此与大家分享,也是对自己阶段性进展的一次记录。

背景:关于串口开发,以往的公司所定义的协议类型都相当的简单,就是固定协议数据格式,例如:ZZ,01,23,44,3.14,YY;基本就是将预先确定的数据通过数据位置来限定死,第一位代表什么,第二位代表什么以此类推;这类的协议解析不用说了,小白都会。无论你是用字符串传输还是用字节数组传输,只要你认识汉字就能解析出来。但是最近接触的面向对象的协议类型的时候,彻底让我打开了一个新世界,原来数据传输也可以面向对象。每次传过来的数据长短或者代表的意思可能都不太一样,这就给解析带来了很大的困难。但是我是谁啊,我是C#野生程序员啊,野生程序员有自我修养啊,最喜欢的就是自我琢磨啊。琢磨了一段时间,现在对这个数据协议有了一个初步的解析构想,然后就急急忙忙写了这篇日记,希望无论是措辞不当还是技术理解不当大家都不要太在意。

申明:本文编写的内容若含有保密信息或者敏感信息,请联系我,立刻删除。

参考:《DL/T、Q/GDW电力行业标准、国家电网公司企业标准DL/T 698.45-2017、Q/GDW 11778-2017面向对象的用电信息数据交换协议》

正文:对于这个面向对象的信息,我说说你听听。既然是协议文件,肯定有一定的固定格式,目前我看到的698协议文件固定68开头16结尾,那么这个就是我们所谓的固定格式,帧头帧尾固定了。那么对于传输中的定义为"68+L+C+SA+CA+HCS+APDU+FCS+16"。这个我解释一下,其中的L、C、SA、CA、APDU、HCS、FCS都是固定的对象类型。可能说到这里有的人就会说了,既然都是固定了,哪来的变。别搞笑了可好,如果真的是这么简单,我还至于要写个日志记录一下现在的想法怕忘记了吗?

L--固定为两个Byte,文中也没有给出这个L是个啥类型数据,反正就是两个字节,爱咋咋滴。前文说过“链路层帧的基本单元为8位字节,传输顺序为低位在前,高位在后;低字节在前,高字节在后”这句话让我纠结了很久,因为L和后面的实际地址位一直让我纠结,现在看来整个协议都是遵循了这个传输约定。L实际是个数据类型,17 00转byte[] 变成了byte[0]=17 byte[1]=0,那么转换之后就是按照1700传输,但是实际地址是相互没有关系的byte[],例如实际地址为(041029511081)H,那么按照传输要求就是811051291004。完美,符合前文约定。

C--这个懒得说了,就一个字节,字节中的位固定表示哪些含义。这个byte里面就定义好了数据传输方向,本条数据的功能是链路数据还是交互数据。

SA+CA--统称地址位。这里开始就有面向对象的思想了,SA中第一个字节中规定了地址的类型、是否存在逻辑地址、地址的实际长度。根据是否存在逻辑地址判断后面是否跟有逻辑地址<这个时候就体现了协议的可变性>,若没有逻辑地址,那么SA就短一位。根据地址长度去截取后面若干位来解析地址信息(上面已经提及到了地址的解析),SA后面固定一位是CA(客户机地址)。

HCS--校验帧头数据(两个字节)

FCS--整帧数据校验(两个字节)

那么下面就到了我希望分享的内容了——APDU。

由于下午还有很多工作,临时计划将这篇放到后一篇日记中来记录。

posted @ 2021-08-18 13:42  晨耕暮饮  阅读(446)  评论(7编辑  收藏  举报