二 蓝牙低功耗(BLE)协议栈 之 LL层

一 链路层的状态

链路层定义了两个设备如何利用无线电传输信息。它包含了报文、广播、数据信道的详细定义,也规定了发现其他设备的流程、广播的数据、连接的建立、连接的管理以及连接中的数据传输。
BLE状态机

链路层定义了5种状态:

  • Standby,就绪态
  • Advertising,广播态
  • Scanning,扫描态
  • Initiating,发起态
  • Connection,连接态

不过,可以认为扫描态有两个子状态:主动扫描和被动扫描。连接态也有两个子状态:主设备、从设备。

链路层状态不但解释了设备间如何发现和连接。也解释了BLE的另一个基本的设计策略:将广播、发现和连接的过程与连接中数据传输分离开来。该设计一部分是为了实现广播设备的超低功耗。将广播信道减少到3个,在保证鲁棒性的同时降低了功耗。但这以设计也需要区分广播态和广播报文。链路层状态的3个状态(扫描态、广播态、发起态)使用广播报文,而只有1个状态(连接态)使用数据报文。

二 报文结构

在这里插入图片描述

1 前导码

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

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

2 接入地址(Access Address)

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

LL层使用接入地址来区分当前发送的数据是广播包还是数据包,广播包接入地址固定为0x8E89BED6,数据包使用是在连接时生成的接入地址。

  • 连接时主设备分配一个32位的随机数并发送给从设备,这就是接入地址。
  • 接入地址被用来表示一个连接,在连接期间保持不变。
  • 对于同一个从设备,断开从新连接接入地址也会重新生成。

3 报头

PDU的第一个字节是报头,广播报文和数据报文的报头格式不同。

广播报头

  • PDU Type(4bit) 广播报文类型
  • RFU(1bit) 未使用
  • ChSel(1bit) 未使用
  • TxAdd(1bit) 发送地址类型
    • 0: public地址
    • 1: 随机地址
      • 静态随机地址,地址最高两位为11
      • 私有随机地址
        • 不可解析私有随机地址,地址的最高两位为00
        • 可解析私有随机地址,地址的最高两位为1(最高位)0(次高位)
  • RxAdd(1bit) 接收地址类型,规则和TxAdd一样
  • length(8bit),长度

数据报头

  • LLID(2bit),逻辑链路标识符,用来判断数据报文属于下列哪种类型
    • 链路层控制报文(11),用来管理连接,
    • 高层报文开始(10),也可用于一个完整的报文
    • 高层报文延续(01),也可以是一个空包
  • NESN(1bit),下一个预期序列号
  • SN(1bit),序列号
  • MD(1bit),更多数据
  • RFU(3bit),保留
  • length(8bit),长度

广播类型

  • ADV_IND,通用广播,外设发出的一般称为通用广播,广播中包含mac地址设备名字等信息。
  • ADV_DERECT_IND,定向广播,某个外设在工作的时候就希望某个主设备来连接它,就可以向这个中央设备发起一个定向广播。
  • ADV_NONCONN_IND,不可连接的广播,比如货架上的广告机,会不断的向外发送广播信息。
  • ADV_SCAN_IND,可扫描广播,包含了比通用广播更加丰富的信息。
  • SCAN_REQ,扫描请求,当中央设备发现通用广播中包含的信息并不全,这个时候主设备可以发一个扫描请求。
  • SCAN_RSP,外设响应主设备的扫描请求,返回给中央设备更多的信息。
  • CONNECT_REQ,连接请求,当主设备得到足够的信息之后就可以发送一个连接请求。来建立连接。
  • AUX 开头的广播类型是蓝牙5.0新引入的。

在广播信道上传输的数据是广播报文,在数据信道上传输的数据报文。

4 长度

对于广播报文,长度域包含6bit,有效值范围是6到37字节。对于数据报文,长度域包含5bit,有效范围是0到31字节。

广播报文和数据报文的长度域有所不同可能显得有些奇怪。这一设计的主要原因是,广播报文除了最多31个字节的数据外,还要包含6个字节的广播设备地址。6个字节加上31个字节导致报文长度最多为37个字节,因此需要6bit的长度域。

这里需要注意的是,如果数据报文被加密,则需要包含4个字节的消息完整性检查域,实际的数据长度被减少到最多27个字节。为了使得链路层设计得到简化,未加密报文的长度也不允许超过27个字节,以降低链路层缓存的复杂度。

5 数据

数据也有对应的格式,如上图所示,广播类型的报文有通用广播、定向广播、扫描等,数据类型的报文取决于更上层。

6 CRC校验码

报文的最后3个字节是CRC值,BLE采用24位的CRC校验,对报头、长度、数据进行计算。

三 跳频算法

连接事件 主设备使用 channel 3给从设备发送了一个请求,从设备也使用 channel 3回复了主设备一个数据。这一发一回就叫做一个连接事件。对于主设备发送过来的某些请求,从设备可以不做回复,这种只发不回也叫作一个连接事件。不管是一发一回还是有发无回,主设备的下一次发送都要选择下一个channel,也是一个新的连接事件。

对于数据包,会使用自适应跳频算法,在0~36这个37个通道中挑选可用的信道。

主设备发出CONNECT_REQ时,会含有一个hope值,就是下面公式的hopeincrement;还会含有一个Channel Map(主设备知道哪个信道可用),它是一个37位的字段,每一位代表一个数据通道,某位为1表示对应的通道可用,某位为0表示这个通道不可用。

举例说明跳频算法

假设主设备在发送CONNECT_REQ的时候:

  • hop == 7
  • ChannelMap == 000 1111 0000 0000 0111 0000 0000 0011 0000 0000 (bit0对应 channel 0)

所以可用的通道 Used = [9, 10, 21, 22, 23, 33, 34, 35, 36],可用的信道数 numUsed = 9

在这里插入图片描述

  1. 第一个连接事件

h o p = 7 hop = 7 hop=7
f n = 0 f_n = 0 fn=0
f n + 1 = ( f n + h o p ) / 37 = 7 f_{n+1} = (f_n + hop) / 37 = 7 fn+1=(fn+hop)/37=7
从Channel Map中可知7这个信道并不可用,所以继续后面重映射的算法

r e m a p p i n g I n d e x = f n + 1 / 9 = 7 remappingIndex = f_{n+1} / 9 = 7 remappingIndex=fn+1/9=7
U s e d C h a n n e l = U s e d [ r e m a p p i n g I n d e x ] = 35 UsedChannel = Used[remappingIndex] = 35 UsedChannel=Used[remappingIndex]=35

  1. 第二个连接事件和第一个连接事件的算法一致,只不过此时的 fn = 7

四 空中数据分析

1 ADV_IND广播包

image

0d 03 00 00 00 80 0d 16 aa d6 be 89 8e 60 14 da 99 d9 ef 38 ee 02 01 06 0a 09 4c 56 53 2d 44 31 39 31 39 6c 42 ab
  • LL preamble: aa (0xaa)

  • LL Access Address: d6 be 89 8e (0x8E89BED6) 广播地址固定为这个值

  • LL Header: 60 14 详见 Vol 6, Part B, 2.3

    • PDU Type: 0000b (4bits),一般的广播包(ADV_IND),不同类型的广播包Payload的数据格式不同. PDU类型的说明详见:Vol 6, Part B, 2.3, Table 2.3
    • RFU: 0b (1bit)
    • ChSel: 1b (1bit)
    • TxAdd: 1b (1bit), 公共地址,需要向SIG机构购买(TxAdd = 0); 随机地址(TxAdd =1)
      RxAdd: 0b (1bit)
    • length: 14 (0x14) payload长度
  • LL Payload: da 99 d9 ef 38 ee 02 01 06 0a 09 4c 56 53 2d 44 31 39 31 39

    • AdvA: da 99 d9 ef 38 ee (0xee38efd999da), BLE的MAC地址,随机地址的最高两位应该为11b
    • AdvData: 02 01 06 0a 09 4c 56 53 2d 44 31 39 31 39 ,广播包数据的格式详见:Vol 3, Part C, 11
      • AD Element 1: 02 01 06
        • length: 02(0x02)
        • AD Type: 01(0x01) AD Type 详细信息见蓝牙核心卷的补充文档: CSS v9, Part A, 1 和 https://blog.csdn.net/chengbaojin/article/details/107361768
        • AD Data: 06(0x06)
      • AD Element 2: 0a 09 4c 56 53 2d 44 31 39 31 39
        • length: 0a(0x0a)
        • AD Type: 09(0x09)
        • AD Data: 4c 56 53 2d 44 31 39 31 39
  • CRC: 6c 42 ab(0x6c42ab)

2 SCAN_RSP广播包

image

0d 03 18 00 00 00 05 08 aa d6 be 89 8e 04 06 3a 02 d1 8a 09 b8 66 dd 64
  • LL preamble: aa (0xaa)

  • LL Access Address: d6 be 89 8e (0x8E89BED6) 广播地址固定为这个值

  • LL Header: 04 06 详见 Vol 6, Part B, 2.3

    • PDU Type: 0100b (4bits), SCAN_RSP,不同类型的广播包Payload的数据格式不同. PDU类型的说明详见:Vol 6, Part B, 2.3, Table 2.3
    • RFU: 0b (1bit)
    • ChSel: 0b (1bit)
    • TxAdd: 0b (1bit), 公共地址,需要向SIG机构购买(TxAdd = 0); 随机地址(TxAdd =1)
    • RxAdd: 0b (1bit)
    • length: 06 (0x06) payload长度
  • LL Payload: 3a 02 d1 8a 09 b8, SCAN_RSP的数据格式详见:Vol 6, Part B, 2.3.2.2

    • AdvA: 3a 02 d1 8a 09 b8 (0xb8098ad1023a), BLE的MAC地址,随机地址的最高两位应该为11b
  • CRC: 66 dd 64(0x66dd64)

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值