Mon voyage dans le nuage IoT (8) : protocole d’application simple
Notre exploration du monde de l’Internet des Objets se poursuit. Au programme de cette étape : l’implantation d’un protocole pour client Android permettant de commander et de faire varier la luminosité de plusieurs lampes. Et pourquoi pas d’une LED RGB si vous avez envie de jouer avec le code !
Dans le précédent épisode, j’étais parvenu à installer un client MQTT pour Android grâce une bibliothèque Java du projet Paho. Ce client Android permet d’envoyer depuis un téléphone des messages de texte à un client MQTT installé sur un PC, les messages étant relayés par un courtier (broker) public de l’internet.
Dans le montage que j’utilise pour mon exploration de l’Internet des Objets, le programme PC transmet les messages via USB à une carte SAM D20 à laquelle est reliée une carte d’extension à relais. Les contacts des relais 1 et 0 sont reliés aux boutons ON et OFF d’une télécommande de « prise électrique télécommandée ». Si je branche un appareil à cette prise, je peux le mettre sous tension en activant le relais 1 durant une courte période et en le désactivant ensuite. Je peux éteindre l’appareil de la même façon avec le relais 0.
Lors de mes essais précédents, j’utilisais le micrologiciel Elektor standard de la SAM D20 pour commander les relais via l’interface série (cf. le magazine). L’envoi de l’instruction « R 0 1 + » activait le relais 1, l’envoi de l’instruction « R 0 1 – » le désactivait. Pour mettre sous tension l’appareil branché sur la prise télécommandée, je devais donc entrer deux messages MQTT et chaque fois appuyer sur le bouton PUBLISH :
R 0 1 + [PUBLISH] R 0 1 – [PUBLISH]
La méthode est poussive, personne n’a envie d’entrer des commandes depuis son smartphone pour simplement allumer un appareil. Pour continuer à me faire la main, j’ai alors songé à une application plus utile, une appli qui permettrait d’allumer et d’éteindre plusieurs lampes et, si elles le permettent, de faire varier leur luminosité en entrant des valeurs de 0 à 255. Quid des lampes à LED tricolores (RGB) ? Eh bien dans ce cas on pourrait utiliser trois valeurs de luminosité, une pour chaque couleur.
Après avoir un peu cogité, j’ai écrit un protocole rudimentaire qui n’utilise que deux octets pour transmettre deux valeurs hexadécimales, par exemple « 0503 ». Le premier octet indique le numéro de canal (ou de contrôleur) correspondant à la lampe à commander. Le second octet représente la valeur à transmettre, variable que j’ai appelée ControllerValue. Si vous connaissez les protocoles de transmission MIDI ou DMX, vous remarquerez vite que mon modeste protocole peut également servir à commander des systèmes d’éclairage ou du matériel de musique électronique.
Pour utiliser ce « CCProtocol » avec mon client MQTT Android, j’ai ensuite créé une petite interface utilisateur (cf. image). Comme vous le voyez sur la capture d’écran, en haut de la fenêtre se trouve une zone de sélection appelée Controller. C’est elle qui permet de sélectionner le numéro de canal (contrôleur). Si par exemple je sélectionne « 6 », je peux ensuite commander la lampe no 6 avec les boutons ON et OFF. Lorsque j’appuie sur ON, le programme envoie le texte « 06FF » (ControllerValue FF = 255 = allumer la lampe). Le message « 0600 » est de même envoyé dans l’internet lorsque j’appuie sur OFF. La boîte déroulante appelée Value permet d’entrer une valeur intermédiaire (pour commander l’intensité de l’éclairage). Même principe : si je sélectionne disons « 3 », l’appli envoie le texte « 0603 ». Comme le montre la capture d’écran, j’ai conservé la zone de texte Text to publish ainsi que le bouton PUBLISH de ma précédente version afin de pouvoir aussi envoyer n’importe quel type de texte via MQTT.
Vous vous demandez peut-être où est passée la précédente zone Topic qui permettait d’entrer le sujet d’un message. Elle est accessible depuis un menu Settings, que j’ai enfin trouvé le temps d’ajouter. Pour entrer un sujet, activez (touchez) le petit bouton de menu placé en haut et à droite de l’écran, ouvrez le menu Settings, et enfin sélectionnez Set Topic. Une nouvelle fenêtre s’ouvre, dans laquelle on entre le sujet du message. Comme toujours, le Topic entier est formé de la combinaison suivante :
"/ElektorMyJourneyIoT/" + Topic + "/test"
Si on entre par exemple « lamp » comme Topic, on doit également entrer « lamp » comme Topic to subscribe dans le client PC MQTT, puis cliquer sur le bouton Subscribe. Le sujet (topic) complet « /ElektorMyJourneyIoT/lamp/test » sera alors également paramétré côté PC, autrement dit le PC pourra recevoir les messages envoyés depuis le téléphone.
Il m’a bien sûr fallu modifier le micrologiciel de la carte Atmel pour que je puisse commuter ma prise télécommandée avec les commandes 00FF (ON) et 0000 (OFF). Vous pouvez télécharger ci-dessous le code du micrologiciel modifié, ainsi que les clients MQTT pour Android et pour PC
Voilà pour cette fois ; dans un prochain épisode, nous poursuivrons notre petit bonhomme de chemin avec en particulier une optimisation de l’électronique. Prochain objectif bien sûr : relier directement la carte au réseau !
Dans le montage que j’utilise pour mon exploration de l’Internet des Objets, le programme PC transmet les messages via USB à une carte SAM D20 à laquelle est reliée une carte d’extension à relais. Les contacts des relais 1 et 0 sont reliés aux boutons ON et OFF d’une télécommande de « prise électrique télécommandée ». Si je branche un appareil à cette prise, je peux le mettre sous tension en activant le relais 1 durant une courte période et en le désactivant ensuite. Je peux éteindre l’appareil de la même façon avec le relais 0.
Lors de mes essais précédents, j’utilisais le micrologiciel Elektor standard de la SAM D20 pour commander les relais via l’interface série (cf. le magazine). L’envoi de l’instruction « R 0 1 + » activait le relais 1, l’envoi de l’instruction « R 0 1 – » le désactivait. Pour mettre sous tension l’appareil branché sur la prise télécommandée, je devais donc entrer deux messages MQTT et chaque fois appuyer sur le bouton PUBLISH :
R 0 1 + [PUBLISH] R 0 1 – [PUBLISH]
La méthode est poussive, personne n’a envie d’entrer des commandes depuis son smartphone pour simplement allumer un appareil. Pour continuer à me faire la main, j’ai alors songé à une application plus utile, une appli qui permettrait d’allumer et d’éteindre plusieurs lampes et, si elles le permettent, de faire varier leur luminosité en entrant des valeurs de 0 à 255. Quid des lampes à LED tricolores (RGB) ? Eh bien dans ce cas on pourrait utiliser trois valeurs de luminosité, une pour chaque couleur.
Après avoir un peu cogité, j’ai écrit un protocole rudimentaire qui n’utilise que deux octets pour transmettre deux valeurs hexadécimales, par exemple « 0503 ». Le premier octet indique le numéro de canal (ou de contrôleur) correspondant à la lampe à commander. Le second octet représente la valeur à transmettre, variable que j’ai appelée ControllerValue. Si vous connaissez les protocoles de transmission MIDI ou DMX, vous remarquerez vite que mon modeste protocole peut également servir à commander des systèmes d’éclairage ou du matériel de musique électronique.
Pour utiliser ce « CCProtocol » avec mon client MQTT Android, j’ai ensuite créé une petite interface utilisateur (cf. image). Comme vous le voyez sur la capture d’écran, en haut de la fenêtre se trouve une zone de sélection appelée Controller. C’est elle qui permet de sélectionner le numéro de canal (contrôleur). Si par exemple je sélectionne « 6 », je peux ensuite commander la lampe no 6 avec les boutons ON et OFF. Lorsque j’appuie sur ON, le programme envoie le texte « 06FF » (ControllerValue FF = 255 = allumer la lampe). Le message « 0600 » est de même envoyé dans l’internet lorsque j’appuie sur OFF. La boîte déroulante appelée Value permet d’entrer une valeur intermédiaire (pour commander l’intensité de l’éclairage). Même principe : si je sélectionne disons « 3 », l’appli envoie le texte « 0603 ». Comme le montre la capture d’écran, j’ai conservé la zone de texte Text to publish ainsi que le bouton PUBLISH de ma précédente version afin de pouvoir aussi envoyer n’importe quel type de texte via MQTT.
Vous vous demandez peut-être où est passée la précédente zone Topic qui permettait d’entrer le sujet d’un message. Elle est accessible depuis un menu Settings, que j’ai enfin trouvé le temps d’ajouter. Pour entrer un sujet, activez (touchez) le petit bouton de menu placé en haut et à droite de l’écran, ouvrez le menu Settings, et enfin sélectionnez Set Topic. Une nouvelle fenêtre s’ouvre, dans laquelle on entre le sujet du message. Comme toujours, le Topic entier est formé de la combinaison suivante :
"/ElektorMyJourneyIoT/" + Topic + "/test"
Si on entre par exemple « lamp » comme Topic, on doit également entrer « lamp » comme Topic to subscribe dans le client PC MQTT, puis cliquer sur le bouton Subscribe. Le sujet (topic) complet « /ElektorMyJourneyIoT/lamp/test » sera alors également paramétré côté PC, autrement dit le PC pourra recevoir les messages envoyés depuis le téléphone.
Il m’a bien sûr fallu modifier le micrologiciel de la carte Atmel pour que je puisse commuter ma prise télécommandée avec les commandes 00FF (ON) et 0000 (OFF). Vous pouvez télécharger ci-dessous le code du micrologiciel modifié, ainsi que les clients MQTT pour Android et pour PC
Voilà pour cette fois ; dans un prochain épisode, nous poursuivrons notre petit bonhomme de chemin avec en particulier une optimisation de l’électronique. Prochain objectif bien sûr : relier directement la carte au réseau !