本文包含 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 的方式。