蓝牙开发人员常见问题

本文包含 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 聊天示例中演示了此套接字的实现。

何时不使用蓝牙 Rfcomm

  • 通知。 蓝牙 GATT 协议具有用于此方面的特定命令,功耗显著降低并且响应时间更快。
  • 邻近感应检查或存在检测。 更好的做法是使用播发 API 并通过蓝牙 LE 进行连接。

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

发生这种情况的在常见原因是远程设备丢失了配对信息。 大量较旧的蓝牙设备不需要身份验证。 为了保护用户,从“设置”应用程序执行的所有配对事务都需要身份验证,但某些设备在设计时并未考虑到这一点。

从 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 及更高版本)不再需要对蓝牙设备进行配对。 使用新的异步 API(如 GetGattServicesAsync 和 GetCharacteristicsAsync)查询远程设备的当前状态。 有关更多详细信息,请参阅客户端文档

在与设备进行通信之前,应何时与它配对?

一般情况下,如果需要与设备进行受信任的长期绑定,则应与其配对(将用户定向到设置页面,或使用设备枚举和配对 API)。 如果需要直接从公开的设备(温度传感器或信标)读取信息,则连接或侦听播发,而不进行任何工作来与设备配对。 这可以避免长时间运行中的互操作性问题,因为许多设备不支持配对。

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

否。 这是硬件相关功能,但提供了一个方法 (BluetoothAdapter.IsPeripheralRoleSupported) 来查询这是否受支持。 当前支持的设备包括 8992+ 上的 Windows Phone 和 RPi3 (Windows IoT)。

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

可以,所有这些 API 都应正常工作。 本博客详细介绍了从桌面应用程序调用 Windows API 的方式。

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

蓝牙 LE:是的,所有功能都处于 OneCore 中,应在带有正常运行的蓝牙 LE 堆栈的最新设备上可用。

警告:外设角色与硬件相关,并且某些 Windows Server 版本不支持蓝牙。

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