reconnexion-rapide.ino
En movilidad o en un sótano, la célula desaparece y vuelve: en vez de un reinicio completo de 30 segundos, este sketch vuelve a sondear la unión de radio cada dos segundos y solo reinicia el módem del MKR NB 1500 como último recurso. La sesión IP se retoma antes.
Hardware
Una Arduino MKR NB 1500 (microcontrolador SAMD21, módem u-blox LTE-M/NB-IoT, antena externa, alimentación LiPo en J6 o USB). SIM IoT, antena colocada, servidor destino accesible.
Cableado
Sin cableado; comportamiento autónomo tras el flasheo, apto para cajas selladas.
Funcionamiento
getStatus() sondea la pila de red sin tocar la sesión PDP; attachGPRS solo se repite al volver la cobertura. El reinicio completo pasa a ser la excepción, ahorrando batería y señalización.
Ejecución
Instala el paquete Arduino SAMD Boards y la librería MKRNB, selecciona la placa y carga. Prevé una SIM IoT (LTE-M o NB1) activada y buena recepción: la conexión a la red puede tardar varios minutos.
Variantes
Añade un watchdog de hardware (pin RESET del módem pilotado por un GPIO) si tu ubicación sufre bloqueos de 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();
}
}
}