🛠 Publier en MQTT sur le réseau cellulaire
Objetivos
Publicar medidas hacia un broker MQTT a través de la conexión NB-IoT/LTE-M, combinando la biblioteca MKRNB (acceso a la red) y PubSubClient (protocolo MQTT). Este es el caso de uso típico de un sensor en una ubicación aislada.
Material
- 1 placa MKR NB 1500 + antena + SIM de datos (consulte el tutorial de conexión)
- Un broker MQTT accesible: para probar,
test.mosquitto.orgpuerto 1883 (sin cifrado, no envíe datos sensibles) - Biblioteca Arduino PubSubClient (Nick O'Leary) instalada mediante el gestor de bibliotecas
Código completo
// 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/donnees";
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);
}
}
Verificación esperada
Desde otro equipo: mosquitto_sub -h test.mosquitto.org -t 'mkrnb1500/donnees' muestra un mensaje JSON cada minuto. En la consola serie, también se muestra la carga útil publicada.
Errores frecuentes
mqtt.connectfalla sin detalles: causa frecuente, broker inaccesible desde la red del operador (cortafuegos, puerto bloqueado en una tarifa IoT) o keepalive demasiado corto combinado con el PSM del módulo.- Olvidar
gprs.attachGPRS(APN): el cliente TCP no puede abrir nada sin contexto de paquetes. - PubSubClient está limitado por defecto a 256 bytes: llame a
mqtt.setBufferSizepara mensajes grandes. - Redes NB-IoT con alta latencia: prevea tiempos de espera amplios y reconexiones limpias (
mqtt.disconnectseguido deconnect). - El tema está documentado como recurrente en el foro de Arduino: los problemas de MQTT/NB-IoT provienen de TCP/keepalive, no de la placa.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
attente-lte-nbiot.inoArduinochoix-bande.inoArduinopublish-mqtt-minimal.inoArduinoeconomie-energie.inoArduinogeoloc-cellules.inoArduinotest-coverage.inoArduino