Contrôle Arduino via MQTT

8

Je travaille avec plusieurs cartes Arduino et maintenant je dois les contrôler via une interface Web.

Via l'interface Web, je souhaite activer GPIO.

J'ai deux idées:

  1. Chaque arduino agit comme serveur web et je peux contrôler le GPIO via la page web Arduino. Fondamentalement, un onglet de navigateur pour chaque arduino.
  2. Utilisez le protocole MQTT pour échanger des messages avec les cartes Arduino. De plus je pense utiliser une framboise comme serveur web et comme courtier MQTT. Chaque carte Arduino est abonnée à un sujet spécifique et via une page Web, hébergée sur la framboise, je peux contrôler les GPIO Arduino.

La première solution que je très simple et très rapide.

Concernant la deuxième option, je ne sais pas comment envoyer de message MQTT via une page web. J'ai lu que je dois utiliser Websocket. Est ce juste? Dois-je écrire du code en Javascript ou quoi?

Ma deuxième question est: le courtier MQTT peut-il gérer à la fois MQTT et MQTT via Websocket? Sinon, je dois également utiliser le Websocket sur Arduino.

Une autre option est de construire un script Python avec une interface graphique qui permet d'envoyer des messages MQTT à Arduino.

Existe-t-il un meilleur moyen?

Merci pour l'aide!

Federico
la source

Réponses:

5

Tout ce que vous avez écrit me semble raisonnable.

MQTT fonctionne traditionnellement sur TCP 1 , mais votre navigateur n'autorise pas les pages Web à ouvrir un socket TCP brut. Il y a des propositions pour permettre cela, mais je doute qu'elles soient mises en œuvre de sitôt. Par conséquent, votre navigateur ne peut pas se connecter à un courtier MQTT prenant uniquement en charge les connexions TCP.

La solution consiste, comme vous l'avez identifié, à utiliser un WebSocket - ceux-ci sont pris en charge par le navigateur et donc un certain code JavaScript peut être utilisé pour se connecter à un courtier MQTT via une page Web. HiveMQ a un exemple avec lequel vous pouvez jouer , ou vous pouvez essayer une bibliothèque telle que MQTT.js qui prend en charge la communication WebSocket avec un courtier MQTT.

La plupart des courtiers - et tout ce que je sais - ne se soucient pas de savoir si un client est un client WebSocket ou TCP. Vous pouvez facilement connecter les deux à un courtier et trouver des instructions sur la façon de configurer un courtier Mosquitto sur Stack Overflow 2 .

En ce qui concerne la meilleure façon ... c'est à vous. Si vous êtes satisfait de JavaScript, cela ne pose aucun problème. Si Python est plus simple, faites-le (vous n'auriez pas besoin de configurer le support WebSockets de cette façon). Vous pouvez même simplement utiliser un logiciel client prédéfini si vous ne vous souciez pas trop de l'interface utilisateur.


1 MQTT 3.1.1 permet également les connexions TLS ou WebSocket; voir la section 4.2 de la spécification . Il existe une variante, MQTT-SN , où l'exigence de TCP est assouplie. De toute façon, vous n'êtes probablement pas inquiet à propos de MQTT-SN pour votre cas d'utilisation.

2 Notez que sous Windows, la version Mosquitto ne prend pas en charge WebSocket . Vous devrez construire Mosquitto vous-même si vous souhaitez l'utiliser sur Windows. Alternativement, vous pouvez essayer un autre courtier qui ne vous restreint pas de cette façon.

Aurora0001
la source
Merci Aurora0001 pour votre réponse! Mon idée est de créer une page Web avec du code JS qui envoie des messages MQTT au courtier (Raspberrry Pi). Ma seule préoccupation était la coexistence de la connexion TCP et Web Secket MQTT. Quel est votre avis sur Mosquitto Broker? Je peux installer Mosquitto Broker sur la framboise et l'exécuter comme un service.
Federico
1
Comme je l'ai dit, TCP et WebSockets peuvent coexister avec bonheur. Si vous descendez la route WebSockets, peu importe quel est votre serveur Web (même un hôte de fichiers statique fonctionnerait) car c'est le JS côté client qui compte. Si vous avez fait la connexion MQTT via le Pi et que vous vouliez ensuite créer une page Web pour contrôler cela (c'est-à-dire pas les Websockets), Python serait probablement plus facile à utiliser car il a beaucoup plus de frameworks Web que C.
Aurora0001
Mon idée est d'utiliser une framboise comme courtier MQTT. La page Web ouvre une prise Web pour publier des messages sur un sujet spécifique. Enfin les messages tels que routés par le serveur de courtage (dans mon cas un Raspberry)
Federico