Integrazione MQTT
Eziwan include un client MQTT nativo che invia i dati sul campo (sensori RS485, metriche di rete, eventi) a qualsiasi broker MQTT, sia cloud che on-premise.
Broker compatibili
| Broker | Tipo | Note |
|---|---|---|
| Eziwan MQTT | Gestito (incluso) | mqtt.eziwan.com:8883 — TLS, configurazione automatica |
| Mosquitto | Self-hosted | Open-source — da ospitare |
| HiveMQ | Cloud / On-premise | Enterprise |
| EMQX | Cloud / On-premise | Alte prestazioni |
| AWS IoT Core | Cloud | Integrazione con Lambda, S3 |
| Azure IoT Hub | Cloud | Integrazione con Azure Stream Analytics |
| Google Cloud IoT | Cloud | Integrazione con Pub/Sub |
| Scaleway IoT Hub | Cloud | Ospitato in Francia |
Configurazione del broker
Tramite la dashboard di Eziwan
Dispositivo → Configurazione → MQTT
Interfaccia grafica per configurare il broker, le credenziali e gli argomenti.
Configurazione YAML
mqtt:
enabled: true
broker: "mqtt.eziwan.com"
port: 8883
tls: true
client_id: "GW-Paris-01"
# Auth — token disponibile nella dashboard → Impostazioni → MQTT
username: "np_device"
password: "np_mqtt_xxxxxxxxxx"
# Qualità del servizio
keepalive: 60
qos: 1
retain: false
# Reconnexion automatique
reconnect_delay_min: 1
reconnect_delay_max: 60
# Buffering si connexion perdue
offline_buffer: true
offline_buffer_size: 10000 # messages
offline_buffer_ttl: 3600 # secondes
Se la connessione LTE viene temporaneamente interrotta, Eziwan memorizza i messaggi MQTT in un buffer locale (fino a offline_buffer_size messaggi) e li pubblica automaticamente al ripristino della connessione. I dati non vanno mai persi.
Struttura degli argomenti
Dati dei sensori RS485 / Modbus
eziwan/{device_id}/modbus/{slave_id}/{tag_name}
Exemple :
eziwan/d_a1b2c3d4/modbus/1/active_power
eziwan/d_a1b2c3d4/modbus/2/temperatura
È inoltre possibile definire argomenti personalizzati per registro nella configurazione Modbus:
mqtt_topic: "usine/paris/energie/compteur-01/puissance"
Metriche di sistema (pubblicate automaticamente)
| Argomento | Descrizione | Intervallo |
|---|---|---|
.../system/rsrp | Segnale RSRP LTE (dBm) | 60 s |
.../system/rsrq | Qualità del segnale RSRQ (dB) | 60 s |
.../system/uptime | Tempo di attività (secondi) | 60 s |
.../system/sim_active | SIM attiva (1 o 2) | Al cambiamento |
.../system/operator | Operatore LTE attuale | Al cambio |
.../system/wan_ip | IP WAN | Al cambio |
.../system/vpn_latency_ms | Latenza tunnel VPN | 60 s |
Eventi in tempo reale
| Argomento | Evento |
|---|---|
.../events/failover | Passaggio da SIM1 a SIM2 |
.../events/failover_recovered | Ritorno su SIM1 |
.../events/reboot | Riavvio rilevato |
.../events/vpn_connected | Tunnel VPN stabilito |
.../events/vpn_disconnected | Tunnel VPN perso |
.../events/modbus_timeout | Slave Modbus non risponde più |
Formato dei payload
Carico utile standard (sensori)
{
"device_id": "d_a1b2c3d4",
"name": "GW-Paris-01",
"timestamp": "2025-06-15T14:23:45.123Z",
"metric": "active_power",
"value": 42.7,
"unit": "kW",
"quality": "good",
"source": "modbus:slave=1:reg=0x0048"
}
Payload dell'evento di failover
{
"device_id": "d_a1b2c3d4",
"event": "failover",
"timestamp": "2025-06-15T14:23:45.123Z",
"from_sim": 1,
"to_sim": 2,
"from_operator": "Orange",
"to_operator": "SFR",
"reason": "rsrp_below_threshold",
"rsrp_sim1_dbm": -104,
"duration_ms": 28340
}
Il campo "quality" indica l'affidabilità della misurazione:
"good"— lettura Modbus riuscita"timeout"— lo slave non ha risposto"error"— errore Modbus (campo"error_code"presente)"stale"— ultimo valore noto (slave temporaneamente assente)
Abbonamento e prova
Test rapido con mosquitto_sub
# Iscriviti a tutte le discussioni relative a un dispositivo
mosquitto_sub -h mqtt.eziwan.com -p 8883 \
--cert ~/eziwan/client.crt \
--key ~/eziwan/client.key \
--cafile ~/eziwan/ca.crt \
-t "eziwan/d_a1b2c3d4/#" -v
# Argomenti specifici
mosquitto_sub -h mqtt.eziwan.com -p 8883 \
--cert ~/eziwan/client.crt --key ~/eziwan/client.key \
--cafile ~/eziwan/ca.crt \
-t "eziwan/d_a1b2c3d4/modbus/1/active_power" \
-t "eziwan/d_a1b2c3d4/events/#"
Scarica i tuoi certificati client da Impostazioni → MQTT → Scarica certificati.
Integrazione di InfluxDB 2.x con Grafana
Architettura
Configurazione di Telegraf
# /etc/telegraf/telegraf.conf
[[inputs.mqtt_consumer]]
servers = ["ssl://mqtt.eziwan.com:8883"]
topics = ["eziwan/+/modbus/#", "eziwan/+/system/#"]
qos = 1
# Certificats MTLS
tls_ca = "/etc/telegraf/eziwan-ca.crt"
tls_cert = "/etc/telegraf/eziwan-client.crt"
tls_key = "/etc/telegraf/eziwan-client.key"
# Parsing JSON
data_format = "json"
json_time_key = "timestamp"
json_time_format = "2006-01-02T15:04:05.999Z07:00"
tag_keys = ["device_id", "name", "metric", "unit"]
[[outputs.influxdb_v2]]
urls = ["http://influxdb:8086"]
token = "votre-token-influx"
organization = "acme-corp"
bucket = "eziwan"
Richiesta di feed per Grafana
from(bucket: "eziwan")
|> range(start: -24h)
|> filter(fn: (r) => r._measurement == "mqtt_consumer")
|> filter(fn: (r) => r.metric == "active_power")
|> filter(fn: (r) => r.device_id == "d_a1b2c3d4")
|> aggregateWindow(every: 1m, fn: mean, createEmpty: false)
|> yield(name: "puissance_active")
Integrazione con Node-RED
Node-RED consente di creare flussi di elaborazione dei dati visivi:
[
{
"type": "mqtt in",
"topic": "eziwan/d_a1b2c3d4/modbus/1/active_power",
"broker": "eziwan-mqtt",
"qos": 1
},
{
"type": "json"
},
{
"type": "function",
"func": "if (msg.payload.value > 100) { msg.alert = true; } return msg;"
},
{
"type": "http request",
"method": "POST",
"url": "https://hooks.slack.com/services/xxx",
"comment": "Alerte Slack si puissance > 100 kW"
}
]
QoS consigliata in base al caso d'uso
| Caso d'uso | QoS | Motivazione |
|---|---|---|
| Metriche di sistema (RSSI, uptime) | 0 | Dati ridondanti — perdita accettabile |
| Sensori di processo (energia, T°, P) | 1 | Affidabilità richiesta, duplicati gestiti |
| Allarmi ed eventi critici | 1 | Ricevuto almeno una volta |
| Comandi attuatori | 2 | Esattamente una volta — evita la doppia azione |
I certificati client MTLS sono disponibili in Impostazioni → MQTT → Scarica certificati. Sono unici per ogni tenant e possono essere rigenerati in qualsiasi momento.
Domande frequenti
Perché MQTT si è affermato nell'IoT industriale?
Perché è leggero (ideale su 4G), funziona con il modello “pubblica/sottoscrivi” (sono i dispositivi ad avviare la connessione, senza porte in entrata) e gestisce in modo nativo le connessioni intermittenti con i livelli di QoS e i messaggi in coda.
Quale livello di QoS scegliere?
Il QoS 1 (almeno una volta) è l'impostazione predefinita ideale per la telemetria: garantisce la consegna senza la complessità del QoS 2. Riservate il QoS 0 alle misurazioni ad alta frequenza tolleranti alla perdita.
Come proteggere un flusso MQTT?
TLS sistematico (porta 8883), autenticazione tramite certificato client o credenziali dedicate per dispositivo e separazione degli argomenti per sito. Il broker non deve mai accettare connessioni anonime.
MQTT sostituisce Modbus?
No, si completano a vicenda: Modbus raccoglie i dati il più vicino possibile alle apparecchiature (bus di campo), mentre MQTT li trasmette in modo efficiente al cloud. Il gateway effettua la conversione da Modbus a MQTT.
Risorse correlate
- MQTT industriale — la pagina delle soluzioni
- OPC UA e MQTT — combinare i due standard
- Da Modbus RTU a MQTT — la conversione da campo a cloud
- API REST Eziwan — l'altra via di integrazione
- MQTT e RS-485 nella pratica — l'articolo di approfondimento