MQTT publisher¶
Il ricevitore MS2-Pro può pubblicare la propria telemetria su un broker MQTT (Mosquitto, HiveMQ, EMQX, AWS IoT, ecc.). Ideale per:
- Dashboard remote (Grafana, Node-RED, Home Assistant)
- Logging centralizzato di flotte di ricevitori
- Integrazione con software di tracciamento posizione real-time
- Notifiche evento (alerts su batteria scarica, perdita fix RTK, ecc.)
Nota
MQTT è disponibile solo in modalità WIFI + solo in modalità Rover (tmode=0). In Base/Caster il publisher entra automaticamente in standby e riprende al ritorno in Rover.
Topic pubblicati¶
Il ricevitore pubblica su 4 topic, sotto un root configurabile (default ms2/<MAC last 6 hex>, es. ms2/EDCB20):
| Topic | Frequenza | QoS | Retained | Contenuto |
|---|---|---|---|---|
<root>/status |
5–3600 s | 1 | sì | uptime, heap, batt, fix, sats |
<root>/pvt |
1–60 s | 0 | no | lat/lon/alt/sats/fix/hacc |
<root>/nmea |
accumulo | 0 | no | NMEA raw stream |
<root>/event |
su trigger | 1 | no | boot, OTA, ecc. |
Le frequenze di status e pvt sono configurabili dal menu.
Stati possibili¶
Lo stato del toggle [t] mostra il funzionamento runtime:
- Off — disabilitato dall’utente
- On (in connessione…) — start in corso, attende CONNACK dal broker
- On (connesso) — operativo
- On (standby - attivo solo in Rover) — config completa ma device in Base, il publisher si attiva al ritorno in Rover
- On (ERRORE: broker irraggiungibile, premi [R]) — dopo 6 errori consecutivi il publisher si è fermato per non spammare retry. Correggi config e premi
[R].
Esempi payload¶
Status JSON (heartbeat):
{
"ts": 1745234567,
"alive": true,
"fw": "3.0.0",
"uptime_s": 3600,
"heap_free": 140000,
"heap_min": 135000,
"batt_pct": 92,
"batt_mv": 4130,
"sats": 30,
"fix": 4,
"hacc": 0.012
}
PVT JSON (posizione):
{"ts":1745234567,"lat":45.962419,"lon":13.253370,"alt":52.12,"sats":30,"fix":4,"hacc":0.012}
Last-will + Goodbye retained¶
Il ricevitore configura un last-will testament al connect: {"alive":false} retained su <root>/status. Il broker lo pubblica automaticamente se il client cade abruptly (TCP timeout, crash).
Inoltre, su disconnect graceful (toggle Off, cambio modalità, OTA, spegnimento) il firmware pubblica esplicitamente {"alive":false} retained prima di disconnettersi. Così i subscriber che si collegano dopo lo stop vedono il device come offline invece dell’ultimo stato vivo stantio.
Questa funzione si attiva/disattiva con il flag [G] Goodbye retained on stop (default On).
Esempi subscribe¶
Subscribe a tutti i topic di un singolo ricevitore:
mosquitto_sub -h <broker> -p 1883 -t 'ms2/EDCB20/#' -v
Subscribe alla posizione di tutti i ricevitori in flotta:
mosquitto_sub -h <broker> -p 1883 -t 'ms2/+/pvt' -v
Subscribe solo allo status (heartbeat):
mosquitto_sub -h <broker> -p 1883 -t 'ms2/+/status' -v
Cancellare un retained «morto»¶
Se un ricevitore ha pubblicato un retained {"alive":false} e vuoi rimuoverlo dal broker:
mosquitto_pub -h <broker> -p 1883 -t 'ms2/EDCB20/status' -m '' -r
Payload vuoto + flag -r (retained) cancella la copia retained sul broker.
TLS / Sicurezza¶
Per pubblicare via TLS (consigliato su internet pubblico):
- Configura porta 8883 dal menu
[o] - Il ricevitore costruisce URI
mqtts://...e usa il Mozilla CA bundle integrato per validare il certificato del broker. - Compatibile con cert Let’s Encrypt (es. tramite Nginx reverse proxy o broker Mosquitto con TLS attivo).
Modalità standby (in Base)¶
Quando il ricevitore passa da Rover a Base/Caster, MQTT entra in standby:
- Il publisher pubblica goodbye retained e si disconnette.
- La config (host, port, intervalli, ecc.) rimane invariata in NVS.
- Il menu mostra:
MQTT in standby: device in modalita' Base. Riprende automaticamente al ritorno in Rover. - Al ritorno in Rover il publisher si riavvia da solo senza azione utente.
Razionale: in Base la posizione è costante (lat/lon fissi) → PVT JSON sarebbe ridondante. Inoltre il device è impegnato nell’upload RTCM verso il caster.
Coesistenza con NTRIP¶
MQTT e NTRIP Client/Server coesistono senza problemi in modalità WIFI:
- Il ricevitore può ricevere corrections via NTRIP e pubblicare la propria posizione via MQTT simultaneamente.
- Banda WiFi e heap sono sufficienti.
- La pipeline è: GNSS UART → NMEA parser → MQTT PVT publisher + NTRIP Client per RTCM in.
Troubleshooting¶
- Connection refused / esp_tls=32772
- Broker irraggiungibile (firewall, IP errato, broker non in ascolto). Verifica con
mosquitto_subdallo stesso PC del ricevitore. - code=5 / Connection refused: bad credentials
- Username/password errati. Verifica i campi
[U]e[P]. - Connetto al broker giusto?
- Se hai più broker, attenzione al port mapping Docker (es. broker su porta 1884 esterna → 1883 interna). Configura
[o]con la porta esterna del broker. - Niente messaggi anche se «On (connesso)»
- Controlla che
[v]PVT o[n]NMEA siano effettivamente On. Status arriva sempre (ogni[I]secondi). - Status mostra ``sats`` o ``fix`` diversi dal menu live
- Status è retained sul broker, congela il valore al momento dell’ultima pubblicazione. Il menu live legge dal parser NMEA in tempo reale. Aspetta il prossimo intervallo
[I]per vedere il valore aggiornato sul broker. - Setup completo di Mosquitto su server
- Per la procedura di installazione del broker MQTT contattaci all’indirizzo
solutop@gmail.com.