android 蓝牙完美解析协议 蓝牙万能通讯协议

时间:2024-05-31 08:55:42

在一次聊天中,突发奇想,解决了一个蓝牙通讯的协议问题。如果有需要制定硬件和App交互协议,
同样可以参考本文。

问题概述:


1:多套协议,多套解析
蓝牙通讯时都会定义自己和硬件的通讯协议,不同的硬件,协议也不一样,对应APP解析也不一样
2:数据改变,协议改变
协议一般是不会变的,但是会变的情况还是很多的,例如需求增加,硬件改动,都会造成数据变更,
进而导致协议变更,导致硬件组帧改动,导致手机端软件解析代码变更。

举个例子:
原来的老协议:
android 蓝牙完美解析协议 蓝牙万能通讯协议
由于数据太多需要一个字节:
android 蓝牙完美解析协议 蓝牙万能通讯协议

需要解决的问题:


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位小数
这个可以根据实际需求定制

如果使用新协议再组织老的数据帧应该是这样的
android 蓝牙完美解析协议 蓝牙万能通讯协议
回到最开始那个问题,数据发生变化后,数据帧应该是这样的
android 蓝牙完美解析协议 蓝牙万能通讯协议

那我的解析规则不用变化了,因为我解析是根据
数据域的类型个数,每个类型长度字段,每个类型对应解析这三个
对应的数据去解析的,现在只是类型长度变了,我在截取数据也相应多
截取一个就行了,代码完全不用变!