1. 解析
蓝牙数据包的主要格式:一个广播包是由若干个广播单元AD Structure构成的。每个广播单元的组成是:第一个字节是长度值 length,表示接下来的 length个字节是数据部分;数据部分的第一个字节表示数据的类型AD Type,AD type非常关键,决定了AD Data的数据代表的是什么以及怎么解析,这是官网上面不同的值代表的数据类型 https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile ;剩下的length-1个字节是真正的数据AD data。这里需要特别注意的是,由于发送数据是从低位到高位依次发送,所以接收到的数据要反过来按字节拼接。例如接收到的MAC为 8b 03 00 b0 01 c2,那么实际的MAC为 c2:01:b0:00:03:8b
Note
我们用的云里物里网关,穿上来的16进制已经把数据的顺序整理好了。
2. 解析beacon
通过分析可以发现,蓝牙设备会连续收到两个来自(同一个)Beacon的广播数据包,每个原始数据包都是59bytes,前一个主要包含MAC和设备名称等信息,后一个主要包含UUID,txPower等信息。不妨认为前一个数据包为packetA,后一个为packetB。以下是一组实际数据
[!note|每个包的长度都是59字节]
3. 第一个59字节
04 3e 38 0d 01 1b 00 01 8b 03 00 b0 01 c2 01 00 ff 7f af 00 00 00 00 00 00 00 00 00 1e
02 0a 00 08 16 f0 ff 64 27 11 4c b9 11 09 4d 69 6e 69 42 65 61 63 6f 6e 5f 30 30 39 30 37
下面是每个字节对应的含义:
第一个字节是HCI Packet Type,04表示这是HCI Event;剩下的58bytes则是HCI Event的具体内容
第二个字节是EventCode,3e是此事件的代码;第三个字节是Parameter Length,0x38(十进制56)表示后面数据长度56bytes
第四个字节是SubEvent,0d表示这是LE Extended Advertising Report;第五个字节是Num Reports,数值为01
1b 00这两个字节代表Event Type,由于发送数据都是按字节发送以及从低位向高位发送,因此真实值是 001b
01 表示这是随机设备地址
8b 03 00 b0 01 c2 是此设备的MAC,根据从低向高的发送规则,所以真实MAC是 c2:01:b0:00:03:8b
01 代表首要广播信道的带宽
00 代表次要广播信道的带宽,此处表示不使用次要信道
ff 表示广播SID
7f 代表Tx Power的大小,此处是127dbm
af 代表RSSI的大小,此处是-81dbm
00 00 代表周期广播间隔
00 代表直接地址类型,次数是公共设备地址
00 00 00 00 00 00 代表直接BD_ADDR
1e 代表接下的的数据的字节数(长度),以下数据就是最重要的广播数据了
-------------------------------------------
02 0a 00 代表的是Tx Power Level的信息,02 表示数据字节数,0a 表示数据类型,00 表示功率水平(单位是dBm)
08 16 f0 ff 代表的是Service Data信息,08 表示数据字节数,16 表示数据类型,ff f0 表示16bit UUID ,
64 27 11 4c b9 表示Service Data的具体信息
11 表示后面的数据的字节数
09 表示数据类型
4d 69 6e 69 42 65 61 63 6f 6e 5f 30 30 39 30 37 表示设备的名称,每一个字节对应一个ASCII
4. 第二个59字节
此数据包才是最重要的,59bytes的数据包内容如下:
04 3e 38 0d 01 13 00 01 8b 03 00 b0 01 c2 01 00 ff 7f af 00 00 00 00 00 00 00 00 00 1e
02 01 06 1a ff 4c 00 02 15 fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 27 11 4c b9 c5
下面是每个字节对应的含义:
第一行数据同上,不再分析,重点分析第二行(也就是广播数据部分)
--------------------------------------
02 表示接下来的数据有两个字节
01 表示数据类型,此处的类型是Flags
06 表示Flags的具体模式
1a 表示接下来的数据有26个字节
ff 表示数据类型,此处是厂家特定字(Manufacturer specific)
4c 00 表示公司的ID,此处的004c代表苹果公司
02 代表beacon标识位
15 表示接下来有22个字节的数据
fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 表示beacon UUID
27 11 是major的值,2711转化为10进制是10001
4c b9 是minor的值,4cb9转化为10进制是19641
c5 是txPower的补码,计算可知原码是-59