Kontrolliere Arduino über MQTT

8

Ich arbeite mit mehreren Arduino-Boards und muss sie jetzt über ein Webinterface steuern.

Über das Webinterface möchte ich GPIO aktivieren.

Ich habe zwei Ideen:

  1. Jedes Arduino fungiert als Webserver und ich kann den GPIO über die Arduino-Webseite steuern. Grundsätzlich eine Browser-Registerkarte für jedes Arduino.
  2. Verwenden Sie das MQTT-Protokoll, um Nachrichten mit den Arduino-Karten auszutauschen. Außerdem denke ich, eine Himbeere als Webserver und als MQTT-Broker zu verwenden. Jedes Arduino-Board hat ein bestimmtes Thema abonniert und über eine auf der Himbeere gehostete Webseite kann ich die Arduino-GPIOs steuern.

Die erste Lösung habe ich sehr schnell und einfach.

In Bezug auf die zweite Option weiß ich nicht, wie ich eine MQTT-Nachricht über eine Webseite senden soll. Ich habe gelesen, dass ich Websocket verwenden muss. Ist es richtig? Muss ich Code in Javascript schreiben oder was?

Meine zweite Frage lautet: Kann der MQTT-Broker gleichzeitig MQTT und MQTT über Websocket verwalten? Ansonsten muss ich den Websocket auch auf Arduino benutzen.

Eine weitere Option besteht darin, ein Python-Skript mit GUI zu erstellen, mit dem MQTT-Nachrichten an Arduino gesendet werden können.

Gibt es einen besten Weg?

Danke für die Hilfe!

Federico
quelle

Antworten:

5

Was Sie alles geschrieben haben, erscheint mir vernünftig.

MQTT wird traditionell über TCP 1 ausgeführt , aber Ihr Browser erlaubt Webseiten nicht, einen unformatierten TCP-Socket zu öffnen. Es gibt Vorschläge , die dies zulassen, aber ich bezweifle, dass sie bald umgesetzt werden. Ihr Browser kann also keine Verbindung zu einem MQTT-Broker herstellen, der nur TCP-Verbindungen unterstützt.

Wie Sie bereits festgestellt haben, besteht die Lösung darin, ein WebSocket zu verwenden. Diese werden vom Browser unterstützt, sodass JavaScript-Code verwendet werden kann, um über eine Webseite eine Verbindung zu einem MQTT-Broker herzustellen . HiveMQ hat ein Beispiel, mit dem Sie spielen können , oder Sie können eine Bibliothek wie MQTT.js ausprobieren, die die WebSocket-Kommunikation mit einem MQTT-Broker unterstützt.

Die meisten Broker - und alles, was mir bekannt ist - kümmern sich nicht darum, ob ein Client ein WebSocket- oder ein TCP-Client ist. Sie können beide problemlos mit einem Broker verbinden und Anweisungen zum Konfigurieren eines Mosquitto-Brokers in Stack Overflow 2 finden .

In Bezug auf den besten Weg ... liegt es an Ihnen. Wenn Sie mit JavaScript zufrieden sind, ist dies kein Problem. Wenn Python einfacher ist, tun Sie dies (Sie müssten die WebSockets-Unterstützung nicht auf diese Weise einrichten). Sie könnten sogar einfach vorgefertigte Client-Software verwenden, wenn Sie sich nicht zu sehr für die Benutzeroberfläche interessieren.


1 MQTT 3.1.1 ermöglicht auch TLS- oder WebSocket-Verbindungen. siehe Abschnitt 4.2 der Spezifikation . Es gibt eine Variante, MQTT-SN , bei der die Anforderungen an TCP gelockert werden. In beiden Fällen machen Sie sich wahrscheinlich keine Sorgen um MQTT-SN für Ihren Anwendungsfall.

2 Beachten Sie, dass unter Windows für den Mosquitto-Build keine WebSocket-Unterstützung aktiviert ist . Sie müssen Mosquitto selbst erstellen, wenn Sie es unter Windows verwenden möchten. Alternativ können Sie einen anderen Broker ausprobieren, der Sie auf diese Weise nicht einschränkt.

Aurora0001
quelle
Vielen Dank an Aurora0001 für Ihre Antwort! Meine Idee ist es, eine Webseite mit JS-Code zu erstellen, die MQTT-Nachrichten an den Broker (Raspberrry Pi) sendet. Mein einziges Anliegen war die Koexistenz von TCP und Web Secket MQTT-Verbindung. Was denkst du über Mosquitto Broker? Ich kann Mosquitto Broker auf der Himbeere installieren und wie ein Dienst ausführen.
Federico
1
Wie gesagt, TCP und WebSockets können glücklich nebeneinander existieren. Wenn Sie sich für WebSockets entscheiden, spielt es keine Rolle, was Ihr Webserver ist (selbst ein statischer Dateihost würde funktionieren), da es auf die clientseitige JS ankommt. Wenn Sie die MQTT-Verbindung über den Pi hergestellt haben und dann eine Webseite erstellen möchten, um dies zu steuern (dh keine Websockets), ist Python wahrscheinlich einfacher zu verwenden, da es viel mehr Web-Frameworks als C enthält.
Aurora0001
Meine Idee ist es, eine Himbeere als MQTT Broker zu verwenden. Die Webseite öffnet einen Websocket, um Nachrichten zu einem bestimmten Thema zu veröffentlichen. Schließlich die Nachrichten, wie sie vom Broker-Server (in meinem Fall eine Himbeere) weitergeleitet wurden
Federico