MQTT/UDP
Versión simplificada de MQTT sobre UDP: ¡la red es corredor!
Nota Otro repositorio: https://gitverse.ru/dzavalishin/mqtt_udp
Ver la versión rusa / русскаES верси esposa
MQTT es un lindo protocolo simple muy adecuado para IoT y cosas similares.
Pero puede ser aún más simple y aún ser muy utilizable: MQTT/UDP es simplemente un paquetes MQTT Publish transmitido a través de un UDP.
MQTT/UDP es
- Extremadamente simple
- Latencia extremadamente rápida y mínima posible
- Excluye el corredor (que es un solo punto de falla)
- Reduce el tráfico de red (cada masuremencia se envía exactamente de una vez a todos)
- Razonablemente confiable (si lo usamos para sensores, que generalmente reenvían los datos cada pocos segundos más o menos)
- Se puede admitir incluso en un hardware que no puede admitir TCP; de hecho, solo se requiere un envío de UDP
- Configuración cero: un nodo del sensor no necesita configuración, solo transmite sus datos. (Y, si aún lo necesita, MQTT/UDP admite una configuración remota a través de la red).
- Admite firma digital
Para leer más
- MQTT/UDP wiki
- Documentación
Este repositorio contiene
- Una simple implementación de MQTT/UDP en algunos lenguajes de programación populares.
- Una implementación del puente MQTT más simple para MQTT/UDP en Pyton.
- Una herramienta para enviar datos de MQTT/UDP a OpenHab
- Una aplicación de depuración para volcar el tráfico MQTT/UDP (Herramientas/Visor).
- Otras herramientas y utilidades
Si quieres ayudar a un proyecto
Siéntete libre de:
- Agregar implementación en su lenguaje de programación favorito
- Escribe un puente al protocolo MQTT clásico (tenemos muy simple aquí escrito en Python)
- Extienda su corredor MQTT favorito o sistema IoT (OpenHab?) Con Soporte MQTT/UDP
- Verifique la especificación/implementación de MQTT/UDP contra MQTT Spec. Debemos ser compatibles cuando sea posible.
Es realmente fácil.
Razones para evitar MQTT/UDP
- Necesita transferir cargas útiles largas. En algunos sistemas, el tamaño del datagrama UDP es limitado.
- Debe saber si el datagrama fue entregado con seguridad. Es imposible con UDP. Sin embargo, el subsistema de entrega confiable está en desarrollo ahora y estará disponible pronto.
Formas de extender MQTT/UDP
- Parece ser razonable agregar algún tipo de firma a los paquetes para evitar la suplantación de datos. En realidad, ya está hecho para la implementación de Java, C y Pythin vendrán pronto.
- La transmisión no es la mejor manera de transmitir datos. La multidifusión es mucho mejor. Aunque la multidifusión no es tan bien compatible en IoT OS o monitores.
Instrucciones de inicio rápido
- Repositorio de clones al disco local
- Lea el archivo de cómo
Herramientas de soporte
Este repositorio contiene herramientas para admitir la integración y prueba de MQTT/UDP:
- Herramienta GUI para mostrar el estado actual de los datos transmitidos en el directorio de herramientas/visor; Consulte también la página de ayuda para el espectador.
- Generador de datos aleatorio (Random_to_udp.py) en el directorio Python3/Ejemplos
- Enviar/verificar la herramienta para paquetes numerados secuencialmente. Consulte SEQ_STORM_SEND.PY y SEQ_STORM_CHECK.PY EN LANG/PYTHON3/Ejemplos Directorio
- Disector de Wireshark para ver datos de protocolo en la red en el directorio Lang/Lua/Wireshark
Ejemplos de código
Pitón
Enviar datos:
import mqttudp . engine
if __name__ == "__main__" :
mqttudp . engine . send_publish ( "test_topic" , "Hello, world!" ) Escuche los datos:
import mqttudp . engine
def recv_packet ( ptype , topic , value , pflags , addr ):
if ptype != "publish" :
print ( ptype + ", " + topic + " t t " + str ( addr ) )
return
print ( topic + "=" + value + " t t " + str ( addr ) )
if __name__ == "__main__" :
mqttudp . engine . listen ( recv_packet ) Descargar el paquete Pypi
Java
Enviar datos:
PublishPacket pkt = new PublishPacket ( topic , value );
pkt . send ();
Escuche los datos:
PacketSourceServer ss = new PacketSourceServer ();
ss . setSink ( pkt -> { System . out . println ( "Got packet: " + pkt ); }); Descargar jar
do
Enviar datos:
int rc = mqtt_udp_send_publish ( topic , value );
Escuche los datos:
int main ( int argc , char * argv [])
{
...
int rc = mqtt_udp_recv_loop ( mqtt_udp_dump_any_pkt );
...
}
int mqtt_udp_dump_any_pkt ( struct mqtt_udp_pkt * o )
{
printf ( "pkt %x flags %x, id %d" ,
o -> ptype , o -> pflags , o -> pkt_id
);
if ( o -> topic_len > 0 )
printf ( " topic '%s'" , o -> topic );
if ( o -> value_len > 0 )
printf ( " = '%s'" , o -> value );
printf ( "n" );
}
Lua
Enviar datos:
local mq = require " mqtt_udp_lib "
mq . publish ( topic , val );
Escuche los datos:
local mq = require " mqtt_udp_lib "
local listener = function ( ptype , topic , value , ip , port )
print ( " ' " .. topic .. " ' = ' " .. val .. " ' " .. " from: " , ip , port )
end
mq . listen ( listener ) Descargar luarock
Ir
Hay una implementación del idioma GO, ver Lang/Go para más detalles