本文包含常见 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。