ESP32 Bluedroid栈中SCAN_REQ处理路径及SCAN_RSP响应位置问询
ESP32 Bluedroid BLE栈SCAN_REQ处理及SCAN_RSP发送路径
SCAN_REQ请求处理路径
当ESP32以BLE从机模式广播时,SCAN_REQ的处理流程如下:
- 蓝牙控制器收到SCAN_REQ包后,向Bluedroid栈上报
GAP_LE_SCAN_REQ_EVT事件。 - 事件入口在
components/bt/host/bluedroid/stack/gap/gap_le.c的gap_le_handle_event()函数,该函数会将事件分发给对应的处理逻辑。 - 核心处理函数为
components/bt/host/bluedroid/stack/gap/gap_le_adv.c中的gap_le_process_scan_req(),这里会验证SCAN_REQ的合法性(如扫描者地址类型、广播状态等),并决定是否生成SCAN_RSP响应。
SCAN_RSP响应发送位置
SCAN_RSP的发送逻辑嵌入在SCAN_REQ的处理流程中:
- 在
gap_le_process_scan_req()函数内,会根据预配置的扫描响应数据(通过esp_ble_gap_set_scan_rsp_data()设置)组装SCAN_RSP包。 - 随后调用
components/bt/host/bluedroid/stack/hci/hci_le.c中的hci_le_send_scan_rsp()函数,该函数将组装好的SCAN_RSP数据封装为HCI命令,发送给蓝牙控制器,最终由控制器向扫描者发送SCAN_RSP包。
调试建议
针对部分芯片版本不返回SCAN_RSP的问题,可按以下步骤对比排查:
- 在
gap_le_handle_event()中添加日志,确认GAP_LE_SCAN_REQ_EVT事件是否被正常接收,排除控制器上报异常的可能。 - 在
gap_le_process_scan_req()中添加日志,检查是否通过了合法性校验,以及扫描响应数据是否正确加载。 - 在
hci_le_send_scan_rsp()中验证HCI命令是否成功发送,可查看返回的HCI命令状态码。 - 对比正常与异常芯片版本的日志输出,定位到事件丢失、校验失败或命令发送失败的具体环节。
内容的提问来源于stack exchange,提问作者zapta
相关产品推荐
相关产品推荐

