Controlla arduino tramite MQTT


8

Sto lavorando con diverse schede Arduino e ora ho bisogno di controllarle tramite un'interfaccia web.

Tramite l'interfaccia web voglio attivare GPIO.

Ho due idee:

  1. Ogni arduino funge da web server e posso controllare GPIO tramite la pagina web di Arduino. Fondamentalmente una scheda del browser per ogni arduino.
  2. Utilizzare il protocollo MQTT per scambiare messaggi con le schede arduino. Inoltre penso di usare un lampone come web server e come broker MQTT. Ogni scheda arduino è abbonata a un argomento specifico e attraverso una pagina web, ospitata sul lampone, posso controllare i GPIO di Arduino.

La prima soluzione è molto rapida e semplice.

Per quanto riguarda la seconda opzione, non so come inviare un messaggio MQTT tramite una pagina Web. Ho letto che devo usare Websocket. È giusto? Devo scrivere il codice in Javascript o cosa?

La mia seconda domanda è: il broker MQTT può gestire contemporaneamente sia MQTT che MQTT su Websocket? Altrimenti devo usare Websocket anche su Arduino.

Un'altra opzione è quella di creare uno script Python con GUI che consenta di inviare messaggi MQTT ad Arduino.

C'è un modo migliore?

Grazie per l'aiuto!

Risposte:


5

Quello che hai scritto tutto mi sembra ragionevole.

MQTT viene eseguito tradizionalmente su TCP 1 , ma il browser non consente alle pagine Web di aprire un socket TCP non elaborato. Ci sono proposte per permetterlo, ma dubito che saranno presto implementate. Pertanto, il tuo browser non può connettersi a un broker MQTT che supporta solo connessioni TCP.

La soluzione è, come hai identificato, utilizzare un WebSocket: questi sono supportati dal browser e quindi un codice JavaScript può essere utilizzato per connettersi a un broker MQTT attraverso una pagina Web. HiveMQ ha un esempio con cui puoi giocare , oppure puoi provare una libreria come MQTT.js che supporta la comunicazione WebSocket con un broker MQTT.

La maggior parte dei broker, e tutto ciò di cui sono a conoscenza, non si preoccuperà se un client è un client WebSocket o TCP. Puoi connettere felicemente entrambi a un broker e puoi trovare istruzioni su come configurare un broker Mosquitto su Stack Overflow 2 .

Per quanto riguarda il modo migliore ... dipende da te. Se sei soddisfatto di JavaScript, non ci sono problemi ad usarlo. Se Python è più semplice, fallo (non avresti bisogno di configurare il supporto WebSocket in quel modo). Potresti anche utilizzare un software client pre-costruito se non ti importa troppo dell'interfaccia utente.


1 MQTT 3.1.1 consente anche connessioni TLS o WebSocket; vedere la sezione 4.2 delle specifiche . Esiste una variante, MQTT-SN , in cui i requisiti per TCP sono ridotti. Ad ogni modo, probabilmente non sei preoccupato per MQTT-SN per il tuo caso d'uso.

2 Notare che su Windows, la build di Mosquitto non ha il supporto WebSocket abilitato . Dovrai costruire Mosquitto da solo se vuoi usarlo su Windows. In alternativa, puoi provare un altro broker che non ti limita in questo modo.


Grazie Aurora0001 per la tua risposta! La mia idea è quella di creare una pagina web con codice JS che invii messaggi MQTT al broker (Raspberrry Pi). La mia unica preoccupazione era la coesistenza della connessione TCP e Web Secket MQTT. Che cosa pensi di Mosquitto Broker? Posso installare Mosquitto Broker sul lampone ed eseguirlo come un servizio.
Federico,

1
Come ho detto, TCP e WebSocket possono felicemente coesistere. Se segui il percorso WebSocket, in realtà non importa quale sia il tuo server Web (anche un host di file statico funzionerebbe) in quanto è il JS sul lato client che conta. Se hai effettuato la connessione MQTT attraverso il Pi e poi hai voluto creare una pagina Web per controllarla (cioè non websocket), Python sarebbe probabilmente più facile da usare in quanto ha molti più framework Web rispetto a C.
Aurora0001

La mia idea è quella di utilizzare un lampone come broker MQTT. La pagina Web apre un websocket per pubblicare messaggi su un argomento specifico. Finalmente i messaggi inviati dal broker broker (nel mio caso un Raspberry)
Federico,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.