Controlar o arduino via MQTT

8

Estou trabalhando com várias placas arduino e agora preciso controlá-las através de uma interface web.

Via interface web, quero ativar o GPIO.

Eu tenho duas idéias:

  1. Cada arduino atua como servidor da web e eu posso controlar o GPIO através da página da web do Arduino. Basicamente, uma guia do navegador para cada arduino.
  2. Use o protocolo MQTT para trocar mensagens com as placas do arduino. Além disso, penso em usar uma framboesa como servidor web e como corretor MQTT. Cada placa do arduino está inscrita em um tópico específico e, por meio de uma página da Web, hospedada no raspberry, eu posso controlar os GPIOs do Arduino.

A primeira solução é muito rápida e simples.

Em relação à segunda opção, não sei como enviar mensagem MQTT por meio de uma página da web. Eu li que preciso usar o Websocket. Está certo? Preciso escrever código em Javascript ou o quê?

Minha segunda pergunta é: O broker do MQTT pode gerenciar o MQTT e o MQTT pelo Websocket ao mesmo tempo? Caso contrário, eu preciso usar o Websocket também no Arduino.

Outra opção é criar um script Python com GUI que permita enviar mensagens MQTT para o Arduino.

Existe uma maneira melhor?

Obrigado pela ajuda!

Federico
fonte

Respostas:

5

O que você escreveu tudo parece razoável para mim.

Tradicionalmente, o MQTT é executado sobre o TCP 1 , mas seu navegador não permite que páginas da Web abram um soquete TCP bruto. Existem propostas para permitir isso, mas duvido que sejam implementadas em breve. Portanto, seu navegador não pode se conectar a um broker MQTT suportando apenas conexões TCP.

A solução é, como você identificou, usar um WebSocket - estes são suportados pelo navegador e, portanto, algum código JavaScript pode ser usado para conectar-se a um broker MQTT por meio de uma página da web. O HiveMQ tem um exemplo com o qual você pode brincar ou pode tentar uma biblioteca como o MQTT.js que suporta a comunicação do WebSocket com um broker do MQTT.

A maioria dos corretores - e tudo o que tenho conhecimento - não se importará se um cliente é um cliente WebSocket ou TCP. Você pode conectar-se com facilidade a um broker e pode encontrar instruções sobre como configurar um broker Mosquitto no Stack Overflow 2 .

No que diz respeito à melhor maneira ... depende de você. Se você está satisfeito com o JavaScript, não há problema em usá-lo. Se o Python for mais fácil, faça isso (você não precisaria configurar o suporte ao WebSockets dessa maneira). Você pode até usar software cliente pré-criado se não se importar muito com a interface do usuário.


1 O MQTT 3.1.1 também permite conexões TLS ou WebSocket; consulte a seção 4.2 da especificação . Há uma variante, MQTT-SN , em que o requisito para TCP é relaxado. De qualquer forma, você provavelmente não está preocupado com o MQTT-SN para o seu caso de uso.

2 Observe que no Windows, a versão Mosquitto não possui o suporte WebSocket ativado . Você precisará criar o Mosquitto se quiser usá-lo no Windows. Como alternativa, você pode tentar um corretor diferente que não o restrinja dessa maneira.

Aurora0001
fonte
Obrigado Aurora0001 pela sua resposta! Minha ideia é criar uma página da web com código JS que envie mensagens MQTT para o broker (Raspberrry Pi). Minha única preocupação era a coexistência da conexão TCP e Web Secket MQTT. O que você acha do Mosquitto Broker? Eu posso instalar o Mosquitto Broker na framboesa e executá-lo como um serviço.
Federico
1
Como eu disse, TCP e WebSockets podem coexistir alegremente. Se você seguir a rota do WebSockets, realmente não importa qual é o seu servidor da Web (até mesmo um host de arquivo estático funcionaria), pois é o JS do lado do cliente que importa. Se você fez a conexão MQTT através do Pi e depois quis criar uma página da Web para controlar isso (por exemplo, não os WebSockets), o Python provavelmente seria mais fácil de usar, pois possui muito mais estruturas da Web do que C.
Aurora0001
Minha idéia é usar uma framboesa como MQTT Broker. A página da web abre um soquete da web para publicar mensagens sobre um tópico específico. Finalmente as mensagens como roteadas pelo servidor broker (no meu caso uma framboesa)
Federico