在一次聊天中,突发奇想,解决了一个蓝牙通讯的协议问题。如果有需要制定硬件和App交互协议,
同样可以参考本文。
问题概述:
1:多套协议,多套解析
蓝牙通讯时都会定义自己和硬件的通讯协议,不同的硬件,协议也不一样,对应APP解析也不一样
2:数据改变,协议改变
协议一般是不会变的,但是会变的情况还是很多的,例如需求增加,硬件改动,都会造成数据变更,
进而导致协议变更,导致硬件组帧改动,导致手机端软件解析代码变更。
举个例子:
原来的老协议:
由于数据太多需要一个字节:
需要解决的问题:
1:数据改变,协议不变,解析不变
2:使用一套协议兼容所有的协议,使用一套解析兼容所有的解析
解决方法:
1:增加数据域的类型个数可变字段
2:增加数据域个数的字段
3:增加数据域中每个类型长度的字段
4:增加数据域中每个类型对应解析字段
数据域的类型个数:
假设原来的数据域为 3D2A5511226F81
我要解析出“ 用量 电压 日期 信号”四个字段
那 ‘数据域的类型个数’ 就是 04(16进制表示)
每个类型长度字段:
用量:需要截取 2个字节
电压:需要截取 1个字节
日期:需要截取 2个字节
信号:需要截取 2个字节
每个类型对应解析:
我自己定义的解析规则如下
01 16进制转10进制
02 BCD码
03 反转的BCD码
04 16进制转10进制保留1位小数
05 16进制转10进制保留2位小数
06 16进制转10进制保留3位小数
这个可以根据实际需求定制
如果使用新协议再组织老的数据帧应该是这样的
回到最开始那个问题,数据发生变化后,数据帧应该是这样的
那我的解析规则不用变化了,因为我解析是根据
数据域的类型个数,每个类型长度字段,每个类型对应解析这三个
对应的数据去解析的,现在只是类型长度变了,我在截取数据也相应多
截取一个就行了,代码完全不用变!