V
Visla Hardware
Portal R&D
πŸ›°οΈ R&D Visla β€” banco tracker LTE-M

Vehicle Tracking β€” XIAO + DAN-F10N + SIM7080G

Tracker LTE-M: Nordic nRF52840 (XIAO) + GPS u-blox DAN-F10N dual-band L1+L5 + modem SimCom SIM7080G Cat-M always-on. Variante del banco A7670E Cat-1 (vedi): cambia il modem e l'intero layer MQTT.
βœ… MQTTS end-to-end β†’ backend βœ… SIM7080 registrato Cat-M 1NCE πŸ›°οΈ DAN-F10N fix Orvieto 12 sat πŸ”§ TinyGSM + PubSubClient πŸš— always-on (non Tag PSM)

Stesso concept del banco A7670E (GPS DAN-F10N, batch store-and-forward, MQTTS β†’ mqtt.vislagps.com), ma con modem SIM7080G LTE-M. Il porting ha richiesto di ripensare due layer: il MQTT (i comandi nativi SM* del SIM7080 non funzionano β†’ TinyGSM+PubSubClient) e la lettura GPS (config UBX inaffidabile sul F10 β†’ parsing NMEA di default). Verificato end-to-end il 13 lug 2026: device 860016049515153 β†’ fix Orvieto β†’ backend.

πŸ”§

MQTT: TinyGSM, non SM*

Il comando nativo AT+SMCONN dΓ  sempre +CME ERROR: operation not allowed (fw 1951B16), anche con tutto OK. Soluzione: TinyGsmClientSecure + PubSubClient (socket TLS del modem).

πŸ›°οΈ

GPS: NMEA, non UBX

Il F10 NAK-a diverse chiavi UBX-CFG β†’ config inaffidabile. Molto piΓΉ robusto parsare l'NMEA di default ($GNGGA+$GNRMC): serve solo D0←GPS TX, zero config, niente D10.

πŸ”‹

GPS dal 5V, non 3V3

Il DAN dual-band tira ~30-40mA β†’ il 3V3 della XIAO va in brownout (GPS muto). Alimentarlo dal 5V (VBUS/powerbank) all'ingresso 5V del breakout (regolatore onboard).

πŸ”Œ Pin map

SegnalePin XIAONote
GPS DAN-F10N TXD0RX UARTE1 Β· GPS @38400 Β· NMEA β€” l'unico filo indispensabile
GPS DAN-F10N RXD10TX UARTE1 Β· non necessario (nessuna config UBX)
GPS VCC5V (VBUS)ingresso 5V del breakout (reg. onboard β†’ 3.3V). NON dal 3V3 XIAO (brownout)
Modem SIM7080 TXD7RX Serial1 (UARTE0) Β· modem @115200
Modem SIM7080 RXD6TX Serial1
Modem VBATalim. dedicata3.4–4.2V Β· picchi TX ~2A Β· GND comune
OLED SSD1306D5=SCL D4=SDA⚠️ SW I2C (bit-bang) β€” non HW, sennΓ² collide con UARTE1/GPS
BottoneD1toggle OLED Β· INPUT_PULLUP
BuzzerA3passivo

⚠️ GND unico per tutto (XIAO + modem + GPS). Alimentazione portatile pulita: powerbank USB nella porta USB β†’ 5V solidi (una LiPo nuda su ingresso "5V" va in undervoltage).

πŸ”€ Cosa cambia rispetto al banco A7670E

LayerA7670E (Cat-1)SIM7080G (questo)
ReteLTE Cat-1 (auto)Cat-M Β· CMNB=1 CNMP=38
MQTTAT raw nativo CMQTT*TinyGSM + PubSubClient (socket TLS)
CA certCCERTDOWNgestita da TinyGSM (no upload)
GPSUBX NAV-PVT (config via D10)NMEA default (solo D0)
Alim. GPS3V3 XIAO (~10mA single-band)5V VBUS (dual-band ~30-40mA)

⌨️ Firmware

Arduino β€” core Seeed nRF52 (Seeeduino:nrf52:xiaonRF52840). Dipendenze: TinyGSM, PubSubClient, U8g2, Adafruit TinyUSB. Upload UF2 (doppio-click RESET). ⚠️ il core chiama python (non python3) β†’ serve uno shim.

πŸ›°οΈ mqtt-tracker-sim7080 v0

GitHub β†’

Tracker MQTTS via TinyGSM+PubSubClient: TinyGsmClientSecure apre il socket TLS del modem, PubSubClient fa MQTT su mqtt.vislagps.com:8883. Username = IMEI, LWT offline retained, keepalive 60s. Batch store-and-forward: campiona il GPS ogni 1s in un ring buffer (600 punti) e pubblica visla/<IMEI>/pos in batch (fino a 12 pt) ogni 5s β†’ {imei,battery,volt,rssi,batch:[{t,lat,lon,spd,sats,hdop,hacc}…]}. Nei buchi di copertura accumula e svuota il backlog coi timestamp reali. GPS letto in NMEA ($GNGGA+$GNRMC) β€” nessuna config UBX. Verificato end-to-end (13 lug 2026): fix Orvieto 12 sat β†’ broker TLS β†’ mqtt-bridge (batch 4-5 pt/5s).

Modem SIM7080 verificato: CEREG: 0,5 (registrato roaming Cat-M 1NCE), PDP attivo (IP 100.107.94.8). L'IMEI 860016049515153 Γ¨ registrato nel broker mosquitto (registrazione device).

πŸ”¬ Findings banco β€” bring-up end-to-end (13 lug 2026)

Sessione lunga: dal firmware clonato dall'A7670 fino alle posizioni nel backend. Ogni anello ha rivelato una lezione.

πŸ”§ SMCONN nativo = vicolo cieco β€” porting iniziale con i comandi MQTT nativi del SIM7080 (SMCONF/SMSSL/SMCONN/SMPUB): SMCONN torna sempre +CME ERROR: operation not allowed, anche con registrazione, PDP/IP, CA convertita (CFS + CSSLCFG "convert"), clock sincronizzato via NTP e tutte le SMCONF OK. Escluse tutte le piste (porta quotata, LWT, clock, auth). È un limite della fw 1951B16SIM7080. Fix: pivot su TinyGsmClientSecure + PubSubClient (come il collaudato 7070) β†’ TLS handshake OK al primo colpo.
πŸ”‘ state=5 = auth broker, non firmware β€” con TinyGSM il TLS arriva al broker ma PubSubClient dΓ  state=5 (CONNACK "not authorized"): l'IMEI del SIM7080 non era nel password file di mosquitto. Fix backend: mosquitto_passwd nel container β†’ update ConfigMap β†’ attesa sync mount (~30s) β†’ kill -HUP 1. L'ACL visla/%u/* Γ¨ giΓ  generica. Broker: New client connected βœ….
πŸ›°οΈ GPS "lampeggia ma 0 sat" = leggevo UBX, lui mandava NMEA β€” il debug gpsRx=... ubx=0 nmea=470 l'ha svelato: il modulo streamma NMEA pieno (aggancia davvero, LED PPS lampeggia), ma il firmware parsava solo UBX NAV-PVT β€” che non arrivava perchΓ© la config UBX (via D10β†’GPS RX) veniva NAK-ata dal F10. Fix: convertito il parser a NMEA (GGA+RMC) β†’ sats=12 fix=YES immediato, niente D10.
πŸ”‹ GPS muto/intermittente = alimentazione β€” il DAN dual-band sul 3V3 della XIAO va in brownout (0 byte, oscillazioni). Sulla Waveshare (alim. separata) invece agganciava (43 dB-Hz, 16 sat). Fix: GPS dal 5V (VBUS) all'ingresso 5V del breakout. E: patch passiva β†’ serve cielo aperto vero, lontano dal Mac (rumore USB desensibilizza L1); sotto casa 1-2 sat a 26 dB-Hz, all'aperto 12-16 sat a 36-43.

⚠️ Gotcha da ricordare: sul SIM7080 usa TinyGSM+PubSubClient (mai SM* nativo); leggi il DAN-F10N in NMEA (config UBX inaffidabile sul F10); alimenta il GPS dal 5V, non dal 3V3 dell'MCU.

πŸ—ΊοΈ Prossimi passi

  • Field test su strada: durata batteria always-on (LTE-M ~10-25mA) + qualitΓ  traccia dual-band su percorso reale.
  • Smart power (v1): wake-on-motion + PSM/eDRX del SIM7080 (dove il Tag NB-IoT eccelle) β†’ misurare i 3 stati (sleep/idle/tracking).
  • Confronto Cat-M vs Cat-1: questo banco (SIM7080 LTE-M) vs il gemello A7670E a paritΓ  di GPS/firmware.