1. BLE主机接收WiFi列表异常问题深度解析
在物联网设备开发中,BLE(蓝牙低功耗)多连接场景下的稳定性问题一直是开发者面临的挑战。最近我们在一个实际项目中遇到了一个棘手的现象:BLE主机在接收WiFi列表信息时,会概率性出现崩溃问题。这个问题的复现率极低,大约3天才会出现一次,给问题定位带来了很大困难。
作为负责该问题的技术负责人,我带领团队进行了为期两周的深度排查。本文将完整还原我们发现问题、分析问题到最终解决问题的全过程,特别适合正在开发BLE多连接设备的工程师参考。通过这个案例,你不仅能了解具体问题的解决方案,更能掌握一套完整的嵌入式系统问题排查方法论。
提示:本文涉及较多BLE协议栈和嵌入式开发知识,建议读者先了解BLE基本通信原理和多连接特性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题现象与初步分析
2.1 问题复现环境搭建
为了准确复现问题,我们设计了两种测试场景:
- 基础测试场景:1个BLE主机连接1个从机,进行完整的连接→认证→WiFi列表传输→断开流程循环测试
- 压力测试场景:1个BLE主机同时连接4个从机,执行相同测试流程
测试使用的WiFi列表包含20个网络信息,通过BLE分8个数据包传输(序列号0-7)。经过7天连续测试发现:
- 基础测试场景完全稳定,未出现任何异常
- 压力测试场景平均每3天会出现1次主机崩溃
这个结果说明问题确实与多连接场景相关,且复现需要一定压力条件。这为我们后续分析指明了方向。
2.2 崩溃现场分析
通过分析coredump信息,我们发现每次崩溃都发生在相同位置:
code复制崩溃地址:0x2302416a
访问值:0x00000010
异常原因:s5寄存器值为0(偏移16字节后是00000010),访问非法地址导致崩溃
进一步追溯发现,s5的值来自cJSON* bssid = cJSON_GetObjectItem(list, "bssid")的返回值。这意味着当JSON解析获取bssid字段时返回了NULL指针,而代码未做判空就直接使用,导致崩溃。
原始问题代码如下:
c复制cJSON* bssid = cJSON_GetObjectItem(list, "bssid");
printf("bssid: %s\n", bssid->valu
