一篇文章,弄懂蓝牙协议怎么看,进军物联网!
做过物联网相关项目的小伙伴都知道,避免不了和蓝牙,串口通信打交道。所以了解怎么看蓝牙协议基本上可以说是进军物联网的一大助力。很多新人小伙伴刚进入这个行业都是一脸懵逼的,特别是接入的时候,对方直接给了一个文档,直接凌乱,今天咱们就一起看看怎么看蓝牙协议,废话不多说,开始上车!
一般我们在接入蓝牙设备的时候,硬件或者嵌入式会提供一个文件,原则上是软硬件共同商议的协议,但是一般来说都是硬件写好,你直接对接的,协议一般如下图:
或者这种:
看完后两眼懵逼,可能会猜到一点,但是我相信绝大多数人都是迷茫的。现在我就告诉大家怎么去看,去弄懂这些协议。
首先,我们拿到协议后,先去确认一下串口设置,特别是波特率,这是通信的基础。如下图就是波特率是:230400的。
接着,我们去看传输的包的结构,这里告诉了我们传输的格式,例如下图:
从上面的图我们可以很轻松的看出来这个协议的传输格式应该是:
AA 55 DATALEN(1个字节) CMDCODE(1个字节) DATA(0~255字节) CHKSUM (1个字节)
而且还能通过上述的描述中得知,DATALEN的字节是用来描述 DATA的长度,CMDCODE是关键字命令,DATA是需要传输的内容,范围是0-255,而且还给出了CHKSUM的计算方式,也就是我们校验核为:
CHKSUM = (DATALEN + CMDCODE +DATA)&&OxFF
一般来说像这种校验核协议上都会提供,但是对于我们做android的小伙伴来说,在对接过程中也会时有遇到对方提供的校验核是一个C语言或者其他语言写的方法告知你,或者是直接跟你说了算法,自己去琢磨。对于这种情况,只能自己根据对方提供的算法去百度一下了。
由上述得知,我们在这个例子的协议上的传输格式应该就是这样了,这里我提供一个例子大家参考看看大家理解的是不是跟我说的一样:
aa 55 01 01 01 03
如果大家理解是对的,那么我们接下来就可以去看协议的一些固有指令,这样就很轻松了。比如说下图的指令获取版本信息,基本是所有的蓝牙设备都会有这个指令。
结合上述我们对包的结构分析,我们看到这个指令的时候是不是很轻松就知道这个包的具体组成?比如说:
AA 55 00 03 校验
aa 55 固定头部
00 DATALEN 数据长度(这里的值为零,那么DATA应该就是零)
03 CMDCODE 关键字命令
00 DATA 传输内容(由于DATA是0,没有内容所以不写)
03 CHKSUM校验核(CHKSUM = (00 + 03 +00)&&0xFF)
AA 55 00 03 03
是不是就觉得这些命令瞬间就不陌生了?感觉自己又行了?别着急,这只是开胃菜,我们接下来看看其他的命令,比如说这个,实时监测某个设备的状态。
脑瓜子又嗡嗡了是吧,不讲武德,一个字节包含了两个内容,一个是测量值,一个是设备状态。是不是把数据的字节直接拆开就好啦?比如说 01,0就是数值,1就是设备状态?你要这么写,等着被领导挨批吧。
其实上述图,在下面有了很好补充说明,血氧饱和度信息的测量值和状态值由DATA的字节控制。我们知道,一个字节它有8个BIT,描述中测量值由7:2来控制,也就是说测量值由2-7BIT来组合控制,它的值为1表示异常,0表示正常。然后BIT1 也就是第二位负责控制设备状态。它的值1表示脱落,0表示正常。最后BIT0 ,也就是第一位保留,也就是没有参数控制。
例子: AA 55 01 AB 03 检验
根据上述描述,把03拆分为0和3,转化2进制为 0000 0010。BIT顺序从右到左递增,由此我们可以得出测量值为2到7BIT为0000 00,所以测量值0,0对应的是测量正常。BIT1为1,所以得出设备状态值为1,1对应的是脱落。BIT0为0,不使用。
这样我们对于这个命令的理解就结束了,是不是很简单?嘿嘿,不急,接下来,还有更加复杂的,上菜!
看完有没有原地爆炸的感觉?这都是哪个缺德玩意搞得?不要急躁,越到这种时候,我们就越要冷静,来让我们一起看看这个“简单的命令”怎么理解。
AA 55 2N A0 DATA 校验
AA 55 固定头部
2N DATALEN(数据长度为2n)
A0 关键字命令
2N 传输内容有2N个字节 ,最大254个字节
通过我们对包结构的分析,我们知道了这个命令的DATALEN为2N,DATA为2N,最大字节254,而且由补充说明中得知DATA的数据是成对出现的,并且高位在前,低位在后,同时2个字节组成的数值包含了三个信息,分别是:是否含起搏脉冲,是否含心跳,心电波形数据。前面两个状态值分别由第一个字节的7BIT、6BIT 决定,后面的心电波形数据由两个字节决定。这样就很明了了,举个例子:
AA 55 02 A0 01 02 校验
这个例子中,02代表了2N的数据长度,10是关键字。01拆分为0和1,转为二进制是 0000 0001。由上面所述我们知道,控制起搏脉冲和是否含有心跳的状态由第一个字节的第8BIT和第7BIT控制,第1BIT到第4BIT和第二个字节组成了心电波形数据。这样我们就知道了起搏脉冲的状态是0,代表未含有。心跳状态是0,代表未含有,而心电波形数据是102转10进制是256。这样数据就解析出来了,是不是又非常的简单?
通过上面的学习,你终于学会了这些包的结构,了解了怎么去解析对方传过来的数据和我发怎么发数据给对方后 ,我们就可以去看一下数据交互流程,尝试去做一下交互,你会发现,现在的你事半功倍,如有神助,因为你已经掌握了这个协议。
通过上面的这几个例子,大伙是不是对蓝牙协议的规则有了清晰的理解,再也不会因为看不懂协议而到处翻查资料了?其实还有很多的蓝牙协议可能和我上面的不太一样,但是万变不离其心,基本是都是由包的结构去理解这个协议,然后你就能轻车熟路的接入这个蓝牙设备了。
如果讲的有哪里不对,也请大家多多海涵,及时提出来让我修正,希望本篇文章能为您提供哪怕一点思路,我也开心无比。