Sommaire
Interroger des StateObjects à un instant T
Pour récupérer un ou plusieurs StateObject (à un instant T), vous pouvez utiliser la méthode “requestStateObjects” :
1 |
JsonArray& myStateObject = constellation.requestStateObjects(sentinel, package, name, type); |
Utilisez le wildcard “” pour ne pas appliquer de filtre. Le symbole “” est aussi accessible via la constante “WILDCARD”.
Par exemple :
1 2 3 4 |
// All StateObjects for MyPackage on MySentinel JsonArray& so = constellation.requestStateObjects("MySentinel", "MyPackage", "*", "*"); // All StateObjects named "Demo" in your Constellation JsonArray& so = constellation.requestStateObjects(WILDCARD, WILDCARD, "Demo", WILDCARD); |
Autre exemple, vous souhaitez afficher dans les logs Constellation, la consommation CPU de toutes vos machines Windows (vous avez au préalable déployé le package “HWMonitor” sur toutes vos sentinelles Windows) depuis votre Arduino :
1 2 3 4 5 |
// Example : print the all SO's value named "/intelcpu/0/load/0" and produced by the "HWMonitor" package (on all sentinels) JsonArray& cpus = constellation.requestStateObjects("*", "HWMonitor", "/intelcpu/0/load/0"); for(int i=0; i < cpus.size(); i++) { constellation.writeInfo("CPU on %s is currently %d %", cpus[i]["SentinelName"].as<char *>(), cpus[i]["Value"]["Value"].as<float>()); } |
S’abonner aux mises à jours des StateObjects en temps réel
Vous pouvez également vous abonnez aux mises à jour des StateObjects pour être notifié en temps réel de la modification des StateObjects.
En utilisant un callback global
Vous pouvez déclarer une fonction callback qui sera appelée à chaque mise à jour de StateObjects pour lesquels vous vous êtes abonné en invoquant la méthode setStateObjectUpdateCallback. Notez qu’il ne peut y avoir qu’une seule méthode callback enregistrée.
Ensuite vous abonnez aux différents StateObjects que vous souhaitez “suivre” avec la méthode “subscribeToStateObjects”.
Par exemple, pour être notifié en temps réel de la consommation CPU des différentes sentinelles Windows, on écrira :
1 2 3 4 5 6 |
// set a StateObject update callback and subscribe to SO constellation.setStateObjectUpdateCallback([] (JsonObject& so) { constellation.writeInfo("StateObject updated ! StateObject name = %s", so["Name"].as<char *>()); }); // Subscribe to SO named "/intelcpu/0/load/0" and produced by the "HWMonitor" package (on all sentinels) constellation.subscribeToStateObjects("*", "HWMonitor", "/intelcpu/0/load/0"); |
Nous avons ici défini notre fonction callback dans une expression lambda mais vous pouvez aussi bien “extraire” cette fonction callback dans une fonction distincte.
Enfin dans la boucle principale (loop), vous devez invoquer la méthode “constellation.loop()” aussi souvent que possible afin que la libraire puisse dispatcher les SO dans votre méthode callback :
1 |
constellation.loop(); |
En utilisant des StateObjectLinks
Avec la méthode “subscribeToStateObjects” présentée ci-dessous vous avez une fonction callback qui recevra tous les StateObjects pour lesquels vous êtes abonné. Vous devez donc “dispatcher” vous même les différents StateObjects que vous recevrez.
Pour simplifier les choses, la libraire Arduino propose comme en .NET ou en Python, la notion de StateObjectLink : il s’agit de “lier” un abonnement à des StateObjects à une fonction de votre code.
Pour reprendre l’exemple du suivi des CPU en temps réel, nous pourrions écrire :
1 2 3 |
constellation.registerStateObjectLink("*", "HWMonitor", "/intelcpu/0/load/0", [](JsonObject& so) { constellation.writeInfo("CPU on %s is currently %d %", so["SentinelName"].as<char *>(), so["Value"]["Value"].as<float>()); }); |
Vous pouvez enregistrer autant de StateObjectLink que vous le désirez. Là encore nous utilisé une expression lambda mais vous pouvez aussi bien “extraire” cette fonction callback dans une fonction distincte.
N’oubliez pas non plus d’appeler la méthode constellation.loop()” aussi souvent que possible dans la boucle principale de votre programme.
Démarrez la discussion sur le forum Constellation