2016-07-08 34 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