BLE中LL层的跳频机制

发布时间 2023-08-15 16:54:17作者: 不回本不改名

BLE中LL层的跳频机制

介绍

​ 为了保证通信的抗干扰性,在BLE LL层中设计了一个跳频机制。一般而言,在BLE中跳频只针对连接事件,而广播事件(周期性广播除外)是固定在37,38,39三个信道上发送的。另外BLE和传统BT的跳频机制是有所区别的,这里我们只针对SPEC中BLUETOOTH CORE SPECIFICATION Version 5.1 | Vol 6, Part B 4.5.8 Data and periodic physical channel index selection章节相关内容进行分析。

信道分类

​ 在连接建立时,主设备应该扫描好BLE的37个连接信道,然后根据其空闲程度将其划分为可用信道和不可用信道两个类别。并形成一张Channel Map,由主机发给从机。随后双方根据特定算法,每次进行连接事件时选择Channel Map上其中一个可用信道进行通信。由于每次进行连接事件的信道频率都有所不同,所以这种机制又叫跳频。

信道选择算法1

基本流程

基本算法如下:

\[f_{n+1}=(f_n+hop)\%37 \]

其中\(f_{n}\)为本次使用的信道,初值为0;\(f_{n+1}\)为下一次的使用的信道;\(hop\)为跳频阶跃值,取值为5-16;%为取模符号。

流程如下:

  1. 主机随机选择一个hop值,随后以\(fn\)初值为0开始计算\(f_{n+1}\)
  2. 检查Channel Map,如果\(f_{n+1}\)为可用信道,则下次连接事件直接在该信道进行。
  3. 如果\(f_{n+1}\)为不可用信道,则按如下算法重新计算:

\[f_{new}=f_{n+1} \% N \]

其中,\(f_{n+1}\)为前面算出来为不可用信道,\(f_{new}\)为Channel Map中可用信道的序号(升序),\(N\)为Channel Map中的可用信道的数量;

示例

示例一:

  1. \(fn\)=10, \(hop\)=8, 信道地图中的可用信道=[7, 8, 9,18, 21, 22, 23, 31, 32];
  2. \(f_{n+1}\)=(10+8) % 37=18, 因为18是可用信道,直接使用;
  3. 则下一次使用18信道作为连接事件使用的信道;

示例二,这里我们把18设为不可用信道:

  1. \(fn\)=10, \(hop\)=8, 信道地图中的可用信道=[7, 8, 9,17, 21, 22, 23, 31, 32];
  2. \(f_{n+1}\)=(10+8) % 37=18, 因为18不是是可用信道,需要重新计算;
  3. \(f_{new}\)=18 mod 9 (可用信道数) = 0, 则\(f_{new}\)= 0。
  4. 下一次连接事件使用可用信道列表中,序号为0的信道。即第一点中的7信道(物理信道从低到高,升序)。

信道选择算法2

​ 算法二比算法一要更复杂,但性能更好。算法二的跳频随机性更好,能保证整个信道频谱能量更分散,发射功率谱密度更低。能更好的满足各国无线电法规中的发送功率要求。另外算法一只能用于连接事件,而算法二除了连接事件,还可以用与扩展广播。

基本流程:

​ 算法二和一的基本思路一致。但在算法二中,跳频阶跃值\(hop\)不是选中后就固定不变的,而是会在每次的连接事件中通过伪随机算法重新计算。

这里可以分为两个步骤:

  1. 得到随机跳频阶跃值\(prn\_e\)
  2. \(prn\_e\)算出新的跳频信道\(unmappedChannel\)
  3. 如果新的跳频信道不属于可用信道,用\(prn\_e\)参数重新计算\(unmappedChannel\)

生成\(prn\_e\)

这里的\(prn\_e\)最复杂,整体的计算方法如下:

其中:

  • \(counter\):当前信道值
  • \(channelidentifier\):Access Address的高16bit和低16bit进行XOR运算

而上述框图中:

  • XOR:代表异或操作
  • MAM代表如下算法操作

  • PERM代表如下算法操作

上述过程比较复杂,就不具体说明了。

生成\(unmappedChannel\)

在前面算出随机数\(prn_e\)后,再利用其算出下一次要跳频到的信道\(unmappedChannel\)。这里如果\(unmappedChannel\)属于可用信道,则直接使用。

如果不属于可用信道,则重新计算。

重新计算\(unmappedChannel\)

这里重新计算的方法和算法一类似,不再赘述。

示例

算法二的计算比较繁琐。这里我用ellisys自带的计算工具来演示:

这里先随便抓一包,随便得到一个access address。

然后打开计算器,设置下channel map,把刚刚抓到的access address复制进去,初始值counter我们默认为0好了。

随后计算器就算出来,0-4的连接事件会在哪信道上进行。