返回

C 中使用 SetupAPI 判断 BLE 设备是否已连接:完整指南

windows

## 在 C 中使用 SetupAPI 判断 BLE 设备当前是否已连接

### 概述

本文探讨了如何使用 C 中的 SetupAPI 确定先前已配对的蓝牙低功耗 (BLE) 设备当前是否已启用。本文提供了一个测试程序示例,演示了如何使用 SetupDiGetDevicePropertyW() 函数来获取设备属性,并解释了如何解释结果。

### 背景

在尝试了解已配对的 BLE 设备的当前状态时,我遇到了困难。使用 SetupAPI 中的 DEVPKEY_Device_IsPresent 属性始终返回 true,即使 BLE 设备当前已关闭。此外,DEVPKEY_DeviceContainer_IsConnected 属性会产生错误代码 1168。本文提供了对这些问题的解决方案。

### 测试程序

以下 C 测试程序展示了如何使用 SetupAPI 获取设备信息并检查属性:

// ...

### 结果分析

运行测试程序后,可以观察到以下结果:

// ...

这些结果表明:

  • 设备当前已连接
  • 无法获取 DEVPKEY_DeviceContainer_IsConnected 属性
  • 无法获取 DEVPKEY_DeviceContainer_IsPaired 属性

### 解决办法

要解决无法获取连接和配对属性的问题,需要使用不同的方法。对于连接属性,可以使用 Windows Management Instrumentation (WMI) 查询 Win32_NetworkAdapter 类,并筛选出具有 NetConnectionStatus 值为 2 的适配器(表示已连接)。对于配对属性,可以使用蓝牙 API 函数 BluetoothGetConnectedDevices 来获取已配对设备的列表。

### 完整解决方案

以下代码片段提供了一个修改后的测试程序,它使用 WMI 查询获取连接属性,并使用蓝牙 API 函数获取配对属性:

// ...

### 结论

使用 SetupAPI 获取 BLE 设备属性是确定设备当前状态的有效方法。但是,对于某些属性,可能需要使用 WMI 查询或蓝牙 API 函数来获取准确的信息。本文提供了完整的解决方案,解决了无法获取设备连接和配对属性的问题。

### 常见问题解答

1. 为什么 DEVPKEY_Device_IsPresent 属性始终返回 true,即使设备当前已关闭?

DEVPKEY_Device_IsPresent 属性表示设备是否存在,与设备是否已启用无关。

2. 如何使用 WMI 查询获取设备连接状态?

使用 WMI 查询获取设备连接状态,需要连接到 WMI 命名空间,并执行以下查询:

SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus = 2

3. 如何使用蓝牙 API 函数获取已配对设备列表?

使用蓝牙 API 函数获取已配对设备列表,需要调用 BluetoothGetConnectedDevices 函数,并传递一个缓冲区来存储设备信息。

4. 是否可以使用其他方法来确定设备当前是否已连接?

除了 WMI 查询和蓝牙 API 函数之外,还可以使用以下方法来确定设备当前是否已连接:

  • 检查设备的电池电量,如果电池电量为 0%,则设备可能已关闭。
  • 使用 ping 命令尝试连接到设备的 IP 地址,如果连接成功,则设备已开启。

5. 如何处理无法获取连接或配对属性的情况?

如果无法获取连接或配对属性,可以显示一个错误消息或提供其他反馈,告知用户无法获取设备的当前状态。