wifi_bridge.py

Arduino MKR WiFi 1010 · Archivo : wifi_bridge.py · Lenguaje : Python · Uso : Relayer les mesures série de la carte vers un serveur

Cuando el WiFi embarcado falla, el puerto serie de la MKR WiFi 1010 es el plan B: este puente Python lee líneas clave:valor y las envía como JSON a cualquier colector. Un PC por USB basta para seguir recogiendo durante el diagnóstico de radio.

Hardware

Una Arduino MKR WiFi 1010 (microcontrolador SAMD21, módulo Wi-Fi WINC1500, sin Bluetooth, alimentación USB o LiPo en J6). PC con Python 3, pyserial y requests, cable USB a la placa que imprime líneas en Serial.

Cableado

Un cable micro-USB; el sketch de la placa solo imprime líneas con formato sensor:valor.

Funcionamiento

El bucle for sobre el puerto serie itera línea a línea; partition separa clave y valor, y requests.post envía un JSON mínimo. Los errores de conexión se registran sin parar la lectura.

Ejecución

Instala Arduino SAMD Boards y la librería WiFi101, selecciona la placa y carga. El Wi-Fi funciona solo en 2,4 GHz: comprueba que tu punto de acceso no sea solo de 5 GHz.

Variantes

Añade una cola local (archivo JSONL) para no perder nada durante caídas del servidor, o sustituye requests por paho-mqtt para MQTT.

wifi_bridge.py

#!/usr/bin/env python3
"""Relais serie -> HTTP pour une MKR WiFi 1010 en mode fallback.

Si le WiFi de la carte est capricieux, son port serie devient le
reseau de secours : chaque ligne "cle:valeur" est POSTee en JSON.
Usage : python wifi_bridge.py [port] [url]
"""
import json
import sys

import requests
import serial

PORT = sys.argv[1] if len(sys.argv) > 1 else "/dev/ttyACM0"
URL = sys.argv[2] if len(sys.argv) > 2 else "http://127.0.0.1:5000/mesures"


def main() -> int:
    with serial.Serial(PORT, 9600, timeout=1) as carte:
        print(f"Relais {PORT} -> {URL}")
        for ligne in carte:
            l = ligne.decode(errors="replace").strip()
            if ":" not in l:
                continue
            cle, _, valeur = l.partition(":")
            try:
                requests.post(URL, json={cle: valeur}, timeout=5)
            except requests.ConnectionError:
                print("serveur injoignable, ligne perdue:", l)
    return 0


if __name__ == "__main__":
    sys.exit(main())

← Volver a la ficha