Détecter efficacement la balise de localisation

Détecter efficacement la balise de localisation

En implémentant le Yocto-Discovery, nous avons réalisé qu'il nous manquait une fonctionnalité dans notre API: un moyen rapide et asynchrone de détecter le changement d’état de la balise de localisation. Cette semaine, nous publions une nouvelle version de nos librairies de programmation qui incluent cette nouvelle fonctionnalité.




Il était déjà possible d'obtenir l'état de la balise de localisation avec l'aide de la méthode get_beacon() de l'objet YModule, mais il fallait le faire explicitement et, dans le cas d'une application qui surveille de nombreux modules comme Yocto-Discovery, cela implique d'avoir un thread dédié qui interroge périodiquement tous les modules. Non seulement c'est compliqué à coder, mais en plus, ce n'est pas très efficace. En effet, si l'on veut que l'application détecte rapidement le changement d'état, par exemple dans la seconde, il faut appeler au minimum chaque seconde cette méthode sur tous les modules connectés.

Cette solution avait un autre effet de bord. Pour être plus efficace, les méthodes get_XXX téléchargent tous les attributs du module en même temps et les garde en cache. La plupart du temps, cette stratégie permet de minimiser le trafique réseau. Cependant dans le cas d'une application qui ne fait que surveiller l'état de la balise de localisation, cette stratégie est contre-productive et augmente la quantité de données transférées.

La méthode registerBeaconCallback()


Notre nouvelle méthode travaille de manière asynchrone, c'est-à-dire qu'au lieu d'aller périodiquement interroger le module pour savoir si la balise de localisation a changé, on enregistre un callback qui est appelé dès qu'un changement est détecté. Cette solution a plusieurs avantages.

Premièrement, elle est bien plus efficace. C'est le CPU du module qui détecte le changement d'état de la balise et qui envoie un paquet de quelques bytes à la librairie de programmation. Cela permet de diminuer la quantité de données échangées. Si personne n'appuie sur la balise de localisation aucune donnée n'est transmise.

De plus, il n'est pas nécessaire de coder la détection de changement d'état de la balise de localisation dans l’application, il suffit d’enregistrer une fonction de callback avec la méthode registerBeaconCallback() de l'objet YModule.

La fonction de callback reçoit en argument le pointeur vers l'objet YModule du module concerné, et la nouvelle valeur du beacon. Tout comme pour les callbacks de valeur, ce callback n'est appelé que durant l'exécution de YAPI.Sleep() ou YAPI.HandleEvents(). Cela permet à l'application de contrôler quand les callbacks peuvent se produire.

Un exemple en C#


Il faut commencer par définir la fonction de callback qui va être appelée. Le premier argument de cette fonction est l'objet de type YModule qui référence notre module. Le deuxième argument est un entier qui correspond à l’état de la balise de localisation.

static void beaconChange(YModule m, int beacon)
{
  string serial = m.get_serialNumber();
  string b_state = beacon == YModule.BEACON_ON ? "ON" : "OFF";
  Console.WriteLine("Beacon of " + serial + " changed to " + b_state);
}



Ensuite, pour les modules que l'on désire surveiller, il faut appeler la méthode registerBeaconCallback pour enregistrer notre fonction de callback.

  YModule m = YModule.FirstModule();
  while (m != null) {
    m.registerBeaconCallback(beaconChange);
    Console.WriteLine("monitor "+ m.get_serialNumber() + " beacon");
    m = m.nextModule();
  }



Finalement, il faut ajouter dans notre boucle principale un appel à YAPI.Sleep ou YAPI.HandleEvents.

  while (true) {
        ....
    YAPI.Sleep(500, ref errmsg)
    ...
    YAPI.HandleEvents(ref errmsg);
  }



Quelques remarques


Dans cette article, nous avons montré l'utilisation de ce callback en C# mais les mêmes méthodes sont disponibles dans toutes nos librairies. Le nom des méthodes et leur fonctionnement sont identiques à deux exceptions près:

Pour la librairie JavaScript/EcmaScript 2017, il n'est pas nécessaire d'appeler la méthode YAPI.Sleep ou YAPI.HandleEvents car Javascript n'utilise pas de thread.

En Java et sous Android, la méthode registerBeaconCallback() prend en argument un objet qui implémente l'interface YModule.BeaconCallback.

Nous avons modifié l'exemple Prog-EventBased de toutes les librairies pour ajouter l'utilisation de la méthode registerBeaconCallback(). Cela vous permet d'avoir un exemple fonctionnel dans n'importe quel langage.

Vous pouvez télécharger nos librairies sur notre site web ou sur GitHub. Bien évidement, si vous avez des problèmes, vous pouvez toujours contacter le support : support@yoctopuce.com.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.