// BLE连接有关的技术分析
前言
本文的论述流程:
- 将传统的连接通信与广播进行对比,指出其不足
- 说明BLE是如何制定规范解决这些问题
- 写出完整的连接通信流程,并对能影响BLE连接通信的参数进行分析
1 连接通信的不足
- 保持连接是一个相当消耗资源的过程,特别是在没有数据传输的时候
- 在链路层的hopping和信道白名单的切换会让底层产生很长时间的连接延迟
- 连接并不稳定。和广播的方式一样,存在超时和其他因素导致的断连
2 BLE connection
- 在制定BLE规范时,极大的简化了连接的建立过程,使连接速度可以达到毫秒级。
- 为了节省功耗,也调整了跳频的策略。
- BLE面向连接的通信可以传输更多的数据,且几乎没有额外的代价。
本文将接着分析和面向连接的通信技术,包括连接的建立和断开、BLE跳频(Hopping)技术、Link Layer的应答、重传、流控等等。
3 连接过程
遇事不决来张图
3.1 connection setup
创建连接
定义了两种Link Layer角色:Master和Slave。Master是连接的发布方(Initiator),可以决定和连接有关的参数。Slave是连接的发起(Advertiser),可以请求或建议连接参数,但无法决定。
方式一:
Advertiser(发起者)在广播信道上发送CONNECT_IND PDU,Initiator(发布者)收到后向从结点发送AUX_CONNECT_RSP PDU,链路层(LL)即进入连接状态(connection state)。此过程两个方向都使用的是LE 1M PHY。
方式二:
Slave在广播信道上发送AUX_CONNECT_REQ,Master收到后向从结点发送AUX_CONNECT_RSP PDU。此过程两个方向使用相同的PHY(1M / 2M / S2 / S8)即可,且可以用PHY Update更改。
AUX_CONNECT_REQ携带了可决定后续“通信时序”的参数,例如双方在哪一个时间点,哪一个Physical Channel收发数据等。Initiator发送AUX_CONNECT_REQ后变为Master,Advertiser在收到AUX_CONNECT_REQ后变为Slave
AUX_CONNECT_REQ格式:
InitA (6) | AdvA (6) | LL Data (22) |
---|---|---|
master add | slave add | AA(4) CRCInit(3) WinSize(1) WinOffset(2) Interval(2) Latency(2) Timeout(2) ChM(5) Hop(5) SCA(3) |
- CRCInit,用于CRC计算的一个初始值,由Link Layer随机生成。
- WinSize和WinOffset,用于决定连接双方收发数据的时间窗口
- Latency和Timeout,和连接超时、自动断开有关
- ChM的全称是Channel map,用于标识当前使用和未使用的Physical Channel
建立连接
当Slave收到数据包时才是建立了连接。
从Master的视角看,当它发出CONNECT_REQ后,会在1.25 ms + transmitWindowOffset 到 1.25ms + transmitWindowOffset + transmitWindowSize(时间窗口)之间,发送第一个packet
transmitWindowSize必须是1.25ms的倍数,最小值是1.25 ms,最大值是(conn_int - 1.25 ms),但不能超过10ms
建立连接后,Slave不得向已连接设备发送连接请求。若Master收到了则会忽略。
3.2 connection event
一个event对应一个传输周期,由conn_int确定
发送数据
双方按照AUX_CONNECT_REQ所给出的约定,定时到切换到某一个Physical Channel上,按照M->S然后S->M的顺序收发数据,直至发送结束后连接断开或者一个传输周期结束。
Master在一个连接事件内至少发送一次数据包。Slave则可以选择在n个链连接事件内至少发送一次数据包,这由参数connSlaveLatency决定,connSlaveLatency在0到((connSupervisionTimeout / (connInterval*2)) - 1)之间,并且不能大于500。
数据格式叫Data Channel PDU,Data Channel PDU有两类,一类是数据,称作LL Data PDU;另一类是控制信息,称作LL Control PDU。
Header(16 bits) | Payload(Variable size) | MIC(32 bits) |
---|---|---|
LLID(2) NESN(1) SN(1) MD(1) RFU(3) Length(8) | [0~255] | / |
- LLID用于区分PDU的类型
- NESN(Next Expected Sequence Number)和SN(Sequence Number),用于数据传输过程中的应答和流控
- MD(More Data),用于连接的关闭(或保持)
- RFU(Reserved for Future Use)
- Length,有效数据的长度(Payload+MIC),只有8bits,因此Link Layer所能传输的最大数据是255。如果L2CAP需要传输更多的数据,需要分包之后传输
自动确认机制
当设备B接收到一个packet的时候,会将该packet的NESN和本地的sn比较:
- 如果相同,说明是设备A发来的NAK packet,即请求重发,则将旧的packet重新发送
- 如果不同,说明是设备A发来的ACK packet,即数据被正确接收,则将本地的sn加1,接着发送新的packet
连接的控制与管理
连接建立之后,Master或者Slave可以借助Link Layer Control Protocol (LLCP),通过LL Control PDU,对连接进行管理控制
同时在LL Data PDU的Header中,有NESN和SN两个标记,利用它们,可以很轻松的在Link Layer实现应答、重传、流控等机制
- sn用于标识设备A发送出去的packets
- nesn是设备B用来应答设备A发送的packet
连接超时及断开
- 预期内的、主动断开,会走Termination Procedure
- 非预期的原因导致的超时断开,如距离超出、遭受严重的干扰、突然断电等,会走超时机制
i 建立连接中的超时
ii 连接成功后的超时
3.3 连接通信参数
tIFS:每一组数据包发送应答之间存在发送间隔,T_IFS被设置为150 µs
tC:一个连接事件中,连续发送数据包的时间
tF_Slave:Slave的连接容量
将每个个体时间乘以得到通用连接事件中从机消耗的能量得到总耗能:
Ec = Epre + Epost + (2n − 1)EIFS +
∑
1
n
\sum_1^n
∑1n(EMi + ESi)
参考资料:
BLEach Exploiting the Full Potential of IPv6 over BLE in Constrained Embedded IoT Devices
Bluetooth core v5.4 vol6 part B
蜗窝科技,www.wowotech.net