树莓派中hci_inquiry调用始终返回0,可扫描到蓝牙设备的原因排查
问题:hci_inquiry 返回码为0但未扫描到任何设备
调用hci_inquiry时返回码始终为0(表示调用成功),但无法获取任何蓝牙设备。已确认蓝牙接口正常启用,通过自定义工具获取的设备信息如下:
root@piBox:/home/pi# ./mytest Device Addr: B8:27:EB:A3:F0:73 Device Id: 0 Device Name: hci0 Flags: 5 Type: 3 Link Policy: 5 Link Mode: 8000 Number of Resp: 0
同时使用bluetoothctl scan on可以正常扫描到多个蓝牙设备:
[bluetooth]# scan on Discovery started [CHG] Controller B8:27:EB:A3:F0:73 Discovering: yes [NEW] Device 3A:53:34:A7:31:21 3A-53-34-A7-31-21 [NEW] Device C8:FF:77:C2:9A:1E VV6-US-KHA0033A [NEW] Device 88:6B:0F:BC:D8:53 Bowflex T216 [NEW] Device 63:F6:DC:71:16:58 63-F6-DC-71-16-58 [NEW] Device C6:0D:C8:A1:75:D6 Versa 2 [NEW] Device CB:1A:58:38:37:2B USB ANT STICK [NEW] Device 6B:8D:76:BB:48:B0 6B-8D-76-BB-48-B0 [NEW] Device 5A:0B:D6:D3:54:72 5A-0B-D6-D3-54-72 [NEW] Device 46:12:46:A0:A0:7D 46-12-46-A0-A0-7D [NEW] Device 64:16:66:71:3D:32 N04CU [NEW] Device E2:FC:77:B9:E8:D7 Stryd [NEW] Device DF:C5:F9:B7:C9:34 N046H
已添加调试代码排查错误,未发现异常,设备名称与地址均正确,为何hci_inquiry无法扫描到设备?
可能的原因与解决方法
1. hci_inquiry仅支持经典蓝牙,无法扫描BLE设备
bluetoothctl scan on默认会同时扫描经典蓝牙和BLE设备,但hci_inquiry是专门针对**经典蓝牙(BR/EDR)**的扫描接口,完全无法发现BLE设备。如果bluetoothctl扫到的设备大多是BLE类型,就会出现这种“调用成功但无结果”的情况。
- 验证方式:用
bluetoothctl info <设备地址>查看单设备类型,输出里的LegacyPairing: no通常代表是BLE设备。 - 解决办法:如果需要扫描BLE设备,改用HCI的LE扫描接口(比如
hci_le_set_scan_enable系列函数),或者先用hcitool lescan命令测试可行性。
2. hci_inquiry的参数设置不合理
默认调用hci_inquiry时,参数可能限制了扫描效果:
- 比如
timeout设置过短,设备还没来得及响应就结束扫描; max_rsp设为0的话,函数会返回成功,但不会收集任何设备响应(你调试输出里的Number of Resp: 0可能和这个参数有关)。- 解决办法:调整参数,例如把
timeout设为8(对应10.24秒扫描时长),max_rsp设为255确保能收集足够响应。示例代码调用:
inquiry_info *ii = NULL; int num_rsp; // hdev为蓝牙设备ID(比如0对应hci0),IREQ_CACHE_FLUSH强制刷新缓存 num_rsp = hci_inquiry(hdev, 8, 255, NULL, &ii, IREQ_CACHE_FLUSH);
3. 蓝牙控制器被bluetoothd占用导致资源冲突
当bluetoothd服务运行时,可能会占用蓝牙控制器的扫描资源,限制hci_inquiry的扫描能力。
- 验证方式:临时停止
bluetoothd服务,再运行测试程序:
sudo systemctl stop bluetooth ./mytest
如果停止服务后能正常扫描到设备,说明两者存在资源冲突。
- 解决办法:要么调整
bluetoothd的配置(比如禁用自动扫描),要么改用DBus接口与bluetoothd交互,代替直接调用HCI底层函数。
4. 程序权限不足
虽然你用root运行,但如果程序缺少必要的权限,也可能导致扫描异常:
- 解决办法:给程序添加蓝牙相关的权限:
sudo setcap cap_net_raw,cap_net_admin+eip ./mytest
内容的提问来源于stack exchange,提问作者Charlie Mason
相关产品推荐
相关产品推荐

