我嘗試訂閱使用典型方法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