【蓝牙】跳频算法实例分析
抓包工具:frontline
跳频计算公式:F(n+1) = (F(n) + hop) % 37
其中:
F(n+1)为下一个连接事件使用的信道;
F(n)为当前连接事件使用的信道;
hop为跳频数,取值范围[516],由主机在发起连接的时候决定(CONNECT_IND);
公式在代码中可以简化为:
若 F(n) + hop < 37,则 F(n+1) = F(n) + hop
若 F(n) + hop > 37,则 F(n+1) = F(n) + hop - 37
CONNECT_IND(连接请求包)
连接请求包中包含公式中提到的hop值
连接请求包中包含当前可使用的Channel Map图,该Map图中所有信道都可用
Channel Map共5个字节,每个bit表示一个信道,包含广播信道(没有实际含义)
Connect Event(连接事件)
ch默认值为0,由“CONNECT_IND”可知,hop = 10,代入公式:
F(n+1) = (F(n) + hop) % 37 = (0+10)%37 = 10
所以,第一个连接事件发生在ch10
CHANNEL_MAP_IND(信道更新)
由“CONNECT_IND”可知,hop = 10
由Channel Map可知,好信道数为29个,坏信道数为8个
由connInstant可知,Event Counter为0x007c的时候需要应用该Channel Map
好信道映射到数组map[29]中为:
Code: Select all
map[0] = ch0;
map[1] = ch9;
map[2] = ch10;
map[3] = ch11;
map[4] = ch12;
map[5] = ch13;
...
代入公式
Code: Select all
ch10 = ch29 + 10 - 37 = ch2, ch2是坏信道,需要重映射:2%29 = 2,所以map[2] = ch10
ch12 = ch2 + 10 = ch12,ch12是好信道
ch22 = ch12 + 10 = ch22,ch22是好信道
ch32 = ch22 + 10 = ch32,ch32是好信道
ch13 = ch32 + 10 - 37 = ch5,ch5是坏信道,需要重映射:5%29 = 5,所以map[5] = ch13
ch15 = ch5 + 10 = ch15,ch15是好信道
重映射:坏信道对好信道的总数N进行取余