如何枚举蓝牙设备的全部服务?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
相关产品推荐
相关产品推荐

