BLE特征更改回调仅针对写入后的第一次更改执行

本文关键字:第一次 执行 特征 回调 BLE | 更新日期: 2023-09-27 17:55:54

我尝试使用典型方法订阅BLE特征通知:

stCharacteristic = stService.GetCharacteristics(stCharacteristicGUID)[0];
await stCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
stCharacteristic.ValueChanged += stData_ValueChanged;

回调函数也有标准形式:

async void stData_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args)
{
    var values = (await sender.ReadValueAsync()).Value.ToArray();
}

问题是当BLE设备更改特征的值时,并不总是调用回调。当我向特征写入一些内容并且设备写入一些内容作为响应时,则调用回调。但是,如果设备仅自行写入特征,则不会调用回调。有趣的是,数据不会丢失。当我再次写东西时, 我收到几次回调调用, 同时由 BLE 设备发送的所有数据.换句话说,它看起来像Windows或.NET Framework缓存后续传入的数据,直到进行写入。写入后,只有第一次特征更改会导致触发回调。

  • 传入数据 - 无回调
  • 发送数据
  • 传入数据 - 两个回调!
  • 发送数据
  • 传入数据 - 一个回调
  • 传入数据
  • 传入数据
  • 传入数据
  • 发送数据 - 三次回调!

视窗 10, VS2015

BLE特征更改回调仅针对写入后的第一次更改执行

您不必读取 ValueChanged 回调中的值。该值已存在于 GattValueChangedEventArgs 中。

除此之外 - 您的处理程序实际上应该直接调用,而不是在写入后调用。您能看到您的设备是否在通知之间断开连接/连接吗?

事实证明这是Windows 10的问题。而在 Windows 10.0.15063 及更高版本(如 10.0.16251)上,情况更糟 - 根本没有回调。幸运的是,有一个简单的解决方法,需要添加两个注册表项。这是 .reg 文件:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE'SOFTWARE'Classes'AppID'{C6BFD646-3DF0-4DE5-B7AF-5FFFACB844A5}]
"AccessPermission"=hex:01,00,04,80,9c,00,00,00,ac,00,00,00,00,00,00,00,14,00,'
  00,00,02,00,88,00,06,00,00,00,00,00,14,00,07,00,00,00,01,01,00,00,00,00,00,'
  05,0a,00,00,00,00,00,14,00,03,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00,'
  00,00,18,00,07,00,00,00,01,02,00,00,00,00,00,05,20,00,00,00,20,02,00,00,00,'
  00,18,00,03,00,00,00,01,02,00,00,00,00,00,0f,02,00,00,00,01,00,00,00,00,00,'
  14,00,03,00,00,00,01,01,00,00,00,00,00,05,13,00,00,00,00,00,14,00,03,00,00,'
  00,01,01,00,00,00,00,00,05,14,00,00,00,01,02,00,00,00,00,00,05,20,00,00,00,'
  20,02,00,00,01,02,00,00,00,00,00,05,20,00,00,00,20,02,00,00
[HKEY_LOCAL_MACHINE'SOFTWARE'Classes'AppID'YOURAPP.exe]
"AppID"="{C6BFD646-3DF0-4DE5-B7AF-5FFFACB844A5}"

将 YOURAPP.exe 更改为您的 exe 文件名。GUID 可以更改或保持原样。应用此.reg文件回调后,每次都会立即调用,并且通知接收效果非常好。

在撰写此答案的那一刻,Microsoft正在努力进行永久修复。解决方法和讨论如下:https://social.msdn.microsoft.com/Forums/en-US/58da3fdb-a0e1-4161-8af3-778b6839f4e1/bluetooth-bluetoothledevicefromidasync-does-not-complete-on-10015063?forum=wdk