🛠 Publier en MQTT sur le réseau cellulaire
Objectifs
Publier des mesures vers un courtier MQTT via la connexion NB-IoT/LTE-M, en combinant la bibliothèque MKRNB (accès réseau) et PubSubClient (protocole MQTT). C'est le cas d'usage typique du capteur sur site isolé.
Matériel
- 1 carte MKR NB 1500 + antenne + SIM data (voir le tutoriel d'attachement)
- Un courtier MQTT joignable : pour tester
test.mosquitto.orgport 1883 (non chiffré, ne pas y envoyer de données sensibles) - Bibliothèque Arduino PubSubClient (Nick O'Leary) installée via le gestionnaire de libraries
Code complet
// Publication MQTT sur NB-IoT/LTE-M — MKR NB 1500
#include <MKRNB.h>
#include <PubSubClient.h>
#include "arduino_secrets.h"
const char PINNUMBER[] = SECRET_PINNUMBER;
const char APN[] = "orange";
const char BROKER[] = "test.mosquitto.org";
const int PORT = 1883;
const char TOPIC[] = "mkrnb1500/données";
NB nbAccess;
GPRS gprs;
NBClient netClient; // socket TCP via le modem
PubSubClient mqtt(netClient);
unsigned long dernierEnvoi = 0;
void setup {
Serial.begin(9600);
while (!Serial);
bool ok = false;
while (!ok) {
if ((nbAccess.begin(PINNUMBER) == NB_READY) &&
(gprs.attachGPRS(APN) == GPRS_READY)) ok = true;
else delay(2000);
}
mqtt.setServer(BROKER, PORT);
mqtt.setKeepAlive(120); // keepalive adapte a la latence cellulaire
while (!mqtt.connect("mkrnb-1")) delay(5000);
}
void loop {
mqtt.loop;
if (millis - dernierEnvoi > 60000) { // 1 message par minute
dernierEnvoi = millis;
int v = analogRead(A0);
char buf[48];
snprintf(buf, sizeof(buf), "{\"a0\":%d,\"rssi_ok\":1}", v);
mqtt.publish(TOPIC, buf);
Serial.println(buf);
}
}
Vérification attendue
Depuis un autre poste : mosquitto_sub -h test.mosquitto.org -t 'mkrnb1500/donnees' affiche un message JSON chaque minute. Sur la console série, le payload publié s'affiche également.
Erreurs fréquentes
mqtt.connectéchoue sans détail : cause fréquente, courtier injoignable depuis le réseau de l'opérateur (pare-feu, port bloqué sur un forfait IoT) ou keepalive trop court couplé au PSM du module.- Oublier
gprs.attachGPRS(APN): le client TCP ne peut rien ouvrir sans contexte paquets. - PubSubClient par défaut limité à 256 octets : appelez
mqtt.setBufferSizepour de gros messages. - Réseaux NB-IoT à forte latence : prévoyez des timeouts larges et des reconnexions propres (
mqtt.disconnectpuisconnect). - Le sujet est documenté comme récurrent sur le forum Arduino : problèmes MQTT/NB-IoT viennent du TCP/keepalive, pas de la carte.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
attente-lte-nbiot.inoArduinochoix-bande.inoArduinopublish-mqtt-minimal.inoArduinoeconomie-energie.inoArduinogeoloc-cellules.inoArduinotest-coverage.inoArduino