Raspberry PI Tutorial

IoT personnalisé – Pointeurs de fonction

Par Thomas, le 12 novembre 2020
IoT personnalisé - Pointeurs de fonction

Auparavant, nous avons appris à coder notre serveur et notre client pour former un système MQTT de base. Dans ce dernier projet de toute la série MQTT, nous allons apprendre à implémenter des pointeurs de fonction dans notre client afin qu’il réponde dès qu’une variable a été mise à jour.

Solutions IoT personnalisées – Introduction à l’Internet des objets

Solutions IoT personnalisées – ESP32 vs ESP8266

Solutions IoT personnalisées – HTTP vs MQTT

Solutions IoT personnalisées – Créer un système de publication HTTP

Solutions IoT personnalisées – Comment faire des requêtes HTTP GET

Solutions IoT personnalisées – Présentation de MQTT

Solutions IoT personnalisées – Framework MQTT

Solutions IoT personnalisées – MQTT Pub and Sub

Pointeurs de fonction client – Répondre aux événements

Le code que nous avons créé jusqu’à présent permet à un client de se connecter à un serveur, d’envoyer des données à stocker et de recevoir des données au fur et à mesure de leur mise à jour. Bien que ce soit parfaitement acceptable pour les projets qui transmettent uniquement des données, ce n’est pas le plus pratique pour ceux qui ont besoin de répondre aux mises à jour. Par exemple, un capteur de température de l’Internet des objets (IoT) peut envoyer des messages au serveur pour allumer ou éteindre un radiateur, mais comment le radiateur, qui est également connecté au serveur, peut-il répondre à ces changements?

Une méthode serait d’analyser toutes les variables auxquelles nous avons souscrit et d’attendre un changement de valeur. Cette méthode, cependant, n’est pas très pratique car elle nécessite des boucles dans la section principale du code. Cette méthode consomme également des ressources CPU qui pourraient être mieux utilisées, telles que la commande d’un écran, la lecture des entrées utilisateur et la gestion des signaux de capteur. Cette méthode est connue sous le nom d’interrogation et ne permet pas de réponses en temps réel à des changements soudains de signaux ou de variables.

Au lieu de cela, notre système sera codé de sorte que dès qu’une variable est mise à jour, une fonction (qui est définie par l’utilisateur), est appelée. Cela permet à une fonction personnalisée de s’exécuter dès qu’un changement est détecté, rendant notre code exécuté en temps réel. Cela signifie également que le CPU n’a pas besoin de passer du temps à rechercher des changements de variable car la fonction est exécutée dès que le serveur envoie un message au client qu’un changement de variable vient d’être détecté.

Pointeurs de fonction

Nous savons tous quelles sont les fonctions en C ++: des morceaux de code qui peuvent être exécutés comme un bloc indépendamment de quoi que ce soit d’autre. Nous savons également ce que sont les pointeurs: des références à un emplacement en mémoire. Par conséquent, un pointeur de fonction est un pointeur qui pointe vers une fonction. Si un pointeur de fonction est appelé en tant que fonction, il exécutera également la fonction sur laquelle il pointe! Pour mieux comprendre leur fonctionnement, voyons un exemple simple!

iot personnalisé - pointeurs de fonction

La première section de code est la fonction que nous voulons exécuter. Cette fonction, une fois exécutée, affichera la chaîne que nous lui transmettons (dans ce cas, le nom d’une personne).

La prochaine section de code est la boucle principale que le programme exécute. La première ligne de code crée un pointeur de fonction dont le type est void et accepte un argument, str. Cette déclaration doit correspondre à la fonction que nous voulons transmettre, donc si, par exemple, la fonction que nous voulons transmettre renvoie un entier et prend trois paramètres, il faudrait un pointeur de fonction dont le type est int, et accepte trois paramètres.

La ligne de code suivante attribue le printName fonction vers le pointeur de fonction. Notez que cela ne copie pas le code, mais indique au pointeur de fonction où se trouve la fonction dans le code.

La dernière section de code exécute le printName fonction en utilisant le pointeur de fonction au lieu d’appeler la fonction elle-même. Ici, on lui passe le nom de l’auteur.

Implémentation dans notre système

Le premier morceau de code que nous devons mettre à jour dans notre système est la classe de variable. Les deux morceaux de code que nous ajoutons sont la déclaration du pointeur de fonction et un indicateur qui détermine si nous devons exécuter la fonction lorsqu’une mise à jour de variable est détectée.

iot personnalisé - pointeurs de fonction 2

Le deuxième morceau de code à ajouter est l’initialisation du tableau de variables dans le constructeur de classe MakerMQTT. La ligne de code ajoutée garantit que le functionUse L’indicateur est défini sur false au démarrage.

iot personnalisé - pointeurs de fonction 3

Le troisième morceau de code à ajouter permet à l’utilisateur d’attacher sa propre fonction à une variable. L’utilisateur transmet la variable à laquelle il souhaite associer une fonction ainsi qu’une fonction void et le attach_function code block recherchera la variable et définira le pointeur de la fonction de variables sur la fonction passée. Dans le même temps, le functionUsed flag est défini sur true car il est supposé qu’en appelant cette fonction, l’utilisateur souhaite que la fonction soit appelée.

iot personnalisé - pointeurs de fonction 4

La dernière section du code est très simple et réside dans le updateSystem bloquer. Lorsqu’une commande SUB est reçue du serveur (indiquant qu’une mise à jour a été envoyée), le code vérifie si le functionUsed flag est vrai. Si tel est le cas, le pointeur de fonction est appelé avec la valeur de la variable comme paramètre. Cela appelle la fonction utilisateurs et cette fonction s’exécute immédiatement en temps réel.

iot personnalisé - pointeurs de fonction 5

Exemple d’utilisation

Pour utiliser le attach_function méthode, nous devons simplement créer une fonction qui sera activée lorsqu’un changement est détecté, puis appeler le attach_function.

iot personnalisé - pointeurs de fonction 6

iot personnalisé - pointeurs de fonction 7

Chaque fois que des mises à jour sont envoyées à la variable d’humidité, la fonction dataReceived est appelée et dans cet exemple, la valeur qui a été mise à jour est imprimée sur la console.

Conclusion

Bien qu’il ne soit pas terminé, notre système MakerMQTT est maintenant capable de répondre en temps réel, de fournir des capacités de publication et de garder les appareils connectés. Pour aller plus loin dans ce projet, vous pouvez ajouter vos propres commandes personnalisées qui peuvent amener le serveur à effectuer des tâches ou à envoyer des messages à des clients spécifiques. La sécurité peut être ajoutée aux protocoles de messagerie pour masquer les informations tandis que les systèmes d’autorisation ne peuvent autoriser que certains appareils à se connecter. Un site HTML peut être hébergé dans le même répertoire permettant des représentations graphiques des données et des éléments de contrôle du tableau de bord. Bien que ce système soit basique, il vous donne beaucoup de puissance et de liberté pour concevoir vos propres solutions IoT internes entièrement personnalisées qui ne reposent pas sur des packages coûteux, n’utilisent pas de méthodes compliquées ou ne limitent pas vos débits de données. Le monde est ton coquillage!

Photo de Robin Mitchell

Thomas

Thomas

Fan de Raspberry Pi de la première heure, je suis l'évolution de ces micro-pc depuis maintenant 5 ans. En plus de l'actualité je propose de nombreux tutoriels pour vous aider à exploiter pleinement votre nano-ordinateur côté domotique ou retro-gaming.