BLE 自适应跳频及算法实现

        BLE协议运行在2.4G ISM频段上,由于诸如Wi-Fi,ZigBee等都在此频段上,因此干扰是比较严重的。需要在此频段上进行有效的数据交互,自适应跳频技术是必不可少的,废话不多说,咱们直接进入主题,讨论下的BLE协议中的自适应跳频,以及跳频算法的实现。

我们称主设备为Master(手机、PC机等),从设备为Slave(手环等)。Master向Slave发送connect request,需要与slave建立连接。在slave收到Master发出的connect request时,在开始建立连接的同时也要更新和计算的Master的channel map表,以及下一个连接使用的频点。

如下图所示,为Master发出的CONNECT_REQ的Payload,图中的ChM和hop参数,分别表示Channel map表,即建立连接后有哪些channel是可以被使用的,有哪些channel是不可用的。hop表示跳数,表示跳频每次的跳频的间隔。


例如,ChM 和 Hop分别为 ChM[5] = {0x02,  0x56, 0x49, 0x13, 0x11]; hop = 5;

将ChM转换为二进制数,则为00010001 00010011 01001001 01010110 00000010,频道位被置为1的表示该信道可用,信道位被置为0表示该信道不可用。那么可用的频道used = [1, 9, 10, 12, 14, 16, 19, 22, 24, 25, 28,32, 36 ];可使用的信道数numUsed = 13。

接下来需要计算下一个连接使用的频道

   fn+1 = (fn + hop) mod 37; fn+1 = (0 + 5) % 37; 即下一个频道的channel为5,但是5不是一个好的channel,因此需要从好的channel表里找一个channel,即used[5 % numused] = used[5 % 13] = 16;

    再下一个连接使用上一个未映射的信道来计算,fn+1 = (fn + hop) mod 37; fn+1 = (5 + 5) % 37 = 10,channel 10是一个好的channel,在下一个连接就用channel 10。

    对应的计算的计算连接channel的算法:





u8 chn_table[40];
u16 ll_chn_idx;




/**
**计算channel map,分辨哪些channel是好的, 哪些channel是“坏”的,将好的channel存储到table内
**根据跳频算法,和跳数(hop)来填满channel table,以便于在下个interval来获取
**

**
*********************************************/


u8 updata_chn[5] = { 0x02, 0x56, 0x49, 0x13, 0x11 };
u8 hop;

int chn_table_calc(u8 *chn_map, u8 hop)
{
u8 k = 0, numused = 0;
u8 tmp_table[37];


for (int i = 0; i < 37; i++) {


if (chn_map[i >> 3] & BIT(i & 0x07)) //chn map中某一个bit设置为1时,就认为这是个好channel
{
tmp_table[numused++] = i; //找出所有好的channel
}
}


u8 ll = 0;
for (int i = 0; i < 37; i++) {
k += hop;
if (k >= 37) {
k -= 37;
}


if (chn_map[k >> 3] & BIT(k & 0x7)) { //跳频后正好对应的是好channel
chn_table[ll] = k;
}
else { //跳频后未对应好的channel,则fn+1 = tmp_table[(hop + fn)% chn_cnt_num]
u8 m = k;
while (m >= numused) {
m -= numused;
}
chn_table[ll] = tmp_table[m]; //将下一个连接的channel映射到好的channel上


}
ll++;
}
return numused;
}

int main()
{
// init frequency hop param


hop = 5;
u8 num = chn_table_calc(updata_chn, hop);


printf("The num of channel be used is %d\n", num);
for (int i = 0; i < 37; i++) {
printf("Next channel is %d\n", chn_table[i]);
}

    return 0;
}


最终运行的结果:



到此,BLE自适应跳频算法的原理,以及代码的实现就结束了。


  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值