You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:50:23