前言
经过前面两篇《BLE基础知识(一)》《BLE基础知识(二)》之后,我们对BLE有了基本的了解。我们平时用到比较多的GATT了。接着上篇来继续看看!!
UUID
UUID就是通用唯一标识符。上一篇我们提到的Service (服务),Characteristic (特征),Descriptor (描述符) 等都有自己的UUID。因为一个设备肯定会有很多个服务,一个服务中也会包含多个特征,一个特征也可以包含多个描述符。那怎么来区分它们呢? 所以就需要UUID来进行标识区分了。
蓝牙对UUID 格式定义都有三种: 16bit UUID、32bit UUID、128bit UUID。
16bit 和 32bit 的 UUID 与 128bit 的值之间转换关系:
128_bit_UUID=16_bit_UUID*2^96+Bluetooth_Base_UUID128_bit_UUID=32_bit_UUID*2^96+Bluetooth_Base_UUID
其中 Bluetooth_Base_UUID 定义为 00000000-0000-1000-8000-00805F9B34FB
上面的计算公式太复杂,我们用下面的方式记比较简单。
若 16 bit UUID为xxxx,那么 128 bit UUID 为 0000xxxx-0000-1000-8000-00805F9B34FB
若 32 bit UUID为xxxxxxxx,那么 128 bit UUID 为 xxxxxxxx-0000-1000-8000-00805F9B34FB
蓝牙联盟已经将某些UUID分配给一些公司或服务使用了。可以参考下面官方链接。
当然了,即使被分配了,我们也可以使用,只是如果做成市场产品就要小心,可能会跟别人的冲突,出现不兼容等情况。
空口数据包
空口数据包就是在空中传输的数据包。它是最完整的数据包,一般只有抓包分析问题才会需要了解这些知识。
空口数据包有两种格式:
- LE Uncoded PHY (1M和2M)
- LE Coded PHY
一种有编码,一种没有编码的。
我们先只看看未编码的格式:
无论是广播数据包还是普通数据包,它们的空口数据包格式是一样的。区别在于Access-Address和PDU的内容不同。
1. Preamble
前导码用来同步接收端和发送端的,1M PHY使用1个字节, 2M PHY使用2个字节。前导码是0和1交替的固定顺序,前导码的第一个bit要和接入地址的最低位(小端)一样,所以前导码第一个bit是由接入地址决定的。
2. Access-Address
4个字节,用来标示接收者ID或者空中包身份。它和设备地址(48bit)是不一样的,不要混淆。
根据接入地址的不同,可以区分两种Packet类型:广播包和数据包:
广播包接入地址固定为0x8E89BED6
数据包接入地址为一个32bit的随机值,由Initiator生成。
3. PDU
2~258个字节,真正的数据内容。
4. CRC
3个字节的CRC校验