BLE跳频机制在2.4G键鼠中的应用
WCH的键鼠方案中,1K/8K方案均包含了稳定有效的2.4G跳频方案。
接下来通过几个问答,引入沁恒键鼠方案中2.4G跳频机制的说明。
问①:如何检测当前环境中的信道拥堵情况?
答①:BLE协议中,这项工作主要交给BLE主机;2.4G方案中则交给dongle接收头来完成。沁恒的2.4G库中封装了API,以2MHz为间隔,扫描2.4G频段的信道能量,输出良好信道频谱数组。扫描一轮40个信道,需要3~4ms,可分组扫描不必一次扫完。
信道扫描接口:
/*先声明,再使用*/ /******************************************************************************* * @fn BLE_CheckHoppingMap * * @brief * * input parameters * * @param rssi - 干扰信息阈值. * map - bit0-bit39 1-表示通道有效,即需要检测的通道 * * output parameters * * @param map - bit0-bit39 1-表示通道无大于设定阈值rssi的干扰信息 * * @return None. */ int8_t BLE_CheckHoppingMap( int8_t rssi, uint8_t map[] ) //测试代码块: { extern int8_t BLE_CheckHoppingMap( int8_t rssi, uint8_t map[] ); // 需要检测的通道,bit0-bit39 1-表示通道有效,即需要检测的通道 uint8_t map[5] = {0xFF,0XFF,0XFF,0XFF,0XFF}; // -85 为设定的干扰信号阈值,即检测能量大于-85认为有干扰信息 BLE_CheckHoppingMap( -85, map ); for(int i=0;i<5;i++ ) { for(int j=0;j<8;j++ ) { if( map[i]&(1<<j) ) { PRINT("channel %d ok\n",(i*8 + j)); } else { PRINT("channel %d bad\n",(i*8 + j)); } } } PRINT("\n"); } /* 输出结果 channel 0 ok channel`1`ok channel 2 ok channel 3 ok channel`4 ok channel 5 ok channel 6 ok channel`7 ok channel 8 ok channel 9 ok channel 10 ok channel 11 ok channel 12`ok channel 13 ok channel 14 bad channel 15 bad channel 16`bad channel`17 bad channel 18 bad channel 19 ok channel 20 ok channel 21 ok channel`22`ok channel 23 ok channel 24 ok channel 25 ok channel 26 ok channel 27`ok channel 28 ok channel 29 ok channel`30 ok channel 31 ok channel 32 ok channel 33 ok channel`34 ok channel 35 ok channel 36 ok channel 37`ok channel 38 ok channel`39 ok */
问②:如何实现信道拥堵情况的实时监控?
答②:在使用当前已同步的良好信道频谱通信OK时,dongle不会主动扫描信道。
若每次跳频轮到某个信道,都会产生连续丢包,接连发生3轮,则dongle判断当前使用的信道频谱被污染,需要重新扫描一轮信道。
以8K方案为例,每1ms跳频一次,每次在某个信道通信,除了交互键鼠键值,至少会产生一次心跳包交互,可用于判断信道是否拥堵。
问③:如何同步良好信道频谱?
答③:信道同步发生在2个时间点。
一是在dongle上电后,配对/连接握手前,会扫描获得良好信道,在dongle与键鼠连接时做同步。
二是问题②中,dongle检测到信道污染,扫描获得新一组良好信道后,根据已被污染的信道的通信情况——
若双方仍能按已被污染的信道跳频交互,dongle会发起新信道的同步;
若污染严重,在已污染信道频谱中无法同步新信道,待断连后重连时做同步。

关于跳频算法:
BLE的跳频机制已经十分成熟,沁恒的2.4G跳频算法直接参考了BLE5.0协议。

问①:hop_Inc跳频信道增量有什么作用?
答①:BLE单个信道宽度为2M,可以根据hop_Inc参数推算出大致的跳频宽度。hop_Inc取值范围:5~16。已知当前信道+已知hop_Inc,可以推算下一个频点的位置。
问②:已经扫描到良好信道后,直接在良好信道中逐个跳频通信可以吗?
答②:扫描到的良好信道中,会存在相邻信道。突发例如wifi信道宽度达20MHz的干扰时,逐个跳频可能会导致连续多次跳频通信失败。
问③:为什么需要两次取模运算?直接在良好信道中取模运算一次不就可以得到下一信道?
答③:两次取模起到“全局随机+局部过滤”的作用。
如果仅在全局信道中取模运算,能保证跳频信道的均匀分布,但跳频到不良信道时,易丢包。
如果仅在良好信道中取模运算,能保证通信质量,但当良好信道数量和跳频增量间存在倍数关系时,比如当良好信道数量为3n,跳频增量为n时,那么只会在3n个信道中的3个信道间跳频,信道利用效率低,易被跟踪。
如果仅在全局信道中取模运算,能保证跳频信道的均匀分布,但跳频到不良信道时,易丢包。
如果仅在良好信道中取模运算,能保证通信质量,但当良好信道数量和跳频增量间存在倍数关系时,比如当良好信道数量为3n,跳频增量为n时,那么只会在3n个信道中的3个信道间跳频,信道利用效率低,易被跟踪。
浙公网安备 33010602011771号