1. 蓝牙低功耗(BLE)序列号机制解析
在蓝牙低功耗(BLE)通信中,SN(Sequence Number)和NESN(Next Expected Sequence Number)是实现数据包有序传输的基础机制。这对看似简单的1比特字段,实际上承载着确保数据可靠性的重要使命。
每个BLE数据包头部都包含这两个字段:
- SN:当前数据包的序列编号(0或1)
- NESN:接收方期望收到的下一个数据包编号(0或1)
这种设计源于BLE协议对低功耗的极致追求。传统无线协议(如Wi-Fi)通常使用多字节的序列号,而BLE仅用1比特就实现了基本的有序传输控制。当设备A发送SN=0的数据包时,设备B会在ACK中回复NESN=1,表示"我已收到0,现在期待1"。如果设备A没有收到ACK,它会重传SN=0的包,直到收到NESN=1的确认。
关键点:SN/NESN的翻转频率直接影响功耗。过于频繁的重传会导致能耗上升,因此实际应用中需要合理设置重传间隔。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 流控机制的工作原理
2.1 基础确认机制
BLE采用简单的交替确认模式:
- 发送方发出SN=0的数据包
- 接收方成功接收后,在回复包中设置NESN=1
- 发送方下次发送时使用SN=1
- 如此循环往复(0→1→0→1...)
这种机制能检测以下异常情况:
- 数据包丢失(未收到预期SN的包)
- ACK丢失(发送方未收到确认)
- 乱序到达(收到非预期的SN)
2.2 重传策略
当出现通信异常时,系统会触发重传:
- 发送方在超时未收到ACK时,重传相同SN的包
- 接收方发现收到的SN与预期NESN不符时,会丢弃包并维持原NESN
- 连续重传达到最大次数(通常6次)后,链路层会断开连接
典型的重传超时时间(约150ms)考虑了以下因素:
- BLE的典型往返时间(RTT)
- 主机处理延迟
- 射频环境波动余量
3. 协议栈实现细节
3.1 链路层状态机
BLE控制器内部维护着复杂的状态机来处理SN/NESN:
code复制Idle → Tx(SN=0) → Wait_ACK
↑_________↓
状态转换规则:
- 成功发送后SN翻转
- 收到ACK且NESN匹配才更新SN
- 超时或NESN不匹配则保持SN
