MQTT – utilisation avec Arduino

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]