BLE Long Range(也称为Coded PHY)是蓝牙5.0引入的新特性,它通过前向纠错(FEC)编码技术,显著提升了蓝牙的通信距离和可靠性。下面这个表格汇总了BLE Long Range帧的主要组成部分,你可以快速了解其核心结构:
| 组成部分 | 长度 (Coded PHY) | 功能描述 |
|---|---|---|
| 前导码 (Preamble) | 80或80比特 | 用于接收机的时间和频率同步。 |
| 编码指示符 (CI) | 2比特 | 指示FEC Block 2使用的编码方案:01表示S=8,10表示S=2。 |
| 接入地址 (Access Address) | 256比特 | 标识数据包身份。广播包固定为0x8E89BED6;数据包则为连接的随机值。 |
| FEC Block 1 (包含PDU) | - | 经过FEC编码(S=8)的数据块,承载核心的协议数据单元。 |
| TERM1 | 3或11比特 | FEC Block 1的终止符。 |
| FEC Block 2 (包含CRC) | - | 编码方案由CI指示(S=2或S=8),包含CRC校验码。 |
| TERM2 | 3或11比特 | FEC Block 2的终止符。 |
🔍 详解帧结构与数据关系
BLE Long Range的帧结构设计是其实现长距离和强抗干扰能力的关键。
-
核心机制:前向纠错 (FEC):BLE Long Range通过降低物理层传输速率并加入冗余信息来实现更远的传输距离。接收端可以利用这些冗余信息自动检测并纠正传输过程中的错误,无需重传,从而在信号更弱的条件下也能保证通信。这种编码过程产生了两个主要的FEC块:
- FEC Block 1:始终使用S=8编码(即1个原始数据位扩展为8个符号位,有效速率为125kbps),负责承载核心的协议数据单元(PDU)。
- FEC Block 2:其编码方案由CI字段动态指示,可以是S=2或S=8,负责承载CRC校验码等信息。这种灵活性允许在数据负载的可靠性和传输效率之间进行权衡。
-
数据生成与流动:应用数据首先按照蓝牙协议栈的层次结构,从ATT/GATT层开始,经过L2CAP层封装,形成LL PDU。这个PDU在Long Range模式下,会被放入帧结构中的FEC Block 1。随后,系统会为PDU计算一个CRC校验码,并将其放入FEC Block 2。CI字段则根据对链路质量和传输效率的考量,被设置为相应的值,以指明FEC Block 2使用的编码方案。
🎯 特别注意CI字段
CI(Coding Indicator) 是一个至关重要的2比特字段,它紧跟在接入地址之后,直接决定了FEC Block 2所使用的编码方式:
- 当
CI = 01时,表示FEC Block 2使用 S=8编码(125kbps速率)。 - 当
CI = 10时,表示FEC Block 2使用 S=2编码(500kbps速率)。
这里有一个关键点:FEC Block 1(承载PDU)始终使用S=8编码。而CI字段仅指示FEC Block 2的编码方式。这样的设计使得接收设备能够正确解码紧随其后的FEC Block 2,从而获取CRC等信息,完成数据包的校验。
💎 小结
BLE Long Range通过引入FEC编码机制,构建了一个包含FEC Block 1和FEC Block 2的帧结构。CI字段作为连接这两个部分的“指令官”,确保了接收方能准确解析整个数据包。这种以牺牲一定传输速率换取极高通信可靠性的方式,正是BLE Long Range实现超远距离通信的秘诀。
希望这些解释能帮助你更好地理解BLE Long Range的帧格式。如果你对协议中其他部分(例如不同类型的PDU结构)还有兴趣,我们可以继续探讨。
** 送给BLE Long Range modem的比特流无法像1M/2M PHY那样,以简单的LSB顺序直接、清晰地辨认出各个字段的边界。
下面是详细的解释,说明为什么不能以及它是如何工作的。
BLE 1M/2M PHY:简单直观
在1M/2M PHY下,数据包的构成是直接的串联:
[8-bit Preamble] + [32-bit Access Address] + [PDU] + [CRC]
- 调制方式:使用GFSK,1个比特对应1个调制符号。
- 结果:比特流与符号流一一对应。接收机可以通过寻找特定的前导码模式(如
01010101或10101010),很容易地实现比特同步,一旦同步,后续的Access Address、PDU等字段的边界就自然确定了。你可以像读一个字节数组一样,按位去解析它。
BLE Long Range (Coded PHY):复杂且具有状态性
BLE Long Range的整个发送和接收过程是一个状态机,其流程和结构远比1M/2M模式复杂。下图清晰地展示了这一过程:
flowchart TD
A[输入: 原始比特流] --> B[FEC 编码器<br>S=2 或 S=8]
B --> C[模式转换<br>比特→符号对]
C --> D[调制器<br>(发送波形)]
E[接收机<br>(捕获波形)] --> F[状态1: 搜索前导码<br>进行“符号同步”]
F -- 同步成功 --> G[状态2: 解码CI<br>需切换模式]
G -- CI指示S=2 --> H[模式A: FEC Block 2 = S=2]
G -- CI指示S=8 --> I[模式B: FEC Block 2 = S=8]
H & I --> J[完成整个数据包解码]
造成这种复杂性的根源在于两个关键技术:
-
前向纠错 (FEC) 编码
- S=2编码:将1个原始比特扩展为2个符号的码字。有效速率500kbps。
- S=8编码:将1个原始比特扩展为8个符号的码字。有效速率125kbps。
- 后果:比特流和最终发送的符号流不再是1:1的关系。你无法通过数比特来直接定位边界,因为1个比特已经“扩散”成了2个或8个符号。
-
模式转换 (Pattern Mapper)
- 这是最关键的一点。编码器输出的并不是简单的
0和1,而是符号对。 - 它遵循一个查找表,例如:
11->+-(映射到频率偏差)10->++00->-+01->--
- 后果:整个发射过程是一个连续的状态机。接收机必须首先在符号级别进行同步,识别出经过扩展和模式映射后的前导码模式,而不是在比特级别。
- 这是最关键的一点。编码器输出的并不是简单的
接收机如何工作:一个状态机的过程
接收机无法直接“看到”边界,而是必须通过以下步骤来推断出边界:
-
第一阶段:搜索前导码 (Preamble)
- 接收机在符号流中搜索一个已知的、重复的符号模式。这个模式对应于经过S=8编码和模式映射后的80-bit前导码(例如,80个
1或0)。 - 此阶段的目标是达成符号同步和频率同步。接收机此时还不知道CI和Access Address的起始边界。
- 接收机在符号流中搜索一个已知的、重复的符号模式。这个模式对应于经过S=8编码和模式映射后的80-bit前导码(例如,80个
-
第二阶段:解码CI (Coding Indicator)
- 一旦前导码同步完成,接收机就知道接下来的符号属于CI字段。
- 关键:CI字段自身也是经过S=8编码的。接收机必须对这2比特对应的符号组进行解码,才能得到CI的值(
01或10)。 - 直到这一刻,接收机才确定了FEC Block 2的编码方案(S=2还是S=8)。
-
第三阶段:解码接入地址 (Access Address) 和 FEC Blocks
- 接收机继续解码接下来的符号流。Access Address同样使用S=8编码。
- 在解码完Access Address后,接收机进入FEC Block 1。FEC Block 1的终止符TERM1告诉解码器这里是一个边界。
- 然后,接收机根据第二阶段解码出的CI值,切换到相应的模式(S=2或S=8)去解码FEC Block 2。
总结对比
| 特性 | BLE 1M/2M PHY | BLE Long Range (Coded PHY) |
|---|---|---|
| 同步级别 | 比特同步 | 符号同步 |
| 字段可见性 | 比特流中直接可见 | 比特流中不可见,被编码和映射 |
| 解析方式 | 简单的线性解析 | 复杂的状态机解析 |
| 关键依赖 | 找到前导码即可知一切 | 必须解码CI后才能解析后半部分数据包 |
所以,回到您的问题:您无法从送给modem的比特流中直接辨认出边界。整个结构对于调制器来说是一个连续的、经过编码和映射的符号序列,而对于解调器来说,是一个需要通过同步、解码CI来逐步推进的状态机过程。CI的作用就是在这个状态机中,作为一个关键的模式切换指令。
在BLE LongRange (Coded PHY)模式下,整个数据包,从第一个比特到最后一个比特,包括Preamble、Access Address、CI、TERM、PDU和CRC,全部都会经过FEC编码和模式映射的处理,然后才被送给调制器。
这与BLE 1M/2M PHY有根本性的不同。为了更直观地理解这两者的本质区别,我们可以通过下图来对比它们的数据处理流程:
flowchart TD
subgraph BLE_1M_2M [BLE 1M/2M PHY 处理流程]
A1[原始数据包比特<br>Preamble/AA/PDU/CRC] --> A2[直接调制<br>GFSK]
A2 --> A3[输出射频信号]
end
subgraph BLE_LR [BLE LongRange PHY 处理流程]
B1[原始数据包比特<br>Preamble/AA/CI/PDU/CRC] --> B2{FEC 编码器}
B2 -- 整个数据包<br>统一进行S=8编码 --> B3[模式映射<br>比特→符号对]
B3 --> B4[调制并输出<br>射频信号]
B2 -- CI字段 --> B5[解码CI]
B5 -- 指示FEC Block 2<br>使用S=2编码] --> B6[FEC Block 2 部分<br>单独进行S=2编码]
B6 --> B3
end
如上图所示,BLE LongRange的处理流程核心在于:
- 整体统一编码:数据包被看作一个整体进行第一阶段的FEC编码(S=8)。这意味着Preamble、Access Address、CI等控制字段本身也成为了“被保护的数据”,它们不再是直接可辨的简单比特序列。
- 动态编码切换:唯一的特殊性在于CI字段,它自身被S=8编码保护,但其内容(
01或10)决定了数据包后半部分(FEC Block 2)是继续使用S=8还是切换到S=2进行编码。这正是接收机需要先解码CI才能解析后续数据的原因。 - 符号流输出:最终,所有经过编码的比特都会通过“模式映射器”转换为在空气中传输的复杂符号流(如
+-,++等)。
所以,你无法在送给调制器的比特流中直接找到清晰的字段边界,因为整个结构已经被FEC编码“打散”和“重塑”了。接收机必须作为一个复杂的状态机,通过同步、解码CI,才能一步步地还原出原始的数据包结构。这正是BLE LongRange为实现更远距离和更强抗干扰能力所付出的代价——接收机复杂度的显著增加。
4731




被折叠的 条评论
为什么被折叠?



