MQTT/UDP
Versão Simpificada do MQTT sobre UDP: a rede é corretor!
NOTA OUTROS REPAÇÃO: https://gitverse.ru/dzavalishin/mqtt_udp
Veja a versão russa / р рс к и и з з з з з з з з з з з з з з з з з з з з з з з
O MQTT é um protocolo simples bonito, adequado para a IoT e coisas semelhantes.
Mas pode ser ainda mais simples e ainda muito utilizável: o MQTT/UDP é apenas um MQTT Publish Packets transmitido por um UDP.
MQTT/UDP IS
- Extremamente simples
- Latência extremamente rápida e mínima possível
- Exclui o corretor (que é um ponto único de falha)
- Reduz o tráfego de rede (cada masculino é enviada exatamente uma vez para todas)
- Razoavelmente confiável (se o usarmos para sensores, que geralmente reenviaram dados a cada poucos segundos)
- Pode ser suportado mesmo em um hardware que não possa suportar TCP - na verdade, apenas o envio do UDP é necessário
- Configuração zero - Um nó do sensor não precisa de configuração, apenas transmite seus dados. (E, se você ainda precisar, o MQTT/UDP suporta configuração remota sobre a rede.)
- Suporta assinatura digital
Para leitura adicional
- Wiki mqtt/udp
- Documentação
Este repositório contém
- Uma implementação simples do MQTT/UDP em algumas linguagens de programação populares.
- Uma implementação de ponte MQTT para MQTT/UDP mais simples em Pyton.
- Uma ferramenta para enviar dados do MQTT/UDP para o OpenHab
- Um aplicativo de depuração para despejar tráfego MQTT/UDP (ferramentas/visualizador).
- Outras ferramentas e utilitários
Se você quiser ajudar um projeto
Sinta -se à vontade para:
- Adicione a implementação em sua linguagem de programação favorita
- Escreva uma ponte para o Classic MQTT Protocol (temos muito simples aqui escrito em Python)
- Estenda seu corretor MQTT favorito ou sistema IoT (OpenHab?) Com suporte MQTT/UDP
- Verifique a especificação/implementação do MQTT/UDP contra o MQTT Spec. Devemos ser compatíveis sempre que possível.
É muito fácil.
Razões para evitar MQTT/UDP
- Você precisa transferir cargas úteis longas. Em alguns sistemas, o tamanho do datagrama UDP é limitado.
- Você precisa saber se o datagrama foi entregue com certeza. É impossível com o UDP. No entanto, o subsistema de entrega confiável está em desenvolvimento agora e estará disponível em breve.
Maneiras de estender o MQTT/UDP
- Parece ser razoável adicionar algum tipo de assinatura aos pacotes para evitar a falsificação de dados. Na verdade, já está feito para implementação de Java, C e Pitina chegarão em breve.
- A transmissão não é a melhor maneira de transmitir dados. Multicast é muito melhor. Embora o Multicast não seja tão bem suportado nos OS ou monitores da IoT.
Instruções de início rápido
- Repositório de clones para disco local
- Leia o arquivo Howto
Ferramentas de suporte
Este repositório contém ferramentas para apoiar a integração e teste de MQTT/UDP:
- Ferramenta GUI para mostrar o estado de dados atual transmitido no diretório de ferramentas/visualizador; Veja também Página de ajuda ao visualizador.
- Gerador de dados aleatórios (random_to_udp.py) no diretório python3/exemplos
- Ferramenta de envio/verificação para pacotes numerados sequencialmente. Veja seq_storm_send.py e seq_storm_check.py no diretório Lang/Python3/Exemplos
- Dissector Wireshark para ver dados do protocolo na rede no diretório Lang/Lua/Wireshark
Exemplos de código
Python
Enviar dados:
import mqttudp . engine
if __name__ == "__main__" :
mqttudp . engine . send_publish ( "test_topic" , "Hello, world!" ) Ouça os dados:
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 ) Baixe o pacote Pypi
Java
Enviar dados:
PublishPacket pkt = new PublishPacket ( topic , value );
pkt . send ();
Ouça os dados:
PacketSourceServer ss = new PacketSourceServer ();
ss . setSink ( pkt -> { System . out . println ( "Got packet: " + pkt ); }); Download jar
C
Enviar dados:
int rc = mqtt_udp_send_publish ( topic , value );
Ouça os dados:
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 dados:
local mq = require " mqtt_udp_lib "
mq . publish ( topic , val );
Ouça os dados:
local mq = require " mqtt_udp_lib "
local listener = function ( ptype , topic , value , ip , port )
print ( " ' " .. topic .. " ' = ' " .. val .. " ' " .. " from: " , ip , port )
end
mq . listen ( listener ) Baixe Luarock
Ir
Existe uma implementação de idiomas GO, consulte Lang/Go para obter detalhes