MQTT / UDP
Version simpifiée de MQTT sur UDP: le réseau est courtier!
Remarque Autre repo: https://gitverse.ru/dzavalishin/mqtt_udp
Voir la version russe / рсская Версия здесь
MQTT est un joli protocole simple bien adapté à l'IoT et à des choses similaires.
Mais il peut être encore plus simple et toujours très utilisable: MQTT / UDP est simplement un paquets de publication MQTT diffusé sur un UDP.
MQTT / UDP est
- Extrêmement simple
- La latence extrêmement rapide et minimale possible
- Exclut le courtier (qui est un seul point de défaillance)
- Abaisse le trafic réseau (chaque masure de masure est envoyé exactement une fois à tous)
- Raisonnablement fiable (si nous l'utilisons pour les capteurs, qui renoncent généralement aux données toutes les quelques secondes)
- Peut être pris en charge même sur un matériel qui ne peut pas prendre en charge TCP - en fait, seul l'envoi UDP est requis
- Configuration zéro - Un nœud de capteur n'a pas besoin de configuration, il diffuse simplement ses données. (Et, si vous en avez toujours besoin, MQTT / UDP prend en charge la configuration distante sur le réseau.)
- Prend en charge la signature numérique
Pour une lecture plus approfondie
- Wiki MQTT / UDP
- Documentation
Ce référentiel contient
- Une simple implémentation MQTT / UDP dans certains langages de programmation populaires.
- Une implémentation de pont MQTT à MQTT / UDP la plus simple à Pyton.
- Un outil pour envoyer des données de MQTT / UDP à OpenHAB
- Une application de débogage pour vider le trafic MQTT / UDP (Tools / Viewer).
- Autres outils et services publics
Si vous souhaitez aider un projet
N'hésitez pas à:
- Ajouter l'implémentation dans votre langage de programmation préféré
- Écrivez un pont vers le protocole MQTT classique (nous en avons un très simple écrit ici en python)
- Étendez votre courtier MQTT ou système IoT préféré (OpenHAB?) Avec support MQTT / UDP
- Vérifiez la spécification / implémentation MQTT / UDP par rapport aux spécifications MQTT. Nous devons être compatibles dans la mesure du possible.
C'est vraiment facile.
Raisons d'éviter MQTT / UDP
- Vous devez transférer de longues charges utiles. Sur certains systèmes, la taille des datagrammes UDP est limitée.
- Vous devez savoir si Datagram a été livré à coup sûr. C'est impossible avec UDP. Cependant, un sous-système de livraison fiable est en cours de développement maintenant et sera bientôt disponible.
Façons d'étendre MQTT / UDP
- Il semble raisonnable d'ajouter une sorte de signature aux paquets pour éviter l'usurpation des données. En fait, cela est déjà fait pour la mise en œuvre de Java, C et Pythin viendront bientôt.
- La diffusion n'est pas le meilleur moyen de transmettre des données. La multidiffusion est bien meilleure. Bien que la multidiffusion ne soit pas si bien prise en charge dans l'IoT OS ou les moniteurs.
Instructions de démarrage rapide
- Référentiel de clones au disque local
- Lire le fichier Howto
Outils de support
Ce référentiel contient des outils pour prendre en charge l'intégration et le test MQTT / UDP:
- Outil d'interface graphique pour afficher l'état actuel des données transmis dans le répertoire des outils / visionneurs; Voir aussi la page d'aide de la visionneuse.
- Générateur de données aléatoires (random_to_udp.py) dans le répertoire Python3 / Exemples
- Outil Envoyer / vérifier les paquets numérotés séquentiellement. Voir seq_storm_send.py et seq_storm_check.py dans le répertoire Lang / Python3 / Exemples
- Dissecteur Wireshark pour voir les données de protocole sur le réseau dans le répertoire Lang / Lua / Wireshark
Exemples de code
Python
Envoyer des données:
import mqttudp . engine
if __name__ == "__main__" :
mqttudp . engine . send_publish ( "test_topic" , "Hello, world!" ) Écoutez les données:
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 ) Télécharger le package PYPI
Java
Envoyer des données:
PublishPacket pkt = new PublishPacket ( topic , value );
pkt . send ();
Écoutez les données:
PacketSourceServer ss = new PacketSourceServer ();
ss . setSink ( pkt -> { System . out . println ( "Got packet: " + pkt ); }); Télécharger le pot
C
Envoyer des données:
int rc = mqtt_udp_send_publish ( topic , value );
Écoutez les données:
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
Envoyer des données:
local mq = require " mqtt_udp_lib "
mq . publish ( topic , val );
Écoutez les données:
local mq = require " mqtt_udp_lib "
local listener = function ( ptype , topic , value , ip , port )
print ( " ' " .. topic .. " ' = ' " .. val .. " ' " .. " from: " , ip , port )
end
mq . listen ( listener ) Télécharger Luarock
Aller
Il y a une implémentation de la langue GO, voir Lang / Go pour plus de détails