nb_monitor.py

Arduino MKR NB 1500 · Archivo : nb_monitor.py · Lenguaje : Python · Uso : Suivre sur PC les cycles radio d'une station NB-IoT

Durante una campaña de pruebas NB-IoT, vigila la estación: este script pyserial lee el puerto serie del MKR NB 1500, cuenta los ciclos publicados y muestra cada línea con palabra clave de error. Un monitor ligero para largas jornadas.

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). PC con Python 3 y pyserial, cable USB a la placa, placa alimentada y unida a la red.

Cableado

Basta un cable micro-USB; el puerto ACM nativo del SAMD21 expone el Serial del sketch.

Funcionamiento

readline() consume el flujo sin bloquear (timeout 1 s); la lista MOTS_CLE_ERREUR centraliza la detección y un balance se imprime cada diez eventos.

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

Envía los contadores a un panel (InfluxGrafana), añade un aviso por correo tras tres fallos seguidos o registra en SQLite para el histórico.

nb_monitor.py

#!/usr/bin/env python3
"""Surveille les logs serie d'un MKR NB 1500 et alerte sur les echecs.

Usage : python nb_monitor.py [port]
"""
import sys
import time

import serial

MOTS_CLE_ERREUR = ("KO", "ECHEC", "perdu", "restart")


def surveiller(port: str) -> None:
    with serial.Serial(port, 9600, timeout=1) as carte:
        ok = ko = 0
        debut = time.time()
        print(f"Surveillance de {port} (Ctrl+C pour finir)")
        while True:
            ligne = carte.readline().decode(errors="replace").strip()
            if not ligne:
                continue
            if any(m in ligne for m in MOTS_CLE_ERREUR):
                ko += 1
                print(f"[{time.time() - debut:6.0f}s] ERREUR: {ligne}")
            elif "publie" in ligne or "OK" in ligne:
                ok += 1
            if (ok + ko) % 10 == 0:
                print(f"bilan: {ok} OK / {ko} KO")


if __name__ == "__main__":
    try:
        surveiller(sys.argv[1] if len(sys.argv) > 1 else "/dev/ttyACM0")
    except KeyboardInterrupt:
        print("\nArrete.")

← Volver a la ficha