BLE报文由不同的域组成,如果域的长度超过一个字节,就涉及到先传输字节的低位还是高位的问题,这里分字节序和比特序:
字节序:大多数的多字节域都是从低字节开始传输。但是,并不是所有的多字节域都是从低字节开始传输。
比特序:各个字节传输时,每个字节都是从低位开始。
- 前导:前导是一个8bit的交替序列,不是01010101就是10101010,取决于接入地址的第一个bit;接收机根据前导的无线信号强度来配置自动增益控制;
- 接入地址:广播接入地址和数据接入地址
- 广播接入地址:固定为0x8E89BED6,在广播、扫描、发起连接时使用;
- 数据接入地址:随机值,不同的连接有不同的值。在连接建立之后的2个设备之间使用。
对于数据信道,数据接入地址是一个随机值,但要满足以下条件:
- 数据接入地址不能超过连续的6个0或1;
- 数据接入地址值不能和广播地址一样;
- 数据接入地址的4个byte值必须互不相同;
- 数据接入地址不能有超过24次的bit翻转(0到1或1到0算一次bit翻转)
- 数据接入地址最后6bit必须有2次bit翻转;
- 符合上面条件的数据接入地址大概有231个。
- 报头:报头的内容取决于该报文是广播报文还是数据报文
- 广播报文的包头如下:
4bit的报文类型,2bit保留,1bit发送地址类型,1bit的接收地址类型
- 广播报文类型:核心规范中定义了7种类型,如图,根据该字段即可分辨出广播报文类型,如该字段为ADV_IND,表示类型为通用广播
每种广播报文类型都具有不同的数据格式及行为。
- 发送地址类型和接收地址类型:发送地址类型和接收地址类型指示了设备使用公共地址(public address)还是随机地址(Random Adress)。公共地址和随机地址都一样,都包含6字节48bit,BLE设置必须拥有这两种地址类型中的一种,当然也可以同时拥有这两种地址类型。
- 广播报文的包头如下:
- 长度
- 广播报文:长度域包含6bit,有效值的范围6-37;
- 数据报文:长度域包含5bit,有效值的范围0-31;
- 广播报文和数据报文的长度域有所不同,主要是因为广播报文除了最多31个字节的数据报文外,还必须包含6个字节的广播设备地址。6+31 = 37,所以需要多6bit的长度域。
- 数据(advdata):广播和扫描响应的数据格式如下图所示,由有效数据部分和无效数据部分组成:
有效数据部分包含N个AD Structure,每个AD Structure 由length, AD Type和 AD Data组成。其中
- Length:AD Type 和AD Data的长度;
- AD Type:指示AD Data数据的含义;
- AD Data:数据。
- AD Structure的结构很重要,对于理解广播数据以及扫描后的数据解析很有帮助。主机扫描到广播后,如何理解广播中包含的数据的意义,逐个解析广播包中的AD Structure来获取对应数据。
- AD Type及其表示的含义可以通过SIG官网查询,也可以查看Nordic的SDK中的定义:(ble_gap.h文件)
- 校验:BLE采用的是24位CRC校验,CRC对包头,长度和数据进行计算,24位CRC的生成多项式为: