Traduit de English par IA ·
J’ai mesuré cela l’an dernier sur nos trackers de remorques, parce que notre facture d’opérateur était absurde. Chiffres approximatifs issus de captures de paquets sur un SIM7600, TLS 1.2, le broker de la plateforme :
- reconnexion complète (poignée de main TCP + TLS avec chaîne de certificats + CONNECT + SUBSCRIBEs) : environ 5 à 6 Ko
- un aller-retour keepalive (PINGREQ/PINGRESP dans TLS, plus en-têtes TCP/IP et ACK) : environ 150 à 200 octets
- votre relevé de 80 octets sous forme de publish QoS 1 dans TLS avec PUBACK : également quelques centaines d’octets
Donc se reconnecter toutes les 5 minutes coûterait environ 8 640 poignées de main par mois, soit plus de 45 Mo. Bien pire. Un keepalive de 60 représente 43 200 pings par mois, environ 8 Mo. C’est une grosse part de vos 25 Mo.Ce qui a fonctionné chez nous :Keepalive jusqu’à 300 s (le broker ramène de toute façon toute valeur supérieure à son maximum, soit 300). Cela divise les pings par cinq. Vérifiez que votre opérateur ne coupe pas les sessions NAT inactives plus vite ; chez nous elles tenaient 6 minutes, certaines coupent entre 2 et 4 minutes. Si vous voyez keepalive_timeout dans l’onglet Log de l’appareil, réduisez la valeur.Regroupement. Au lieu d’un publish toutes les 5 minutes, mettez en tampon 3 relevés et envoyez-les dans un seul tableau avec horodatages (l’ESP32 dispose de NTP, donc ts convient) :
[{"ts":1762336800000,"values":{"flow":12.1,"pressure":2.4,"pump":1}},
{"ts":1762337100000,"values":{"flow":12.3,"pressure":2.4,"pump":1}},
{"ts":1762337400000,"values":{"flow":11.9,"pressure":2.3,"pump":1}}]
Mêmes données, un seul publish, et cela ne compte qu’un message sur le quota mensuel au lieu de trois.Repérez les éléments superflus. Chez nous, le pire était que le firmware envoyait les attributs client (IP, RSSI, version du firmware) à chaque publish. Ne les envoyez qu’en cas de changement.Concernant le statut hors ligne : avec Live connection comme règle de connexion, les appareils restent en ligne tant que la session MQTT est ouverte, donc avec un keepalive de 300 rien ne change. Si vous passez un jour en mode connexion-envoi-déconnexion, basculez-les vers un profil avec Recent message, sinon ils apparaîtront hors ligne entre les envois.
I measured this on our trailer trackers last year because our carrier bill was silly. Rough numbers from packet captures on a SIM7600, TLS 1.2, the platform’s broker:
- full reconnect (TCP + TLS handshake with certificate chain + CONNECT + SUBSCRIBEs): about 5 to 6 KB
- one keepalive round trip (PINGREQ/PINGRESP inside TLS, plus TCP/IP headers and ACKs): roughly 150 to 200 bytes
- your 80-byte reading as a QoS 1 publish inside TLS with PUBACK: also a couple of hundred bytes
So reconnecting every 5 minutes would cost about 8,640 handshakes a month, 45+ MB. Way worse. Keepalive 60 is 43,200 pings a month, around 8 MB. That’s a big chunk of your 25 MB.
What worked for us:
Keepalive up to 300 s (the broker serves anything above its maximum at 300 anyway). That cuts pings by five. Check your carrier doesn’t drop idle NAT sessions faster; ours held 6 minutes, some drop at 2 to 4. If you see keepalive_timeout in the device’s Log tab, step it down.
Batch. Instead of one publish every 5 minutes, buffer 3 readings and send them as one array with timestamps (ESP32 has NTP, so ts is fine):
[{"ts":1762336800000,"values":{"flow":12.1,"pressure":2.4,"pump":1}},
{"ts":1762337100000,"values":{"flow":12.3,"pressure":2.4,"pump":1}},
{"ts":1762337400000,"values":{"flow":11.9,"pressure":2.3,"pump":1}}]
Same data, one publish, and it also counts as one message against the monthly quota instead of three.
Look for chatty extras. In our case the worst was the firmware sending client attributes (IP, RSSI, firmware version) on every publish. Only send them on change.
On offline: with Live connection as the online rule they stay online as long as the MQTT session is open, so with keepalive 300 nothing changes. If you ever do go connect-send-disconnect, switch them to a profile with Recent message, otherwise they’d show offline between sends.

