reconnexion-rapide.ino

Arduino MKR NB 1500 · Fichier : reconnexion-rapide.ino · Langage : Arduino · Usage : Se réattacher au réseau sans pleine réinitialisation

En mobilité ou en sous-sol, la cellule disparaît puis revient : plutôt qu'un redémarrage complet de 30 secondes, ce croquis reteste l'attachement radio toutes les deux secondes et ne réinitialise le modem du MKR NB 1500 qu'en dernier recours. La session IP est reprise plus vite.

Matériel requis

Une Arduino MKR NB 1500 (microcontrôleur SAMD21, modem u-blox LTE-M/NB-IoT, antenne externe, alimentation LiPo sur J6 ou USB). SIM IoT, antenne en place, serveur destinataire joignable.

Câblage

Aucun câblage ; comportement autonome après flash, adapté aux boîtiers scellés.

Fonctionnement

getStatus() sonde la pile réseau sans toucher à la session PDP ; attachGPRS n'est rejoué qu'après retour de la couverture. Le restart complet devient l'exception, préservant batterie et forfait de signalisation.

Exécution

Installez le package Arduino SAMD Boards et la bibliothèque MKRNB, sélectionnez la carte, téléversez. Prévoyez une carte SIM IoT (LTE-M ou NB1) activée et une bonne réception : l'attachement au réseau peut demander plusieurs minutes.

Variantes

Ajoutez un watchdog matériel (broche RESET du modem commandée par un GPIO) si votre emplacement est sujet aux blocages firmware.

reconnexion-rapide.ino

// Reconnexion rapide : garder la session IP et reattacher vite.
// Le SARA-R4 supporte "attache rapide" si la session est conservee.
#include <MKRNB.h>

const char PIN_SIM[] = "0000";
const char APN[] = "iot.1nce.net";

NB nb;
NBClient client;

bool reseauHorsLigne() {
  return nb.getStatus() != NETWORK_JOINED;
}

void setup() {
  Serial.begin(9600);
  if (nb.begin(PIN_SIM) != NB_READY) while (true);
  while (reseauHorsLigne()) delay(2000);
  nb.attachGPRS(APN);
}

void loop() {
  if (reseauHorsLigne()) {
    Serial.println(F("Reseau perdu, reattachement..."));
    int essai = 0;
    while (reseauHorsLigne() && essai++ < 30) delay(2000);
    if (reseauHorsLigne()) {
      nb.restart(); // dernier recours (~30 s)
      while (reseauHorsLigne()) delay(2000);
    }
    nb.attachGPRS(APN);
  }
  // Publication toutes les 10 min
  static unsigned long dernierEnvoi = 0;
  if (millis() - dernierEnvoi >= 600000) {
    dernierEnvoi = millis();
    if (client.connect("192.0.2.10", 1883)) {
      client.print("nb1500/ok\n"); client.stop();
    }
  }
}

← Retour à la fiche