BLE的广播和数据报文结构分析

2021年11月21日 5点热度 0条评论

低功耗蓝牙BLE之报文

这篇文档是来自zzfenglin的博客。

报文

 

报文是链路层的基石。报文非常简单,它是带有标签的数据,由一个设备发送,一个或多个设备接收。标签指明了数据由谁发出,以及应该由哪些设备接收。

 

如上图所示,给出了报文的基本结构,适用于所有报文,无论其用途是什么。报文的开始是一小段交替序列,称为前导。之后是接入地址,接收机用它将报文和背景噪音区分开来。接入地址之后是报头和长度字节。再之后是报文的净荷,以及用于确保净荷正确性的循环冗余校验(CRC)。

 

 

 

广播与数据报文

 

低功耗蓝牙规范中,有两类报文:广播报文和数据报文。两类报文具有两种完全不同的用途。设备利用广播报文发现、连接其他设备。一旦连接建立之后,则开始使用数据报文。而两者的区别在于,数据报文只能被连接中的两个设备(主、从设备)所理解,而广播报文则可以广播给多个侦听设备或者只发送给某个特定的设备。

 

是广播报文还是数据报文由其传输所在的信道决定。低功耗蓝牙规定了3个广播信道和37个数据信道。如果报文在某个广播信道传输,则为广播报文;反之,则为数据报文。

 

 

 

比特序与字节

 

报文是一比特一比特传输的,但它们同时也是由数据的字节组成的。当数据的各个字节传输时,总是从最低位开始。因此,“0x80”是按照“00000001”发送的,而“0x01”是按照“10000000”发送的。大多数多字节域是从低字节开始发送。因此,“0x010203”会按照如下顺序发送:

110000000100000010000000

 

 

 

前导

 

报文最开始的8比特是“01010101”或者“10101010”序列。这是很简单的交替序列。接收机可以用它来配置自动增益控制,以及确定“0”、“1”比特所使用的频率。

 

该序列之所以非常重要,是因为芯片必须能够应对输入信号强度的可能范围。接收机需要应付“-10dBm ~ -90dBm”的信号强度,也就是80dB的动态范围。从接收机的角度讲,也就是“1pW ~ 0.1mW”的能量。自动增益控制器必须检测出输入信号的能量等级,并调整增益,使得信号刚好处于接收机能够轻松工作的范围之中。

 

 

 

接入地址

 

接入地址的第一个比特决定了前导是“01010101”还是“10101010”。如果接入地址的第一个比特位是“0”,则使用“01010101”序列;如果是“1”,则使用“10101010”序列。这保证了任一报文的前9个比特都是交替的,即要么是“101010101”,要么是“010101010”。

 

报文接下来的32比特是接入地址。有两种类型:

1.广播接入地址

2.数据接入地址

广播接入地址在广播数据或者广播、扫描、发起连接时使用。数据接入地址在连接建立之后的两个设备间使用。

 

当控制器试图接收一个报文时,它要事先知道待接收报文的接入地址。接收机开启并调谐到正确的频率,就可以收到数据。即使附近没人发送,接收机还是会收到背景辐射。考虑接收到纯随机噪音的概率,接收一段噪音与前导序列相符的可能性相对还是比较高的。通常,如果低功耗蓝牙接收机一直开着,每隔几分钟就能收到一个假的前导序列。因此,就需要利用接入地址以减少随机噪声造成伪报文接收的概率。

 

链路层也不知道其他设备什么时候会发送报文,因此只能保留最近 40μs 接收到的比特,并在新的比特移入到寄存器的时候检查序列是否满足前导和接入地址。这一过程称为与接入地址求相关。

 

对于广播信道,接入地址是固定值“0x8E89BED6”,抓包显示如下:

 

发送时的二进制形式如下(从左到右):

01101011011111011001000101110001

这意味着广播报文的前导是“01010101”。之所以选择这个值作为接入地址,是因为其相关性非常好。该定值使得任何低功耗蓝牙设备能通过与该值求相关获知它正在接收广播报文,即使之前可能从未从该设备接收到任何报文。

 

对于数据信道,接入地址是一个随机值,不同的连接有不同的值。这一随机值也需要符合一些规定,主要是为了保证接入地址有足够好的白化特性。

 

数据信道的接入地址与广播信道接入地址至少要有1个比特的不同。数据信道接入地址也不能有任何重复的模式,各个八位组必须互不相同。数据信道接入地址也不能有超过24次的比特翻转,防止使用逐比特交替的序列。最后一点,最后6个比特需要有至少两次比特翻转,这样可以确保报头开始前有一些比特翻转,以防报头有较长的连