看到坛友买了POS机后只为了那颗电池,其他都丢垃圾桶,着实心疼,就算一个单片机都能玩很多花样了,比51单片机好玩多了。就此以为不再有人愿意折腾新技术了,直到前最近有坛友发表了蓝牙的串口数据,其实我两个月前就用这种方法抓取了蓝牙的数据,但是还没有完全分析透彻。我决定把我的分析结果分享给坛友。
在拿到蓝牙模块的时候首先要在网上找数据手册,我的模块是AP6210B,很遗憾博通提供的资料根本没有初始化的内容,却是发现了这个模块与其他模块的区别。
这模块是不带蓝牙协议栈的,好吧!既然这样,我用逻辑分析仪读取初始化数据看看。
所用到的工具,接好线后,先设置一个通道为下降沿触发采集,再点击开始,最后按POS机的开机键。
上面是引脚图,采集数据时只接RX和TX,还有GND直接接到USB的外壳即可,CTS和RTS不用管,这两个引脚是硬件流控制。
采集完后设置数据的波特率才能看明白,默认是115200的,但是我的模块在初始化时会先改变波特率为921600,所以看到数据错误不妨改一下波特率。
这是我采集分析的数据:
http://pan.baidu.com/s/1gfc1mZT通过分析我们可以看到单片机每发送一条数据到蓝牙,蓝牙就会回复一条数据给单片机,而他们也是有一定规律的,比如第一个数据为0x01,但是还有其他规律吗?于是我又看了TI的蓝牙协议栈,得知蓝牙里面也有一个单片机,主要是发送指令到蓝牙里面的单片机完成初始化的,就像初始化1602液晶一样。
通常有蓝牙协议栈的我们可以直接用AT指令,而没有我们要操作的是HCI层,也就是说发送的是HCI指令,HCI指令有多种格式。
首先是第一个字节表示HCI数据类型。
指令0x01开头,只能由单片机发到模块。
事件0x04开头,只能由模块发到单片机。
数据包可以双向发送。
接着是操作码,操作码由一个16字节的OCF和8字节的OGF经过重组后形成。
这是我整理的协议里的HCI指令转化为发送数据的方法。
数据转协议方法。。。要分析这些数据就要用到一个强大的手册了,SIG发布的国际蓝牙标准,蓝牙协议都是根据这个标准编写的(全英文)。
http://pan.baidu.com/s/1dFM657V首先查找OGF,比如:0x03(查找defined as 0x03快一点)。
大概知道了是链路控制命令,接着找OCF,比如:0x0003,直接往下翻。
找到了,这个是蓝牙重置命令,下面还有相关说明。也就是一开始单片机就要发送重置命令重置模块。
看了这么多,举个例子分析数据:蓝牙复位指令 HCl Reset:
01 03 0C 00第1个字节0x01,表示发送的是指令;第2,3个字节是OGF:0x03,OCF:0x0003经过重组后的数据;第4个字节是后面的参数长度,00表示没有参数。再举个例子:
01 0B 04 16 77 89 39 98 22 00 54 0B 3F 42 F8 38 EE 90 09 BC 1D 1C 1E D1 E2 61第1个字节0x01,表示发送的是指令;第2,3个字节是OGF:0x01,OCF:0x000B经过重组后的数据;第4个字节表示参数长度22bit;
第5-10个字节表示参数BT_ADD;第11-27个字节表示参数Link_key;接楼下。。。