MQTT siempre conectado y carga de datos 4G

10

Estoy trabajando en un proyecto de IoT que involucra a miles de clientes MQTT que están conectados a un corredor (mosquitto) a través de un enrutador / módem 4G / WiFi. Menos de 10 clientes están conectados al mismo enrutador, y los enrutadores provienen de diferentes lugares (diferentes ciudades).

En este momento tenemos muy pocos clientes y siempre están conectados con el corredor. Sé por esta discusión que no habrá problemas incluso cuando crezcan hasta más de 1000 unidades.

Mi pregunta es sobre la carga de tráfico en la conexión 4G. El usuario final teme el consumo de datos con todos esos "canales" abiertos y no utilizados. Según tengo entendido, cuando no hay actividad, solo se envían los paquetes de mantenimiento , aunque no puedo encontrar esta información con seguridad en la documentación de MQTT.

¿Puedo suponer que el tráfico cuando no se publican paquetes es insignificante?

marca
fuente

Respuestas:

6

La especificación MQTT enumera los detalles de los paquetes PINGREQ y PINGRESP que conforman la transacción keep-alive.

Cada uno tiene un tamaño de solo 2 bytes, por lo que un evento de mantenimiento completo utiliza 4 bytes en total. Dado que puede controlar con qué frecuencia se envían paquetes de mantenimiento para cada cliente en función de la rapidez con la que necesita saber que la conexión se ha caído, tiene control total de la cantidad de datos que se utilizan cuando no se publican mensajes.

Si desea reducir aún más la carga de datos, puede tener un corredor separado ejecutándose antes del enrutador 4G al que se conectan los 10 dispositivos, que luego se conecta al corredor central. Esto reduciría el número de paquetes de mantenimiento de vida a 1 por enrutador 4G en lugar de 1 por cliente. Esto tiene la ventaja de que los 10 dispositivos locales pueden continuar pasando mensajes entre sí si el enlace se cae y usted puede usar mensajes retenidos / Último testamento y mensajes de Testement para rastrear cuando los clientes individuales caen.

hardillb
fuente
Usar un intermediario es un buen consejo, incluso me temo que no cabe en este caso específico. ¡Útil saber, sin embargo!
Mark
De todos modos, conocía el comportamiento de PINGREQ / RESP, pero lo que no encontré es que son los únicos paquetes intercambiados cuando no hay actividad real (es decir, iniciada por las aplicaciones del usuario). Podría inferir esto de su respuesta, pero los documentos no parecen declararlo explícitamente.
Mark
El temporizador Keep-Live se reinicia cada vez que se recibe un paquete, no puedo recordar en qué parte de la especificación se dice esto desde la parte superior de mi cabeza
hardillb
2
Solo quería señalar que la sugerencia de introducir un agente local tiene aún más sentido si no estamos hablando de 2 bytes por mensaje, pero debido a TCP / IP es más como 42 bytes por mensaje, por lo que es 84 para un ciclo de ping.
xwoker
1
@Mark El hecho de que solo los paquetes Ping son lo único que se envía si no se envían mensajes está implícito en las oraciones después de esta tabla: docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/…
hardillb