Control arduino a través de MQTT

8

Estoy trabajando con varias placas arduino y ahora necesito controlarlas a través de una interfaz web.

A través de la interfaz web, quiero activar GPIO.

Tengo dos ideas:

  1. Cada arduino actúa como servidor web y puedo controlar el GPIO a través de la página web de Arduino. Básicamente una pestaña del navegador para cada arduino.
  2. Use el protocolo MQTT para intercambiar mensajes con las placas arduino. Además, pienso usar una frambuesa como servidor web y como agente MQTT. Cada placa arduino está suscrita a un tema específico y, a través de una página web, alojada en la frambuesa, puedo controlar los GPIO Arduino.

La primera solución es muy rápida y simple.

Con respecto a la segunda opción, no sé cómo enviar un mensaje MQTT a través de una página web. Leí que necesito usar Websocket. ¿Es correcto? ¿Necesito escribir código en Javascript o qué?

Mi segunda pregunta es: ¿puede el corredor MQTT administrar MQTT y MQTT a través de Websocket al mismo tiempo? De lo contrario, necesito usar Websocket también en Arduino.

Otra opción es construir un script Python con GUI que permita enviar mensajes MQTT a Arduino.

¿Hay una mejor manera?

¡Gracias por la ayuda!

Federico
fuente

Respuestas:

5

Todo lo que has escrito me parece razonable.

MQTT se ejecuta tradicionalmente sobre TCP 1 , pero su navegador no permite que las páginas web abran un socket TCP sin procesar. Hay propuestas para permitir eso, pero dudo que se implementen pronto. Por lo tanto, su navegador no puede conectarse a un agente MQTT que solo admite conexiones TCP.

La solución es, como ha identificado, utilizar un WebSocket: estos son compatibles con el navegador y, por lo tanto, se puede usar un código JavaScript para conectarse a un agente MQTT a través de una página web. HiveMQ tiene un ejemplo con el que puede jugar , o puede probar una biblioteca como MQTT.js que admite la comunicación WebSocket con un agente MQTT.

La mayoría de los corredores, y todo lo que sé, no se preocupará por si un cliente es un cliente WebSocket o TCP. Puede conectarse felizmente a ambos a un intermediario, y puede encontrar instrucciones sobre cómo configurar un intermediario Mosquitto en Stack Overflow 2 .

Con respecto a la mejor manera ... depende de usted. Si está satisfecho con JavaScript, entonces no hay problema en usarlo. Si Python es más fácil, haga eso (no necesitaría configurar el soporte de WebSockets de esa manera). Incluso podría usar un software cliente precompilado si no le importara demasiado la interfaz de usuario.


1 MQTT 3.1.1 también permite conexiones TLS o WebSocket; ver sección 4.2 de la especificación . Hay una variante, MQTT-SN , donde el requisito de TCP se relaja. De cualquier manera, probablemente no esté preocupado por MQTT-SN para su caso de uso.

2 Tenga en cuenta que en Windows, la compilación Mosquitto no tiene habilitado el soporte WebSocket . Tendrá que construir Mosquitto usted mismo si desea usarlo en Windows. Alternativamente, puede probar un corredor diferente que no lo restrinja de esta manera.

Aurora0001
fuente
Gracias Aurora0001 por tu respuesta! Mi idea es construir una página web con código JS que envíe mensajes MQTT al agente (Raspberrry Pi). Mi única preocupación era la coexistencia de la conexión TCP y Web Secket MQTT. ¿Qué opinas sobre Broker Mosquitto? Puedo instalar Mosquitto Broker en la frambuesa y ejecutarlo como un servicio.
Federico
1
Como digo, TCP y WebSockets pueden coexistir felizmente. Si sigue la ruta de WebSockets, realmente no importa cuál sea su servidor web (incluso un host de archivos estáticos funcionaría) ya que lo que importa es el JS del lado del cliente. Si hiciste la conexión MQTT a través de Pi y luego quisiste hacer una página web para controlar eso (es decir, no sockets web), Python probablemente sería más fácil de usar ya que tiene muchos más marcos web que C.
Aurora0001
Mi idea es usar una frambuesa como MQTT Broker. La página web abre un websocket para publicar mensajes sobre un tema específico. Por último, los mensajes encaminada según se indica por el servidor intermediario (en mi caso una frambuesa)
Federico