发现一个BLE设备出现频繁性断连,Win和Linux均出现该现象
首先怀疑为固件所使用的SDK库版本问题,重新使用新库移植编译固件(顺便把蓝牙名称修改掉了),问题完全没解决
然后怀疑为从设备的天线条件问题,由于天线在PCB另一侧
外购2.4G天线,将原PCB天线割断,将天线同底部引至顶部,没有改善
在Linux下查看dmseg信息,发现蓝牙设备有报错
仔细查看为蓝牙对某个命令的支持有问题,由于电脑比较旧所实用网卡型号不支持5.X怀疑可能为网卡驱动/网卡本身问题
在Linux下尝试确认英特尔网卡驱动,发现与内核完全绑定大概率没有什么问题
搞了一个联发科的网卡更换,测试发现效果有极大程度改善,严重怀疑为网卡问题
花费巨资(100rmb)购买BE200网卡,踩坑发现BE200仅支持PCIE-KEY E,而笔记本支持PCIE-KEY A/A+E
又花费巨资(60rmb)购买AX210网卡,更换发现之前出现的蓝牙命令支持问题消失,但断连问题依然存在
同时使用dmesg确定为断连是由(0x08)Timeout导致
在linux尝试找Timeout参数,https://zhuanlan.zhihu.com/p/347985640中发现,可能是timeout参数设置过小
而且该参数可以协商修改,主机从机都可以修改,在/var/lib/bluetooth/蓝牙mac/设备mac中发现参数,但并不清楚参数含义,对比罗技鼠标发现该参数较小(43)罗技为(210),修改该参数并重启电脑。发现问题完全消失
确定是该问题导致,同时怀疑为参数未满足要求
重新匹配后参数会被还原,同时windows下未找到修改该参数的方法,根本解决还是需要修改从机固件
通过TIMEOUT和43关键字找到从机源码中的相关参数
/*lint -emacro(524, MIN_CONN_INTERVAL) // Loss of precision */
#define MIN_CONN_INTERVAL MSEC_TO_UNITS(7.5, UNIT_1_25_MS) /**< Minimum connection interval (7.5 ms) */
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) /**< Maximum connection interval (30 ms). */
#define SLAVE_LATENCY 6 /**< Slave latency. */
#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(430, UNIT_10_MS) /**< Connection supervisory timeout (430 ms). */
通过计算发现该数据定义确实不满足文章中的定义修改为
/*lint -emacro(524, MIN_CONN_INTERVAL) // Loss of precision */
#define MIN_CONN_INTERVAL MSEC_TO_UNITS(7.5, UNIT_1_25_MS) /**< Minimum connection interval (7.5 ms) */
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) /**< Maximum connection interval (30 ms). */
#define SLAVE_LATENCY 6 /**< Slave latency. */
#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(2500, UNIT_10_MS) /**< Connection supervisory timeout (430 ms). */
重新编译及下载固件后重新匹配蓝牙设备,检查/var/lib/bluetooth/蓝牙mac/设备mac文件夹中info文件TIMEOUT已经按照期望自动修改
Linux及Windows下问题均解决