前言
前篇博文LE States and Packets 已经介绍了LE 设备在不同通信模式下承担不同的角色,为了方便管理蓝牙设备在多个角色间的切换,链路层使用了状态机来管理蓝牙当前的状态及该状态下支持的通信模式。同时,也介绍了BLE 链路层的两种基本报文格式,以及在不同物理信道上传输时PDU (Protocol Data Unit) 结构的差异。
BLE 设备链路层的报文是上层应用数据的载体,也是通信双方实现无线传输的基础,了解了这些基本报文结构,接下来看通信双方如何传输这些报文。
一、Broadcast communication
从BLE 链路层状态迁移图可知,LE 设备可支持三种广播通信模式:
- Advertising State — Scanning State:使用广播信道进行一对多单向通信,广播报文间相互独立,只能传输不超过255 字节的数据;
- Synchronization State — Isochronous Broadcasting State:使用广播信道进行一对多单向通信,可以传输同步数据流BIS(比如音频数据流),这两个状态是在Bluetooth 5.2 中新增的;
- Advertising State — Initiating State:使用广播信道向目标设备发起连接,并传递连接参数,双方成功建立连接后都将进入Connection State,两个处于连接状态的设备使用数据信道进行一对一双向通信。
1.1 Advertiser — Scanner
先看短报文的广播通信模式,比较基本的广播通信是广播者在3 个固定广播信道上轮流发送广播报文,扫描者在 3 个固定广播信道上依次扫描附近空间中是否有Scannable 广播报文(比如ADV_IND、ADV_SCAN_IND等),如果附近有可扫描广播报文且广播时间在扫描窗口范围内,扫描者就可以接收到广播者发出的广播报文。
下图给出了基本的广播通信过程示意图,扫描者需要在相同的广播信道才能接收到广播报文,因此扫描窗口的时间一般大于一次广播事件(广播者在所有被使用的广播信道上依次发送广播报文的过程,右图给出了广播事件开始与结束的标识,ADV_IND 是一个广播报文)的时间:
两个广播事件之间的间隔时间称为Advertising interval,广播间隔advInterval 支持的范围是 20ms — 10485.76 s 且为0.625 ms 的整数倍(本文展示的是Bluetooth 5.2 的标准,跟Bluetooth 4.x 的标准有所不同)。扫描窗口scanWindow 与扫描间隔scanInterval 时间设置应小于40.96 s,且scanWindow 的值不能大于scanInterval 的值,建议scanWindow 的值不小于advInterval。
为了避免多个广播者可能在很长一段时间同时广播造成干扰,两个广播事件之间的时间间隔T_advEvent 会在广播间隔advInterval 的基础上再加上一个0 — 10ms 的随机延时advDelay。这样,即使两个广播者的advInterval 相同,并在相同的信道和时间点上同时发送造成干扰,也会在下一个广播事件因随机延时advDelay 的不同而避开相互干扰。
扫描者支持主动扫描和被动扫描两种模式,前面介绍的扫描者仅侦听并接收广播报文属于被动扫描,主动扫描则是指扫描者可以向特定广播者发送扫描请求报文,广播者收到扫描请求报文后在相同的广播信道上向其回复扫描响应报文(扫描请求与响应过程也会计算在一个Advertising Event 中),扫描者就可以从广播者获得更多的附加信息。主动扫描与被动扫描过程图示如下(右图中的T_IFS 指的是相同信道上两个连续报文之间的时间间隔,值为 150 us):
前篇博客介绍过,Legacy Advertising PDU 可以承载的广播数据最长为31 字节,如果想承载更多的广播数据,可以使用Extended Advertising PDU,不仅单个报文可承载最大254 字节广播数据,还可借助AUX_CHAIN_IND 报文在后面链接更多广播数据。Secondary Advertising PDU 都靠ADV_EXT_IND 报文引导,使用扩展广播报文的主动扫描与被动扫描过程图示如下:
注:我们从前篇博文中知道非扩展广播报文的AdvData 最大为31 octets(跟byte 一样都表示8 bits),扩展广播报文的AdvData 最大为254 octets,前面我们也知道非定向广播事件的间隔时间最小为20 ms + 5 ms(随机时延按平均值5 ms 计),可以大概计算非扩展广播报文的最大通信速率为 8 * 31 bytes / 25 ms = 9.92 Kbps,扩展广播报文的最大通信速率为8 * 254 bytes / 25 ms = 81.28 Kbps。如果再算上传输扫描响应报文,最大通信速率可以double,也即分别为19.84 Kbps 和 162.56 Kbps,通信速率依然比较低,且因为单向通信、不加密传输、没有确认应答机制,广播通信属于不可靠通信。
1.2 Advertiser — Initiator
Initiator 侦听到Connectable 广播报文后会发送连接请求报文(比如ADV_DIRECT_IND、ADV_IND等),以便双方建立连接(Initiator 侦听Connectable 广播报文的过程跟Scanner 侦听Scannable 广播报文的过程类似)。如果要建立连接的双方知道对方的Device Address(或MAC Address),广播者可以发送定向广播报文ADV_DIRECT_IND 实现快速连接,如果是首次连接不知道对方Device Address 发送ADV_IND 广播报文也是支持Connectable 的。
Connectable directed advertising 除了支持前面介绍的low duty cycle mode 外,还支持更快速的high duty cycle mode,这两种模式区别如下:
- Low duty cycle connectable directed advertising:广播事件间隔较长,广播间隔时间T_advEvent 范围 20ms — 10485.76 s;
- High duty cycle connectable directed advertising:广播事件间隔较短,广播间隔时间T_advEvent 范围 3.75 ms — 1.28 s;
BLE 低功耗主要是靠大幅降低通信时间,让LE 设备大部分时间都处于睡眠状态实现的。对于面向连接的LE 设备,只在需要传输数据时才建立连接,数据传输完成马上关闭连接并进入睡眠状态。对于连接双方已经知道对方Device Address 的情况,尽快建立连接能降低响应延迟同时降低功耗,因此BLE 为connectable directed advertising提供了high duty cycle mode,让通信双方建立连接的时间可以缩短到3.75 ms 。不过high duty cycle mode 比较耗电,因此该模式持续时间比较短(不超过1.28 秒),若在high duty cycle mode 持续期间未能成功连接,则可以切换到low duty cycle mode 继续尝试连接。
前篇博客介绍过,Initiator 使用Primary Physical channel 发送CONNECT_IND 后直接进入Connection State,发起者并不知道对方是否接收到了CONNECT_IND 报文,双方建立连接后在发送CONNECT_IND 报文的LE 1M PHY 上通信(后续可以通过PHY Update procedure 更换到其它PHY)。Initiator 使用Secondary Physical channel 发送AUX_CONNECT_REQ 后,还需要等待对方回复AUX_CONNECT_RSP 报文,接收到对方回复的报文后才进入Connection State,进入连接状态前多了个确认过程,双方建立连接后在发送AUX_CONNECT_REQ 报文的PHY 上通信(可以是LE 1M PHY、LE 2M PHY 或LE Coded PHY),Initiator 向目标设备发送AUX_CONNECT_REQ 并接收响应的过程图示如下:
1.3 Isochronous Broadcaster — Synchronized Receiver
Isochronous Broadcaster 与Synchronized Receiver 之间可以单向传输BIG(Broadcast Isochronous Group,比如音频数据流),每个BIG 由一个或多个BIS(Broadcast Isochronous Stream) 组