Mon voyage dans le nuage (14) : retour sur le serveur MQTT
02 mai 2017
sur
sur
Lors du dernier épisode, j'avais réalisé un petit capteur autonome. Sur la carte Pretzel disponible dans l'e-choppe (équipée d'un ATmega d'une puce Wi-Fi ESP8266) j'avais raccordé un phototransistor, un bouton pour lancer des actions et une LED RVB pour avoir un retour. À la mise sous tension, l'ESP8266 se connecte au réseau Wi-Fi ; quand c'est fait, la LED RVB s'allume en vert. En appuyant sur le bouton, l'ATmega passe en mode capteur ; il échantillonne le signal fourni par le phototransistor et indique à l'ESP8266 au moyen de commandes AT de se connecter par Internet au serveur du courtier HiveMQ ; d'abord via TCP/IP, ensuite, il envoie la commande MQTT-CONNECT puis la commande MQTT-PUBLISH, avec comme donnée utile la valeur de la mesure (Payload) .
J'avais déjà réalisé un traitement rudimentaire des erreurs : l'ESP8266 renvoie bien « ERROR », par ex. si la liaison TCP/IP ne s'établit pas. Les réponses du serveur reçues via TCP/IP n'ont pas encore été traitées. En réponse à la commande CONNECT, le serveur MQTT répond par ex. avec les octets « 32 2 0 0 » si la tentative de connexion a abouti et qu'il est possible de publier un message.
J'ai adjoint la fonction TCPClient_Receive(byte TCPBytesReceivedBuffer[) à ma bibliothèque TCP/IP rudimentaire. Elle fait demander à l'ESP8266, si les octets du serveur ont été reçus et les écrit dans la zone mémoire retransmise sous forme de paramètres. Je pouvais désormais utiliser la fonction MQTTClient_Connect(String clientid) de la bibliothèque MQTT pour traiter les octets reçus. En cas de réussite, la fonction renvoie un 1 et dans la négative, un 0. Dans la fonction d'appel (qui, comme indiqué ci-dessus, s'exécute périodiquement), j'ai utilisé la valeur retournée pour allumer la diode rouge si la tentative de connexion n'aboutit pas ce qui arrive en effet de temps en temps.
À ce stade, j'étais capable de recevoir et d'évaluer les octets du serveur et je voulais aller plus loin et poursuivre ma programmation. J'ai ajouté à ma bibliothèque MQTT une fonction capable d'envoyer une demande SUBSCRIBE d'abonnement à des messages et, là encore, d'évaluer la réponse du serveur. Rapidement, j'ai aussi réussi à recevoir sur la carte Pretzel les messages envoyés par un autre client MQTT sur Internet. Pour cela, la nouvelle fonction
MQTTClient_Get(byte MQTTBytesPayloadBuffer[]) doit être appelée périodiquement. Il y a quelque chose que je ne savais pas encore : le courtier transmet 1:1 (à l'identique) les octets envoyés par le client MQTT d'expédition et contenus dans la commande MQTT PUBLISH à tous les clients qui se sont abonnés au « Topic » (Topic compris, avec bien-sûr les données elles-mêmes et les octets de longueur). Dans le prochain épisode, je présenterai de manière plus détaillée la réception des messages MQTT par la carte Pretzel, avec comme il se doit une petite application de démonstration.
Dans cet épisode, vous trouverez en premier lieu le logiciel étendu de ma petite carte capteur en téléchargement. Au-delà de l'amélioration du traitement des erreurs j'ai nettoyé et amélioré le niveau d'abstraction du code. Il y a par ex. des fonctions spécifiques destinées au retour d'information par la LED RGB et la LED bleue de la carte. Cela facilite le portage vers un autre matériel. Le code est désormais commenté. Si vous souhaitez aller plus loin, vous pouvez également télécharger à nouveau le croquis Arduino du dernier épisode pour le comparer à la version actuelle.
J'avais déjà réalisé un traitement rudimentaire des erreurs : l'ESP8266 renvoie bien « ERROR », par ex. si la liaison TCP/IP ne s'établit pas. Les réponses du serveur reçues via TCP/IP n'ont pas encore été traitées. En réponse à la commande CONNECT, le serveur MQTT répond par ex. avec les octets « 32 2 0 0 » si la tentative de connexion a abouti et qu'il est possible de publier un message.
J'ai adjoint la fonction TCPClient_Receive(byte TCPBytesReceivedBuffer[) à ma bibliothèque TCP/IP rudimentaire. Elle fait demander à l'ESP8266, si les octets du serveur ont été reçus et les écrit dans la zone mémoire retransmise sous forme de paramètres. Je pouvais désormais utiliser la fonction MQTTClient_Connect(String clientid) de la bibliothèque MQTT pour traiter les octets reçus. En cas de réussite, la fonction renvoie un 1 et dans la négative, un 0. Dans la fonction d'appel (qui, comme indiqué ci-dessus, s'exécute périodiquement), j'ai utilisé la valeur retournée pour allumer la diode rouge si la tentative de connexion n'aboutit pas ce qui arrive en effet de temps en temps.
À ce stade, j'étais capable de recevoir et d'évaluer les octets du serveur et je voulais aller plus loin et poursuivre ma programmation. J'ai ajouté à ma bibliothèque MQTT une fonction capable d'envoyer une demande SUBSCRIBE d'abonnement à des messages et, là encore, d'évaluer la réponse du serveur. Rapidement, j'ai aussi réussi à recevoir sur la carte Pretzel les messages envoyés par un autre client MQTT sur Internet. Pour cela, la nouvelle fonction
MQTTClient_Get(byte MQTTBytesPayloadBuffer[]) doit être appelée périodiquement. Il y a quelque chose que je ne savais pas encore : le courtier transmet 1:1 (à l'identique) les octets envoyés par le client MQTT d'expédition et contenus dans la commande MQTT PUBLISH à tous les clients qui se sont abonnés au « Topic » (Topic compris, avec bien-sûr les données elles-mêmes et les octets de longueur). Dans le prochain épisode, je présenterai de manière plus détaillée la réception des messages MQTT par la carte Pretzel, avec comme il se doit une petite application de démonstration.
Dans cet épisode, vous trouverez en premier lieu le logiciel étendu de ma petite carte capteur en téléchargement. Au-delà de l'amélioration du traitement des erreurs j'ai nettoyé et amélioré le niveau d'abstraction du code. Il y a par ex. des fonctions spécifiques destinées au retour d'information par la LED RGB et la LED bleue de la carte. Cela facilite le portage vers un autre matériel. Le code est désormais commenté. Si vous souhaitez aller plus loin, vous pouvez également télécharger à nouveau le croquis Arduino du dernier épisode pour le comparer à la version actuelle.
Lire l'article complet
Hide full article
Au sujet de Jens Nickel
Jens Nickel a étudié la physique à l’université de Stuttgart. Il a été attiré très tôt par l’écriture d’articles techniques. Passionné de journaux techniques et scientifiques, il a saisi l’occasion de transformer son passe-temps en métier grâce à un poste de r... >>
Discussion (0 commentaire(s))