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 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.

Configurazione menu

Apri il menu (+++), poi [w] Network [q] MQTT publisher:

=== MQTT publisher ===

[t] Toggle MQTT (Off)
[h] Host (-)
[o] Port (1883)
[U] Username ((anon))
[P] Password (-)
[r] Topic root ((auto: ms2/<MAC>))
[v] Pub PVT JSON (On, ogni 1s)
[n] Pub NMEA raw (Off)
[I] Status interval (60s)
[J] PVT interval (1s)
[G] Goodbye retained on stop (On)
[R] Riavvia connessione MQTT

Topic publicati:
  <root>/status   heartbeat 60s (sempre On)
  <root>/pvt      JSON posizione 1Hz
  <root>/nmea     raw NMEA stream
  <root>/event    boot/OTA/fix events

[x] Back

(I valori «60s» e «1Hz» mostrati nella descrizione dei topic sono i default; le frequenze effettive sono comunque configurabili dai tasti [I] Status interval e [J] PVT interval. Vedi tabella sopra per i range.)

Quando il ricevitore e” in Base (Survey-In, Fixed o Caster), il menu MQTT mostra un banner standby in cima e lo stato del toggle [t] indica «standby»:

=== MQTT publisher ===

*** MQTT in standby: device in modalita' Base (tmode=2).
*** Riprende automaticamente al ritorno in Rover.

[t] Toggle MQTT (On (standby - attivo solo in Rover))
[h] Host (broker.example.com)
[o] Port (1883)
...
[G] Goodbye retained on stop (On)
[R] Riavvia connessione MQTT
[x] Back

In Base, [t] modifica solo il flag NVS (non avvia il client) e [R] e” rifiutato con messaggio esplicativo. Tutti gli altri tasti di configurazione funzionano normalmente. Al ritorno in Rover, MQTT si riavvia automaticamente con la config aggiornata.

Comandi

Tasto Azione
[t] Toggle On/Off. Richiede host configurato.
[h] Host broker (IP o DNS, es. 192.168.1.10)
[o] Porta broker (default 1883; 8883 per TLS)
[U] Username (vuoto = connessione anonima)
[P] Password
[r] Topic root custom (default ms2/<MAC>)
[v] Pubblica PVT JSON On/Off
[n] Pubblica NMEA raw On/Off (alto traffico)
[I] Status interval 5–3600 s
[J] PVT interval 1–60 s
[G] Goodbye retained on stop (default On)
[R] Riavvia connessione dopo cambio host/porta

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_sub dallo 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.