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

如何枚举蓝牙设备的全部服务?Windows API使用疑问

获取蓝牙设备全部可用服务列表的解决方案

使用BluetoothSdpEnumServices API替代

BluetoothEnumerateInstalledServices仅能枚举本地已安装的蓝牙服务,要获取设备的全部可用服务,你需要调用**BluetoothSdpEnumServices**——这个API直接从目标蓝牙设备的SDP(服务发现协议)数据库中查询所有服务,包括未在本地系统安装的服务。

核心实现步骤

  • 获取目标设备地址:通过BluetoothFindFirstDevice和BluetoothFindNextDevice枚举蓝牙设备,从BLUETOOTH_DEVICE_INFO结构体中提取设备的蓝牙地址。
  • 调用枚举API:传入设备地址、可选的UUID过滤条件(设为NULL则枚举所有服务),以及自定义回调函数来处理每个枚举到的服务记录。
  • 解析服务数据:在回调函数中,通过SdpGetAttributeValue等API解析SDP_SERVICE_RECORD结构体,提取服务UUID、名称、端口等关键信息。

示例代码片段

// 服务枚举回调函数,处理每个找到的服务
BOOL CALLBACK EnumServicesCallback(PSDP_SERVICE_RECORD pServiceRecord, DWORD dwParam) {
    // 示例:提取服务名称属性(属性ID 0x0100)
    SDP_ATTRIBUTE_VALUE attrValue;
    if (SdpGetAttributeValue(pServiceRecord, 0x0100, &attrValue) == ERROR_SUCCESS) {
        wchar_t* serviceName = attrValue.pStringValue;
        // ... 进行后续操作
    }
    return TRUE; // 返回TRUE继续枚举所有服务
}

// 枚举指定蓝牙设备的全部服务
void EnumAllDeviceServices(BLUETOOTH_DEVICE_ADDRESS deviceAddr) {
    HRESULT hr = BluetoothSdpEnumServices(
        &deviceAddr,
        NULL,               // 不设置UUID过滤,枚举所有服务
        EnumServicesCallback,
        NULL,               // 自定义参数,可传入需要的上下文数据
        0                   // 保留参数,设为0
    );
    if (FAILED(hr)) {
        // 处理枚举失败的错误
    }
}

注意事项

  • 编译时需要链接Bthprops.lib库。
  • 程序需要以管理员权限运行,否则可能无法正常访问蓝牙设备的SDP数据。
  • 如果只需要特定类型的服务,可以在BluetoothSdpEnumServices的第二个参数传入对应服务的UUID(如串口服务UUID00001101-0000-1000-8000-00805F9B34FB)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:55:22