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