蓝牙开发人员常见问题解答

本文包含常见 UWP 蓝牙 API 问题的解答。

我使用哪些 API? 蓝牙经典(RFCOMM)或蓝牙低能(GATT)?

围绕此常规主题在线进行了各种讨论,因此让我们就与 Windows 的差异保持一致。 下面是一些一般准则:

蓝牙 LE (Windows.Devices.Bluetooth.GenericAttributeProfile)

与支持蓝牙低能的设备通信时,请使用 GATT API。 如果你的用例不常、带宽低或需要低功率,蓝牙低能是答案。 包含此功能的主命名空间是 Windows.Devices.Bluetooth.GenericAttributeProfile

何时不使用蓝牙 LE

  • 高带宽、高频率方案。 如果需要不断与大量数据保持同步,请考虑使用蓝牙经典版甚至 WiFi。

蓝牙经典版 (Windows.Devices.Bluetooth.Rfcomm)

RFCOMM API 为开发人员提供了一个套接字来执行双向串行端口样式通信。 获得套接字后,编写和阅读的方法相当标准。 Rfcomm Chat 示例中提供了此作的实现。

何时不使用蓝牙 Rfcomm

  • 通知。 蓝牙 GATT 协议有一个特定的命令,这将显著减少电源消耗和更快的响应时间。
  • 检查邻近感应或状态检测。 最好使用 播发 API 并通过蓝牙 LE 进行连接。

为什么我的蓝牙 LE 设备在断开连接后停止响应?

最常见的原因是远程设备丢失了配对信息。 大量较旧的蓝牙设备不需要身份验证。 为了保护用户,从 Windows 设置执行的所有配对事务都需要身份验证,并且某些设备没有考虑到这一点。

从 Windows 10 版本 1511 开始,开发人员可以控制配对握手。 设备枚举和配对示例详细介绍了关联新设备的各个方面。

在此示例中,我们启动与不使用加密的设备配对。 请注意,仅当远程设备不需要加密或身份验证才能正常工作时,此作才起作用。

// Get ceremony type and protection level selections
// You must select at least ConfirmOnly or the pairing attempt will fail
    DevicePairingKinds ceremonySelected = DevicePairingKinds.ConfirmOnly;

//  Workaround remote devices losing pairing information
    DevicePairingProtectionLevel protectionLevel = DevicePairingProtectionLevel.None

    DeviceInformationCustomPairing customPairing = deviceInfoDisp.DeviceInformation.Pairing.Custom;

// Declare an event handler - you don't need to do much in PairingRequestedHandler since the ceremony is "None"
    customPairing.PairingRequested += PairingRequestedHandler;
    DevicePairingResult result = await customPairing.PairAsync(ceremonySelected, protectionLevel);

在使用蓝牙设备之前,是否必须配对蓝牙设备?

如果利用蓝牙 RFCOMM(经典版),则无需在使用设备之前对其进行配对。 从 Windows 10 版本 1607 开始,只需查询附近的设备并连接到它们。 更新的 RFCOMM 聊天示例 显示此功能。

(14393 及更低版本) 此功能不适用于蓝牙低能(GATT 客户端),因此你仍必须通过“设置”页或使用 Windows.Devices.Enumeration API 进行配对才能访问这些设备。

(15030及更高) 不再需要配对蓝牙设备。 使用新的 Async API(如 GetGattServicesAsync 和 GetCharacteristicsAsync)查询远程设备的当前状态。 有关更多详细信息 ,请参阅客户端文档

何时应与设备配对,然后再与设备通信?

通常,如果需要与设备建立受信任的长期绑定,请通过将用户定向到设置页或使用设备枚举和配对 API 进行配对。 如果只需从公开的设备(温度传感器或信标)中读取信息,则无需进行任何与设备配对即可连接或侦听广告。 这将防止长期出现互作性问题,因为大量设备不支持配对。

所有 Windows 设备是否都支持外围角色?

否。 这是一项依赖于硬件的功能,但提供了一种方法,即 BluetoothAdapter.IsPeripheralRoleSupported,用于查询它是否受支持。 当前支持的设备包括 Windows Phone on 8992+ 和 RPi3(Windows IoT)。

是否可以从 Win32 访问这些 API?

是的,所有这些 API 都应正常工作。 此博客详细介绍 了如何从桌面应用程序调用 Windows API

此功能是否应存在于特定 SKU 上?

蓝牙 LE:是的,所有功能都在 OneCore 中,并且应该在功能正常的蓝牙 LE 堆栈上提供。

注意事项:外围角色依赖于硬件,某些 Windows Server 版本不支持蓝牙。

蓝牙 BR/EDR (经典版):存在一些变体,但大部分是它们具有非常相似的配置文件级别支持。 请参阅 RFCOMM 上的文档以及适用于电脑电话的这些受支持的配置文件文档