如何通过BlueZ获取可用蓝牙适配器的数量及列表
使用C++通过BlueZ的HCI接口获取蓝牙适配器列表
要直接通过HCI套接字而非DBus API获取蓝牙适配器信息,核心是利用BlueZ提供的bluetooth/hci.h和bluetooth/bluetooth.h头文件中的函数,枚举或遍历设备并获取详情。下面是具体实现方法:
核心思路
- 遍历可能的适配器ID(通常从0开始递增),尝试用
hci_open_dev()打开设备,能成功打开则说明适配器存在。 - 对每个存在的适配器,用
hci_dev_info()获取设备的详细信息,包括ID、蓝牙地址等。 - 也可以使用
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
相关产品推荐
相关产品推荐

