Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue133:python [2018/05/30 08:34] – christo.2so | issue133:python [2018/05/31 15:43] (Version actuelle) – d52fr |
---|
**This month, we'll continue our discussion of MQTT, especially how MQTT can support quality of service and then we'll modify our original program from Full Circle issue #109 to support MQTT.** | **This month, we'll continue our discussion of MQTT, especially how MQTT can support quality of service and then we'll modify our original program from Full Circle issue #109 to support MQTT.** |
| |
Ce mois-ci, nous poursuivrons notre discussion sur MQTT, en particulier sur la façon dont MQTT peut assurer la bonne qualité d'un service, puis nous modifierons notre programme original du numéro 109 de Full Circle pour supporter MQTT. | Ce mois-ci, nous poursuivrons notre discussion sur MQTT, en particulier sur la façon dont MQTT peut assurer la bonne qualité d'un service, puis nous modifierons notre programme original du numéro 109 du Full Circle pour supporter MQTT. |
| |
**QoS | **QoS |
QoS | QoS |
| |
QoS signifie Qualité de service. MQTT supporte trois niveaux, numérotés 0, 1 et 2. Si vous n'avez pas à être certain de savoir ceux qui sont abonnés à vos messages thématiques, alors vous utilisez simplement une QoS de 0. Voici une description des niveaux : | QoS signifie Qualité de service. MQTT supporte trois niveaux, numérotés 0, 1 et 2. Si vous ne devez pas être certain de savoir ceux qui sont abonnés à vos messages thématiques, alors vous utilisez simplement une QoS de 0. Voici une description des niveaux : |
| |
0 - Au plus une fois | 0 - Au plus une fois. |
1 - Au moins une fois | 1 - Au moins une fois. |
2 - Exactement une fois | 2 - Exactement une fois. |
| |
| |
**When the broker transfers a message to a subscribing client, it uses the QoS of the subscription made by the receiving client** | **When the broker transfers a message to a subscribing client, it uses the QoS of the subscription made by the receiving client** |
| |
Lorsque le gestionnaire transfère un message à un client abonné, il utilise la QoS de l'abonnement effectué par le client destinataire. | Lorsque l'intermédiaire/serveur (le « broker ») transfère un message à un client abonné, il utilise la QoS de l'abonnement effectué par le client destinataire. |
| |
| |
Niveau 0 | Niveau 0 |
| |
Le niveau 0 garantit la meilleure garantie de livraison. Le message ne fera pas l'objet d'un accusé de réception par le destinataire (courtier ou client), et il ne sera pas non plus stocké et réexpédié par l'expéditeur. | Le niveau 0 fournit la meilleure garantie de livraison. Le message ne fera pas l'objet d'un accusé de réception par le destinataire (l'intermédiaire ou le client), et il ne sera pas non plus stocké et renvoyé par l'expéditeur. |
| |
Niveau 1 | Niveau 1 |
| |
L'utilisation du niveau 1 garantit qu'un message sera livré au moins une fois au destinataire (de l'éditeur au courtier ou du courtier à l'abonné). L'expéditeur stocke le message jusqu'à ce qu'il reçoive un message PUBACK du destinataire. Notez que le message peut être envoyé plusieurs fois au destinataire jusqu'à ce que le PUBACK soit renvoyé à l'expéditeur. | L'utilisation du niveau 1 garantit qu'un message sera livré au moins une fois au destinataire (de l'éditeur à l'intermédiaire et de l'intermédiaire à l'abonné). L'expéditeur stocke le message jusqu'à ce qu'il reçoive un message PUBACK du destinataire. Notez que le message peut être envoyé plusieurs fois au destinataire jusqu'à ce que le PUBACK soit renvoyé à l'expéditeur. |
| |
Niveau 2 | Niveau 2 |
| |
Comme vous pouvez le voir sur le diagramme, le client envoie un message de publication au courtier et le courtier renvoie un PUBREC. L'expéditeur stocke ensuite une référence à l'identificateur de paquet, qui est ensuite stocké et envoie un message PUBREL. Si le destinataire répond avec un message PUBCOMP, l'expéditeur sait alors qu'il peut jeter le message et la référence en toute sécurité. Si un message se perd quelque part en cours de route, l'expéditeur (le client de publication ou le courtier) est responsable de la réexpédition du dernier message. | Comme vous pouvez le voir sur le diagramme, le client envoie un message de publication à l'intermédiaire et l'intermédiaire renvoie un PUBREC. L'expéditeur stocke ensuite une référence à l'identificateur de paquet, qui est alors stocké, et envoie un message PUBREL. Si le destinataire répond avec un message PUBCOMP, l'expéditeur sait alors qu'il peut jeter le message et la référence en toute sécurité. Si un message se perd quelque part en cours de route, l'expéditeur (le client qui publie le message ou l'intermédiaire) est responsable de la réexpédition du dernier message. |
| |
| |
When should you use one level over another? Basically if your publishing client doesn't need to worry if there might be a missed transmission or two, and your connection to the broker is reliable 24/7, you could pretty much feel safe to use Qos Level 0. If you need to have a guarantee that the published message will get to (or from) the broker with somewhere near complete assurance that the messages will make it through, then use Level 1. If a message absolutely positively must get through, then use Level 2, but remember, nothing in life is 100% perfect, especially when relying on connecting to a broker (on either end) via an external connection to the internet.** | When should you use one level over another? Basically if your publishing client doesn't need to worry if there might be a missed transmission or two, and your connection to the broker is reliable 24/7, you could pretty much feel safe to use Qos Level 0. If you need to have a guarantee that the published message will get to (or from) the broker with somewhere near complete assurance that the messages will make it through, then use Level 1. If a message absolutely positively must get through, then use Level 2, but remember, nothing in life is 100% perfect, especially when relying on connecting to a broker (on either end) via an external connection to the internet.** |
| |
Bien sûr, le niveau 1 de QoS est plus rapide que le niveau 2, puisqu'il n'y a que deux messages à traiter qaund le niveau 2 en a quatre, et le niveau 0 de QoS est encore plus rapide que le niveau 1. | Bien sûr, le niveau 1 de QoS est plus rapide que le niveau 2, puisqu'il n'y a que deux messages à traiter quand le niveau 2 en a quatre, et le niveau 0 de QoS est encore plus rapide que le niveau 1. |
| |
Lorsque le courtier envoie un message à un client abonné, la QoS utilisée est celle utilisée par le client lorsqu'il s'abonne au sujet. Par conséquent, la QoS peut être déclassée par rapport à l'intention du client de publication. | Lorsque l'intermédiaire envoie un message à un client abonné, la QoS utilisée est celle utilisée par le client lorsqu'il s'abonne au sujet. Par conséquent, la QoS peut être déclassée par rapport à l'intention du client expéditeur. |
| |
A quel moment doit-on utiliser un niveau plutôt qu'un autre ? Fondamentalement, si votre client de publication n'a pas à s'inquiéter d'une ou deux transmissions manquées, et que votre connexion avec le courtier est fiable 24 heures sur 24 et 7 jours sur 7, vous pourriez vous sentir en sécurité pour utiliser le niveau 0 de Qos. Si vous avez besoin de garantir que le message publié parviendra au courtier (ou en provenance de celui-ci), avec l'assurance que les messages passeront, utilisez le niveau 1. Si un message doit absolument passer, alors utilisez le niveau 2, mais rappelez-vous que rien dans la vie n'est parfait à 100%, surtout si vous comptez vous connecter à un courtier (de part et d'autre) via une connexion externe vers l'Internet | A quel moment doit-on utiliser un niveau plutôt qu'un autre ? Fondamentalement, si votre client expéditeur n'a pas à s'inquiéter d'une ou deux transmissions manquées, et que votre connexion à l'intermédiaire est fiable 24 heures sur 24 et 7 jours sur 7, vous pourriez vous sentir en sécurité en utilisant le niveau 0 de Qos. Si vous avez besoin de garantir que le message publié parviendra à l'intermédiaire (ou en provenance de celui-ci), avec l'assurance presque totale que les messages passeront, utilisez le niveau 1. Si un message doit passer sans faute, alors utilisez le niveau 2, mais rappelez-vous que rien dans la vie n'est parfait à 100 %, surtout si vous comptez vous connecter à un intermédiaire (de part et d'autre) via une connexion externe vers l'Internet. |
| |
| |
**We will be using a Qos Level 1 for our communications in our demo, just for practice.** | **We will be using a Qos Level 1 for our communications in our demo, just for practice.** |
| |
Nous utiliserons le niveau 1 de Qos pour nos communications dans notre démo, juste pour la pratique. | Nous utiliserons le niveau 1 de Qos pour les communications dans notre démo d'entraînement. |
| |
| |
Le matériel | Le matériel |
| |
Si vous vous souvenez du projet original réalisé dans le FCM 109, nous avons utilisé un DHT11 connecté à notre Raspberry Pi. Nous avons utilisé la bibliothèque DHT22 python d'Adafruit et avons légèrement modifié leur code échantillon. | Si vous vous souvenez du projet original réalisé dans le FCM n° 109, nous avons utilisé un DHT11 connecté à notre Raspberry Pi. Nous avons utilisé la bibliothèque DHT22 python d'Adafruit et avons légèrement modifié leur code échantillon. |
| |
J'ai recréé le diagramme de Fritzing en montrant les connexions matérielles..... | J'ai recréé le diagramme de Fritzing en montrant les connexions matérielles : |
| |
Une fois tout le matériel installé, nous devons maintenant télécharger et installer la bibliothèque. Si vous n'avez pas la bibliothèque, vous pouvez la trouver sur GitHub à l'adresse https://github.com/adafruit/Adafruit_Python_DHT.git. Rappelez-vous, vous devez installer la bibliothèque sur le Raspberry Pi. Voici les étapes pour cloner la bibliothèque de github. | Une fois tout le matériel installé, nous devons télécharger et installer la bibliothèque. Si vous n'avez pas la bibliothèque, vous pouvez la trouver sur GitHub à l'adresse https://github.com/adafruit/Adafruit_Python_DHT.git . Rappelez-vous que vous devez installer la bibliothèque sur le Raspberry Pi. Voici les étapes pour cloner la bibliothèque de github : |
| |
| |
Here is our updated code (right, and continuing on to the next page). You can try modifying the original code, or just start over. It’s not that long.** | Here is our updated code (right, and continuing on to the next page). You can try modifying the original code, or just start over. It’s not that long.** |
| |
Le code d'exemple se trouve dans le dossier «/examples», appelé simpletest.py. Assurez-vous de changer la ligne qui définit la broche de votre capteur pour qu'elle corresponde à votre configuration. Le code original suppose que vous mettez la broche de données du capteur sur le GPIO 23 (ligne 35). Dans la configuration que je présente, utilisez GPIO 4. Assurez-vous également de commenter la ligne 31 si vous utilisez un Raspberry Pi au lieu d'une planche Beaglebone. | Le code d'exemple se trouve dans le dossier « /examples », appelé simpletest.py. Assurez-vous de changer la ligne qui définit la broche de votre capteur pour qu'elle corresponde à votre configuration. Le code original suppose que vous mettez la broche de données du capteur sur le GPIO 23 (ligne 35). Dans la configuration que je présente, utilisez GPIO 4. Assurez-vous également de commenter la ligne 31 si vous utilisez un Raspberry Pi au lieu d'une carte Beaglebone. |
| |
Voici notre code mis à jour (à droite, et en continuant à la page suivante). Vous pouvez essayer de modifier le code original ou simplement recommencer à zéro. Ce n'est pas si long. | Voici notre code mis à jour (à droite, puis il continue à la page suivante). Vous pouvez essayer de modifier le code original ou simplement recommencer à zéro. Ce n'est pas si long. |
| |
| |
**In those last lines (next page), we check to make sure that we got data from the sensor, and if so, we create two messages, one containing the humidity value and one containing the temperature value. In the next two lines, we actually publish the messages. Notice that we are using a QoS value of 1 with a retain value of True. This should ensure delivery if the broker is there and if there are any clients listening for our data. Finally, we sleep for 5 seconds and repeat the loop. Feel free to change the sleep value to whatever you wish over 5. The DHT11/22 doesn’t like to be accessed more than about once every 5 seconds. A realistic value would be somewhere between 30 and 60 seconds.** | **In those last lines (next page), we check to make sure that we got data from the sensor, and if so, we create two messages, one containing the humidity value and one containing the temperature value. In the next two lines, we actually publish the messages. Notice that we are using a QoS value of 1 with a retain value of True. This should ensure delivery if the broker is there and if there are any clients listening for our data. Finally, we sleep for 5 seconds and repeat the loop. Feel free to change the sleep value to whatever you wish over 5. The DHT11/22 doesn’t like to be accessed more than about once every 5 seconds. A realistic value would be somewhere between 30 and 60 seconds.** |
| |
Dans ces dernières lignes (page suivante), nous vérifions que nous avons bien reçu les données du capteur, et si c'est le cas, nous créons deux messages, l'un contenant la valeur d'humidité et l'autre la valeur de température. Dans les deux lignes suivantes, nous publions les messages. Notez que nous utilisons une valeur de QoS de 1 avec une valeur de rétention de type «True». Cela devrait assurer la livraison si le courtier est là et s'il y a des clients qui écoutent nos données. Finalement, nous dormons pendant 5 secondes et répétons la boucle. N'hésitez pas à changer la valeur de sommeil si vous souhaitez plus de 5 secondes. Le DHT11/22 n'aime pas qu'on y accède plus d'une fois toutes les 5 secondes environ. Une valeur réaliste se situe entre 30 et 60 secondes. | Dans ces dernières lignes (page suivante), nous vérifions que nous avons bien reçu les données du capteur et, si c'est le cas, nous créons deux messages, l'un contenant la valeur d'humidité et l'autre la valeur de température. Dans les deux lignes suivantes, nous publions les messages. Notez que nous utilisons une valeur de QoS de 1 avec une valeur de rétention de type « True ». Cela devrait assurer la livraison si l'intermédiaire est là et s'il y a des clients qui écoutent nos données. Enfin, nous dormons pendant 5 secondes et répétons la boucle. N'hésitez pas à changer la valeur de sommeil si vous souhaitez plus de 5 secondes. Le DHT11/22 n'aime pas qu'on y accède plus d'une fois toutes les 5 secondes environ. Une valeur réaliste se situe entre 30 et 60 secondes. |
| |
client.publish(MQTT_PATH1,hmsg,qos=1,retain=True) | client.publish(MQTT_PATH1,hmsg,qos=1,retain=True) |
Now you can run your program (be sure the broker is running BEFORE you start the program). Next, run mosquitto_sub on the RPi subscribing to one or both of the topics we set up in our program. You should see a message each time the loop runs.** | Now you can run your program (be sure the broker is running BEFORE you start the program). Next, run mosquitto_sub on the RPi subscribing to one or both of the topics we set up in our program. You should see a message each time the loop runs.** |
| |
Bien sûr, je suppose que votre courtier utilise le même Raspberry Pi. Si ce n'est pas le cas, assurez-vous de changer l'adresse IP vers laquelle MQTT_SERVER pointe. | Bien sûr, je suppose que votre intermédiaire utilise le même Raspberry Pi. Si ce n'est pas le cas, assurez-vous de changer l'adresse IP vers laquelle MQTT_SERVER pointe. |
| |
Vous pouvez maintenant exécuter votre programme (assurez-vous que le courtier est en cours d'exécution AVANT de démarrer le programme). Ensuite, lancez mosquitto_sub sur le RPi en souscrivant à l'un ou aux deux sujets que nous avons mis en place dans notre programme. Vous devriez voir un message à chaque fois que la boucle s'exécute. | Vous pouvez maintenant exécuter votre programme (assurez-vous que l'intermédiaire est en cours d'exécution AVANT de démarrer le programme). Ensuite, lancez mosquitto_sub sur le RPi en souscrivant à l'un ou aux deux sujets que nous avons mis en place dans notre programme. Vous devriez voir un message à chaque fois que la boucle s'exécute. |
| |
| |
J'ai mis notre nouveau programme sur Pastebin à https://pastebin.com/gqPLNsiw, juste au cas où vous ne voudriez pas faire toute la dactylographie. | J'ai mis notre nouveau programme sur Pastebin à https://pastebin.com/gqPLNsiw, juste au cas où vous ne voudriez pas faire toute la dactylographie. |
| |
Le mois prochain, notre projet sera un client abonné GUI pour surveiller nos capteurs. Ce client peut être sur le RPi ou sur un autre ordinateur de votre réseau. En fait, si vous utilisez un courtier public, vous pouvez le surveiller de n'importe où dans le monde. | Le mois prochain, notre projet sera un client abonné GUI pour surveiller nos capteurs. Ce client peut être sur le RPi ou sur un autre ordinateur de votre réseau. En fait, si vous utilisez un intermédiaire public, vous pouvez le surveiller de n'importe où dans le monde. |
| |
D'ici là, passez un bon mois. | D'ici là, passez un bon mois. |
| |