2016-07-08 63 views
0

我尝试订阅使用典型方法BLE特征通知后改变只对第一个变化执行回调: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缓存后续传入的数据,直到写入。只写第一个特征变化导致回调被触发。

  • 传入的数据 - 没有回调
  • 发送数据
  • 输入数据 - 两个回调!
  • 发送数据
  • 输入数据 - 一个回调
  • 输入数据
  • 输入数据
  • 输入数据
  • 发送数据 - 三回调!

的Windows 10,VS2015

回答

0

你不必来读取回调的ValueChanged价值。该值已经存在于GattValueChangedEventArgs中。

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

+0

是的,你是对的,我可以从args获取数据,我相信它更优雅。 设备未断开。我可以在设备的日志中看到它。此外,如果发生断线,我将无法写入特征。 同时,我观察到有趣的事情。该设备可以发送大于特征大小(20字节)的数据包。在这种情况下,它将数据包分成20个字节的块。我一个接一个地看到所有的块,没有任何问题。所以回调不仅仅针对第一块。看起来好像在写回之后有时间窗口,当回调立即触发。 – grzegorz

0

事实证明,这是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文件后,每次都会立即调用回调函数,并且通知正在被很好地接收。

在写这个答案的时候,微软正在研究一个永久性修复。解决方法和讨论在这里:https://social.msdn.microsoft.com/Forums/en-US/58da3fdb-a0e1-4161-8af3-778b6839f4e1/bluetooth-bluetoothledevicefromidasync-does-not-complete-on-10015063?forum=wdk