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
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