Pour arduino il existe une bibliothèque qui permet de créer un client permettant de publier et de souscrire à un topic.
Le code suivant permet de souscrire auprès d’un broker public gratuit : broker.hivemq.com
/* Basic MQTT example This sketch demonstrates the basic capabilities of the library. It connects to an MQTT server then: - publishes "Arduino Connected" to the topic "eiffel/texte" - subscribes to the topic "eiffel/texte", printing out any messages it receives. NB - it assumes the received payloads are strings not binary It will reconnect to the server if the connection is lost using a blocking reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to achieve the same result without blocking the main loop. */ #include #include #include byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; char server[] = "broker.hivemq.com"; void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); } EthernetClient ethClient; PubSubClient client(ethClient); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect // rename "arduinoClient" with an unique Id // like "arduinoClient1524ztSDeRT" if (client.connect("arduinoClient")) { Serial.println("connected"); // Once connected, publish an announcement... client.publish("eiffel/texte", "Arduino connected"); // ... and resubscribe client.subscribe("eiffel/texte"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { Serial.begin(115200); client.setServer(server, 1883); client.setCallback(callback); Ethernet.begin(mac); // get IP via DHCP // Allow the hardware to sort itself out delay(1500); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }
Pour tester le programme, il faut que la carte réseau de l’Arduino soit connectée à un réseau ayant accès à internet (adresse IP et passerelle renseignée) le programme utilise un paramétrage automatique DHCP.
Hivemq met à disposition une interface de test : http://www.hivemq.com/demos/websocket-client/
Le paramétrage est simple :
Cliquer sur le bouton Connect (laisser les paramètres par défaut)
Une fois connecté, déplier le bandeau Subscriptions et cliquer sur Add New Topic Subscription
Saisir alors le Topic du programme Arduino : eiffel/texte
Provoquer un reset de la carte Arduino, lancer le moniteur Série et observer la page hiveMQ, le message “Arduino connected” apparait, ce qui signifie que Arduino a publié ce message sur le topic eiffel/texte et que cela fonctionne !
Taper un message dans la fenêtre Publish du site HiveMQ et cliquer sur Publish, On voit normalement arriver le message dans la console du moniteur Arduino.
Si la carte Arduino tente de se reconnecter en permanence, c’est que l’Identifiant de connexion est déjà utilisé par un autre appareil. il faut modifier la ligne 37
[cpp ]
if (client.connect(“arduinoClient”)) {
[/cpp]
et remplacer “arduinoClient” par un identifiant unique
[cpp”]
if (client.connect(“mon_identifiant_perso_1872AZT123p”)) {
[/cpp]