BLE基础知识(三)

前言

经过前面两篇《BLE基础知识(一)》《BLE基础知识(二)》之后,我们对BLE有了基本的了解。我们平时用到比较多的GATT了。接着上篇来继续看看!!

UUID

UUID就是通用唯一标识符。上一篇我们提到的Service (服务),Characteristic (特征),Descriptor (描述符) 等都有自己的UUID。因为一个设备肯定会有很多个服务,一个服务中也会包含多个特征,一个特征也可以包含多个描述符。那怎么来区分它们呢? 所以就需要UUID来进行标识区分了。

蓝牙对UUID 格式定义都有三种: 16bit UUID、32bit UUID、128bit UUID

16bit 和 32bit 的 UUID 与 128bit 的值之间转换关系:

1
2
128_bit_UUID = 16_bit_UUID * 2^96 + Bluetooth_Base_UUID
128_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分配给一些公司或服务使用了。可以参考下面官方链接。

https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20Numbers%20Document.pdf

当然了,即使被分配了,我们也可以使用,只是如果做成市场产品就要小心,可能会跟别人的冲突,出现不兼容等情况。

空口数据包

空口数据包就是在空中传输的数据包。它是最完整的数据包,一般只有抓包分析问题才会需要了解这些知识。

空口数据包有两种格式:

  • LE Uncoded PHY (1M和2M)
  • LE Coded PHY

一种有编码,一种没有编码的。

我们先只看看未编码的格式:

无论是广播数据包还是普通数据包,它们的空口数据包格式是一样的。区别在于Access-AddressPDU的内容不同。

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校验