2016-07-08 1 views
0

je tente de souscrire à BLE notification caractéristique en utilisant l'approche typique:caractéristique BLE a changé de rappel exécutée uniquement pour le premier changement après écriture

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

La fonction de rappel a également forme standard:

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

Le problème est que le rappel n'est pas toujours appelé lorsque le périphérique BLE change de valeur de caractéristique. Quand j'écris quelque chose à la caractéristique et que l'appareil écrit quelque chose en réponse, alors le rappel est appelé. Mais si les périphériques n'écrivent à la caractéristique que par elle-même, le rappel n'est pas appelé. La partie amusante est que les données ne sont pas perdues. Lorsque j'écris à nouveau quelque chose, je reçois plusieurs appels à mon rappel avec toutes les données envoyées par l'appareil BLE entre-temps. En d'autres termes, il semble que Windows ou .NET Framework met en cache les données entrantes suivantes jusqu'à ce qu'une écriture soit effectuée. Après l'écriture seule la première modification de caractéristique provoque le rappel.

  • données entrantes - pas de rappel
  • de l'envoi des données
  • données entrants - deux callbacks!
  • l'envoi de données
  • de données entrant - un rappel
  • des données entrantes
  • de données entrantes
  • de données entrantes
  • l'envoi de données - trois! Callbacks

de Windows 10, VS2015

Répondre

0

Vous ne devez pas lire la valeur du rappel ValueChanged. La valeur est déjà présente dans GattValueChangedEventArgs.

Autre que cela - votre gestionnaire devrait vraiment être appelé directement et non après une écriture. Pouvez-vous voir si votre appareil est déconnecté/connecté entre les notifications?

+0

Oui, vous avez raison, je peux obtenir des données d'args et je suis sûr que c'est plus élégant. L'appareil n'est pas déconnecté. Je peux le voir dans les journaux de l'appareil. De plus, s'il y avait déconnexion je ne serais pas capable de faire des écritures à la caractéristique. Pendant ce temps, j'ai observé quelque chose d'intéressant. Le périphérique peut envoyer des paquets de données plus grands que la taille caractéristique (20 octets). Dans ce cas, il divise les paquets en morceaux de 20 octets. Et je reçois tous les morceaux un par un sans aucun problème. Le rappel est donc exécuté non seulement pour le premier segment.Il semble qu'il y ait une fenêtre temporelle après l'écriture lorsque le rappel se déclenche immédiatement. – grzegorz

0

Il s'avère que c'était Windows 10 problème. Et sur Windows 10.0.15063 et plus récent, comme 10.0.16251, c'est encore pire - il n'y a pas de callback du tout. Heureusement, il existe une solution de contournement simple, deux entrées de registre doivent être ajoutées. Voici le fichier .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}" 

Changez YOURAPP.exe en nom de fichier exe. Le GUID peut être changé ou laissé tel quel. Après l'application de ce fichier .reg, les rappels sont appelés instantanément à chaque fois et les notifications sont très bien reçues. Au moment d'écrire cette réponse, Microsoft travaillait sur un correctif permanent. La solution de contournement et la discussion est ici: https://social.msdn.microsoft.com/Forums/en-US/58da3fdb-a0e1-4161-8af3-778b6839f4e1/bluetooth-bluetoothledevicefromidasync-does-not-complete-on-10015063?forum=wdk