Petit pense bête pour me faciliter la communication entre mqtt, web, websocket…
J’ai découvert un petit serveur deamon websocketd qui permet une communication très facile avec n’importe quel programme python, bash…
Je veux l’utiliser pour rediriger quelques messages mqtt vers websocket.
J’ai donc un programme python qui s’abonne aux messages qui m’intéressent, et qui les envoit en json vers les navigateurs connectés par un simple « print »
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/usr/bin/env python # -*- coding: utf-8 -*-#!/usr/bin/env python # -*- coding: utf-8 -*- # fichier /data/www/websocket/redirectmqtt.py from sys import stdin, stdout import json # lib mqtt pour python : https://mosquitto.org/documentation/python/ # sudo pip install paho-mqtt import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): client.subscribe("temperature/#") def on_message(client, userdata, msg): print(json.dumps({msg.topic:str(msg.payload)})) stdout.flush() # client mqtt client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("localhost", 1883, 60) client.loop_forever() |
Ne pas oublier de le rendre exécutable avec un petit
1 |
chmod +x /data/www/websocket/redirectmqtt.py |
On lance ensuite le deamon websocket (sur le port 8087 chez moi) par :
1 |
websocketd --port=8087 --dir=/data/www/websocket |
Puis on peut afficher le résultat sur une page html très simplement :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Températures</title> </head> <body> <h1>Températures</h1> <script> var ws = new WebSocket('ws://localhost:8087/redirectmqtt.py'); ws.onmessage = function(event) { var ret = JSON.parse(event.data) if("temperature/chambre" in ret) document.getElementById("t_ch").textContent = ret["temperature/chambre"]; else if("temperature/ext" in ret) document.getElementById("t_ext").textContent = ret["temperature/ext"]; }; </script> <p>dans la chambre : <span id="t_ch"></span></p> <p>à l'extérieur : <span id="t_ext"></span></p> </body> </html> |