Utiliser le broker CloudMQTT

On trouve plusieurs brokers ayant une offre d’entrée gratuite, puis payant pour avoir plus de connexions. Ce lien donne un aperçu de ces offres.
J’ai choisi d’utiliser CloudMQTT, qui propose un plan gratuit, puis des plans progressifs allant de 5$ 299$ par mois. Pour ma part, j’ai démarré avec le plan à 5$.

Création d’une instance

Il faut évidemment commencer par créer un compte chez CloudMQTT.
On peut ensuite créer une instance, ce qui correspond à un broker. Vous devrez ensuite indiquer :

  • Un nom pour le plan
  • Le type de plan, il est possible de commencer avec un plan bon marché, puis d’augmenter les capacités
  • Des tags (balises), qui facilitent la navigation et le contrôle d’accès
  • Une région (un serveur Amazon Web Services, vous n’avez pas besoin de disposer d’un compte chez Amazon)

Une fois le plan créé, vous recevrez les informations suivantes :

Le broker peut être testé facilement, avec différents outils.

Avec mosquitto_sub et mosquitto_pub

Ouvrez deux consoles, une pour la souscription, et une pour la publication, et utilisez les commandes suivantes, en remplaçant User et Password par les valeurs fournies pour l’instance.
Code de souscription, pour le topic sensors/testsensor

mosquitto_sub -h hairdresser.cloudmqtt.com -t sensors/testsensor -u User -P Password -p 15680

Code de publications, à faire dans une autre console, et pour afficher le message « Hello 🙂 » :

mosquitto_pub -h hairdresser.cloudmqtt.com -t sensors/testsensor -u User -P Password -p 15680 -m "Hello :-)"

Avec MQTTBox

Créer un client selon l’exemple :

Ajoutez un publicateur et un souscripteur, et voyez les messages arriver :

Avec Arduino

Cet exemple utilise la librairie « ArduinoMqttClient.h« , et assume que l’Arduino est connecté à internet, avec un client Wifi et un client MQTT (les exemples proviennent de platformio.org) :

WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);

Les valeurs utilisées sont :

const char broker[] = "hairdresser.cloudmqtt.com";
int        port     = 15680;
const char topicPub[]  = "sensors/arduino";
const char topicSub[]  = "sensors/#";

// To publish every 30 seconds
const long interval = 1000 * 30; 
unsigned long previousMillis = 0;

Dans la fonction setup, on initialise la connexion avec le broker, et on souscrit au topic qui nous intéresse :

  // Provide a username and password for authentication
  mqttClient.setUsernamePassword(CLOUDMQTT_USER, CLOUDMQTT_PASS);

  Serial.print("Attempting to connect to the MQTT broker: ");
  Serial.println(broker);

  if (!mqttClient.connect(broker, port)) {
    Serial.print("MQTT connection failed! Error code = ");
    Serial.println(mqttClient.connectError());
    while (1);
  }
  ..
  // set the message receive callback
  mqttClient.onMessage(onMqttMessage);

  Serial.print("Subscribing to topic: ");
  Serial.println(topic);
  Serial.println();

  // subscribe to a topic
  mqttClient.subscribe(topicSub);

Dans la fonction loop, on poste un topic :

if (currentMillis - previousMillis >= interval) {
  // save the last time a message was sent
  previousMillis = currentMillis;

  Serial.print("Sending message to topic: ");
  Serial.println(topic);
  Serial.print("Hello from Arduino :-)");
  Serial.println(count);

  // send message, the Print interface can be used to set the message contents
  mqttClient.beginMessage(topicPub);
  mqttClient.print("Hello from Arduino # ");
  mqttClient.print(count);
  mqttClient.endMessage();

  Serial.println();

  count++;
}

La fonction de callback devra être adaptée pour gérer correctement des informations reçues, mais dans notre cas, on affiche simplement le message reçu :

void onMqttMessage(int messageSize) {
  // we received a message, print out the topic and contents
  Serial.print("Received a message with topic '");
  Serial.print(mqttClient.messageTopic());
  Serial.print("', length ");
  Serial.print(messageSize);
  Serial.println(" bytes:");

  // use the Stream interface to print the contents
  while (mqttClient.available()) {
    Serial.print((char)mqttClient.read());
  }
  Serial.println();

  Serial.println();
}

Laisser un commentaire