Gateway multi-protocoles¶
Une gateway industrielle réconcilie en un point unique des protocoles incompatibles : Zigbee, LoRa, BLE, Modbus — et les expose en MQTT ou HTTP vers le reste de l'infrastructure.
Le problème de la tour de Babel protocolaire¶
Un site industriel typique héberge simultanément des dizaines de protocoles hétérogènes. Les capteurs de mesure utilisent Modbus RTU sur RS-485. Les détecteurs de présence sans fil parlent Zigbee 3.0. Les balises de localisation d'assets tournent en BLE 5.1. Les stations météo distantes transmettent en LoRaWAN. Les automates parlent PROFINET ou EtherNet/IP.
Chacun de ces protocoles existe pour de bonnes raisons : optimisation de la consommation énergétique, portée, débit, robustesse aux interférences, coût des modules. Aucun protocole unique ne couvre tous les cas d'usage.
La gateway multi-protocoles est le nœud qui réconcilie cet écosystème. Elle parle simultanément plusieurs langues "côté terrain" (southbound) et expose une interface unifiée "côté infrastructure" (northbound).
Architecture northbound / southbound¶
Le découpage fondamental d'une gateway est la séparation entre les interfaces orientées terrain et les interfaces orientées infrastructure.
graph TB
subgraph Terrain ["Southbound — Terrain"]
Z[Capteurs Zigbee\n2.4 GHz, IEEE 802.15.4]
L[Noeuds LoRa\n868 MHz, longue portée]
B[Balises BLE\nBluetooth 5.1 CODED]
M[Automates Modbus RTU\nRS-485, 9600–115200 bps]
W[Compteurs M-Bus\nWired, 2400 bps]
end
subgraph GW ["Gateway — Couche de traduction"]
ZB[Stack Zigbee\nCoordinator CC2652]
LR[Stack LoRa\nSX1276 + chirpstack]
BT[Stack BLE\nhci0 + gatttool]
MB[Stack Modbus\nlibmodbus]
MBU[Stack M-Bus\nmbus-serial]
CORE[Moteur de traduction\nNode-RED / Python]
BUFF[Buffer local\nSQLite / Redis]
FILT[Filtrage &\nagrégation]
end
subgraph Cloud ["Northbound — Infrastructure"]
MQTT[Broker MQTT\nMosquitto / EMQX]
HTTP[API REST\nHTTP/HTTPS]
AMQP[Message queue\nRabbitMQ / Kafka]
TSDB[Time-series DB\nInfluxDB / TimescaleDB]
end
Z --> ZB
L --> LR
B --> BT
M --> MB
W --> MBU
ZB --> CORE
LR --> CORE
BT --> CORE
MB --> CORE
MBU --> CORE
CORE --> BUFF
CORE --> FILT
FILT --> MQTT
FILT --> HTTP
FILT --> AMQP
BUFF --> TSDB Les bridges protocole par protocole¶
Zigbee → MQTT (zigbee2mqtt)¶
Zigbee est le protocole dominant pour la domotique industrielle et les bâtiments intelligents. La pile Zigbee 3.0 supporte jusqu'à 65 000 devices par réseau maillé, avec des consommations de l'ordre de 1 mA en actif et quelques µA en veille.
Le bridge zigbee2mqtt est de loin la solution la plus utilisée en production. Il s'appuie sur un coordinateur USB (Texas Instruments CC2652P ou SONOFF Zigbee 3.0 Dongle Plus) et expose chaque device Zigbee comme un topic MQTT.
Un thermostat Zigbee devient ainsi :
zigbee2mqtt/salon/temperature → {"temperature": 21.4, "humidity": 58, "battery": 87}
zigbee2mqtt/salon/set → {"occupied_heating_setpoint": 20}
Plus de 3 000 devices sont supportés nativement. La configuration se fait via un fichier YAML et une interface web intégrée.
LoRa / LoRaWAN → IP (ChirpStack)¶
LoRaWAN est conçu pour les longue portées (1 à 15 km selon l'environnement) avec des débits faibles (250 bps à 50 kbps) et une consommation très réduite — ce qui en fait le protocole privilégié pour les capteurs outdoor ou difficiles d'accès.
ChirpStack est le network server LoRaWAN open-source de référence. La gateway physique (Semtech SX1302, RAK7268) transmet les trames radio au network server via le protocole Semtech UDP Packet Forwarder. ChirpStack gère l'ADR (Adaptive Data Rate), le join OTAA/ABP, et expose les données en MQTT ou HTTP.
# Topic MQTT ChirpStack v4
application/[app_id]/device/[dev_eui]/event/up
→ payload JSON avec données déchiffrées + métadonnées radio (RSSI, SNR, SF utilisé)
BLE → MQTT¶
Le BLE (Bluetooth Low Energy) couvre typiquement 10 à 100 m selon la puissance d'émission et les obstacles. Il est très utilisé pour les balises de localisation (iBeacon, Eddystone), les capteurs portables, les équipements de laboratoire.
La translation BLE → MQTT se fait en deux étapes sur le gateway :
- Scan passif : le dongle BLE (
hci0) scanne les advertisings périodiques sans établir de connexion. Adapté aux balises de présence/localisation. - Connexion GATT : connexion directe au device pour lire/écrire des caractéristiques. Adapté aux capteurs avec notifications.
En Python, la bibliothèque Bleak (asyncio, cross-platform) est le standard actuel :
import asyncio
from bleak import BleakScanner, BleakClient
import paho.mqtt.client as mqtt
# UUID de la caractéristique de température (exemple standard BLE SIG)
TEMP_CHAR_UUID = "00002a6e-0000-1000-8000-00805f9b34fb"
async def read_ble_sensor(address: str, mqtt_client: mqtt.Client):
async with BleakClient(address) as client:
raw = await client.read_gatt_char(TEMP_CHAR_UUID)
temp = int.from_bytes(raw, "little", signed=True) / 100.0
mqtt_client.publish(f"ble/{address}/temperature",
f'{{"value": {temp}}}', qos=1)
Modbus RTU → MQTT¶
Modbus RTU sur RS-485 est le protocole industriel le plus répandu pour les automates, compteurs d'énergie, variateurs de fréquence, capteurs de process. Inventé en 1979, il équipe encore des centaines de millions de devices en service.
La translation se fait via polling cyclique : le gateway interroge régulièrement chaque esclave et publie les registres modifiés.
from pymodbus.client import ModbusSerialClient
client = ModbusSerialClient(port="/dev/ttyUSB0", baudrate=9600,
parity="N", stopbits=1, bytesize=8)
client.connect()
# Lecture des registres 0-9 de l'esclave 1 (holding registers)
result = client.read_holding_registers(address=0, count=10, slave=1)
if not result.isError():
registers = result.registers
# Conversion selon documentation du device
temperature = registers[0] / 10.0 # ex. 215 → 21.5 °C
pressure = registers[1] / 100.0 # ex. 1013 → 10.13 bar
Buffering et store-and-forward¶
La connectivité northbound n'est jamais garantie à 100 %. Pannes réseau, maintenance, saturation du broker — la gateway doit absorber ces discontinuités sans perdre de données.
Le pattern store-and-forward stocke les messages localement et les retransmet par ordre chronologique dès que la connexion est rétablie.
sequenceDiagram
participant C as Capteur terrain
participant G as Gateway
participant B as Buffer local (SQLite)
participant M as Broker MQTT
C->>G: Mesure toutes les 30 s
G->>M: Publish (connexion OK)
Note over M: Réseau tombe
C->>G: Mesure #47
G->>B: Store localement (offline)
C->>G: Mesure #48
G->>B: Store localement (offline)
Note over M: Réseau revient
G->>B: Read messages en attente
G->>M: Publish #47 (MQTT QoS 1)
M-->>G: PUBACK
G->>M: Publish #48 (MQTT QoS 1)
M-->>G: PUBACK
G->>B: Delete messages acquittés Dimensionnement du buffer¶
Le buffer doit être dimensionné pour la pire durée de déconnexion tolérée. À 100 messages/s et un message JSON de 200 octets, une coupure de 24 h représente :
100 × 86 400 × 200 = 1,73 GB
Pour les gateways industrielles, un SSD de 32 GB avec rotation automatique (suppression des plus anciens au-delà d'une retention de 7 jours) est un dimensionnement courant.
Tableau comparatif des bridges southbound¶
| Protocole | Débit typique | Portée | Topologie | Bridge recommandé | Maturité prod |
|---|---|---|---|---|---|
| Zigbee 3.0 | 250 kbps | 10–100 m | Mesh | zigbee2mqtt | Très élevée |
| LoRaWAN EU868 | 0,25–50 kbps | 1–15 km | Étoile | ChirpStack | Très élevée |
| BLE 5.1 | 125 kbps–2 Mbps | 10–400 m | Étoile | Bleak / bluepy | Élevée |
| Modbus RTU | 9,6–115 kbps | 1 200 m (RS-485) | Maître/esclaves | pymodbus | Très élevée |
| Z-Wave | 100 kbps | 30 m | Mesh | zwavejs2mqtt | Élevée |
| M-Bus | 300–9 600 bps | 1 000 m | Maître/esclaves | libmbus | Moyenne |
| Thread | 250 kbps | 50 m | Mesh | otbr-agent | En croissance |
Ce qu'il faut retenir¶
- La gateway est le nœud central qui traduit les protocoles terrain (southbound) en interfaces infrastructure standardisées (northbound).
- Le buffering store-and-forward est indispensable pour garantir zéro perte de données lors des coupures réseau.
- zigbee2mqtt, ChirpStack et pymodbus sont les bridges open-source les plus matures pour les déploiements industriels.
- Le découplage northbound/southbound permet de remplacer un protocole terrain sans toucher à l'infrastructure cloud.
Chapitre suivant : Gateway sur Raspberry Pi — implémenter concrètement une gateway de terrain avec Mosquitto, zigbee2mqtt et Node-RED.