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

如何通过BlueZ获取可用蓝牙适配器的数量及列表

使用C++通过BlueZ的HCI接口获取蓝牙适配器列表

要直接通过HCI套接字而非DBus API获取蓝牙适配器信息,核心是利用BlueZ提供的bluetooth/hci.h和bluetooth/bluetooth.h头文件中的函数,枚举或遍历设备并获取详情。下面是具体实现方法:

核心思路

  1. 遍历可能的适配器ID(通常从0开始递增),尝试用hci_open_dev()打开设备,能成功打开则说明适配器存在。
  2. 对每个存在的适配器,用hci_dev_info()获取设备的详细信息,包括ID、蓝牙地址等。
  3. 也可以使用hci_enum_devices()函数直接枚举所有可用适配器,这是更高效的方式。

完整代码实现

#include <iostream>
#include <cstring>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>

int main() {
    // 方法1:遍历设备ID枚举适配器
    std::cout << "=== 遍历方式获取适配器列表 ===" << std::endl;
    int dev_id = 0;
    while (true) {
        int sock = hci_open_dev(dev_id);
        if (sock < 0) {
            // 到达不存在的设备ID,停止遍历
            if (errno == ENODEV) {
                break;
            }
            dev_id++;
            continue;
        }

        // 获取设备信息
        struct hci_dev_info dev_info;
        memset(&dev_info, 0, sizeof(dev_info));
        if (hci_dev_info(dev_id, &dev_info) == 0) {
            char addr[18];
            ba2str(&dev_info.bdaddr, addr);
            std::cout << "适配器ID: hci" << dev_id << std::endl;
            std::cout << "蓝牙地址: " << addr << std::endl;
            std::cout << "设备名称: " << dev_info.name << std::endl;
            std::cout << "------------------------" << std::endl;
        }

        hci_close_dev(sock);
        dev_id++;
    }

    // 方法2:使用hci_enum_devices直接枚举
    std::cout << "\n=== 枚举函数方式获取适配器列表 ===" << std::endl;
    auto enum_callback = [](const struct hci_dev_info* dev_info, void* user_data) -> int {
        char addr[18];
        ba2str(&dev_info->bdaddr, addr);
        std::cout << "适配器ID: hci" << dev_info->dev_id << std::endl;
        std::cout << "蓝牙地址: " << addr << std::endl;
        std::cout << "设备名称: " << dev_info->name << std::endl;
        std::cout << "------------------------" << std::endl;
        return 0; // 返回0继续枚举,返回非0停止
    };

    hci_enum_devices(HCI_ENUM_DEVICES, enum_callback, nullptr);

    return 0;
}

代码说明

  • hci_open_dev(dev_id):尝试打开指定ID的HCI设备,成功返回套接字描述符,失败返回-1。
  • hci_dev_info(dev_id, &dev_info):获取指定ID设备的信息,存储在hci_dev_info结构体中,包含蓝牙地址(bdaddr)、设备名称(name)等字段。
  • ba2str(&bdaddr, addr):将蓝牙地址的二进制格式转换为字符串格式(如AA:BB:CC:DD:EE:FF)。
  • hci_enum_devices():枚举所有可用的HCI设备,通过回调函数处理每个设备的信息,比遍历方式更高效。

编译命令

编译时需要链接BlueZ的蓝牙库:

g++ -o hci_adapters hci_adapters.cpp -lbluetooth

注意事项

  • 运行程序需要root权限(或给二进制文件添加cap_net_raw权限),因为操作HCI套接字需要特殊权限:
    sudo ./hci_adapters
    # 或者添加权限
    sudo setcap cap_net_raw+ep ./hci_adapters
    
  • 确保系统已安装BlueZ开发库,Debian/Ubuntu系统可通过sudo apt-get install libbluetooth-dev安装。

内容的提问来源于stack exchange,提问作者Richard Beattie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:53:08