🛠 Publier en MQTT sur le réseau GPRS

Arduino MKR GSM 1400 · avance · Schéma : IMG-mkr-gsm-1400-avance-1-mkrgsm-mqtt-gprs.svg — MKR GSM 1400 publiant des messages MQTT via l'antenne vers un broker sur Internet, le flux traversant l'antenne relais et un serveur, avec jauges de capteur publiées.

Objetivos

Conectar la MKR GSM 1400 a un broker MQTT apilando PubSubClient sobre GSMClient: la clase cliente de MKRGSM imita la clase Client de Arduino, por lo que PubSubClient funciona sin modificaciones. Patrón típico de un sensor de campo (riego Irriduo, vigilancia del agua): lectura periódica, publicación con QoS 1, reconexión robusta tras cortes de radio.

Material

Código completo

#include <MKRGSM.h>
#include <PubSubClient.h>
#include "arduino_secrets.h"
const char PINNUMBER[]     = SECRET_PINNUMBER;
const char GPRS_APN[]      = SECRET_GPRS_APN;
const char GPRS_LOGIN[]    = SECRET_GPRS_LOGIN;
const char GPRS_PASSWORD[] = SECRET_GPRS_PASSWORD;
const char MQTT_BROKER[]   = "broker.example.org";

GSMClient  netClient;
GPRS       gprs;
GSM        gsmAccess;
PubSubClient mqtt(netClient);

uint32_t dernierePub = 0;

void connexion {
  while (gsmAccess.begin(PINNUMBER) != GSM_READY) delay(2000);
  while (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) != GPRS_READY)
    delay(2000);
  mqtt.setServer(MQTT_BROKER, 1883);
  mqtt.setBufferSize(256);
  while (!mqtt.connect("mkr1400-capteur")) {
    Serial.print("MQTT rc="); Serial.println(mqtt.state);
    delay(5000);
  }
  Serial.println("MQTT connecte");
}

void setup {
  Serial.begin(9600);
  while (!Serial) {}
  connexion;
}

void loop {
  if (!mqtt.connected || !gprs) {   // coupure radio ou broker
    Serial.println("Reconnexion...");
    gsmAccess.shutdown;
    connexion;
  }
  mqtt.loop;                        // indispensable : trafic + keepalive
  if (millis - dernierePub > 60000UL) {
    dernierePub = millis;
    int v = analogRead(A1);           // exemple : capteur analogique
    char trame[48];
    snprintf(trame, sizeof trame, "{\"a1\":%d}", v);
    mqtt.publish("maison/mkr1400/a1", trame, true);  // retain
  }
  delay(100);
}

Verificación esperada

mosquitto_sub -t 'maison/mkr1400/a1' (o el cliente de su broker) recibe una trama JSON cada minuto, incluso después de mover la placa a una zona sin red: el bucle de reconexión se reanuda solo. mqtt.loop debe llamarse con frecuencia; su ausencia provoca desconexiones por keepalive y mensajes entrantes no procesados.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales