SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
MQTT
Mosquitto & Paho
Laurent Guérin
Nantes JUG - 20 Novembre 2018
Laurent Guérin - @ltguerin
Who's speaking ?
2
Laurent Guérin @ltguerin
l-gu
https://github.com/lgu-lab
https://github.com/telosys-tools-bricks
https://github.com/telosys-templates-v3
https://github.com/telosys-eclipse-v3
Consultant / Architecte
Sogeti Labs Fellow
Project leader
(open source code generator)
Laurent Guérin - @ltguerin
Préambule : installer un client MQTT / smartphone
3
MQTT Dash MQTTool
Laurent Guérin - @ltguerin
MQTT en bref
4
Laurent Guérin - @ltguerin
MQTT
5
MQTT 3.1 MQTT 3.1.1
Protocole de transport « léger » conçu pour des
échanges de type « M2M » (Machine to Machine)
et donc « IoT »
https://mqtt.org/
https://www.oasis-open.org/committees/mqtt
IBM
Andy Stanford-Clark
EUROTECH
Arlen Nipper
MQTT = MQ (Message Queuing) Telemetry Transport
Laurent Guérin - @ltguerin
MQTT – TCP/IP
6
TCP/IP stack
MQTT
Ethernet Hardware
Application
Encryption
MQTT
Ethernet Hardware
Application
TCP/IP stack
SSL / TLS
MQTT est basé sur la stack TCP/IP
( pour la sécurité : MQTT over TLS )
tcp://host:1883 ssl://host:8883
Laurent Guérin - @ltguerin
MQTT – Cas d’utilisation
7
“MQTT is
designed to
use bandwidth
and batteries
sparingly”
IoT
Event Bus Messaging
Chat
M2M
Laurent Guérin - @ltguerin
MQTT – Messages
8
Message payload :
un simple tableau d’octets
(texte, binaire, etc )
Le header MQTT
se résume
généralement
à 2 octets
Message max size : 256 MB
Laurent Guérin - @ltguerin
MQTT – Pattern « Publish/Subscribe »
9
BROKER
MQTT
PUB
SUB
SUB
SUB
Publishing clients
Receiving clients
Laurent Guérin - @ltguerin
MQTT – Publish/Subscribe = Découplage
10
PUBLISHER
BROKER
SUBSCRIBER
PUB
SUB
L’un ne sait pas que l’autre existe
(et réciproquement)
Temps
Découplage dans l’espace + Découplage dans le temps
Laurent Guérin - @ltguerin
Broker MQTT
11
Laurent Guérin - @ltguerin
Mosquitto le broker de référence
 Mosquitto : broker MQTT
de la fondation Eclipse
 écrit en C (258 kb)
 https://mosquitto.org/
12
https://iot.eclipse.org/
Laurent Guérin - @ltguerin
Autres brokers MQTT
Quelques brokers MQTT :
 Moquette : broker écrit en Java (fondation Eclipse)
 HiveMQ : "enterprise MQTT broker" https://www.hivemq.com/
 VerneMQ : "high-performance, distributed MQTT broker" https://vernemq.com/
 EMQ : broker écrit en Erlang http://emqtt.io/
 CloudMQTT : comme son nom l’indique… https://www.cloudmqtt.com/
Brokers « MQ classiques » supportant le protocole MQTT :
 ActiveMQ : http://activemq.apache.org/mqtt.html
 RabbitMQ : MQTT Adapter https://www.rabbitmq.com/mqtt.html
(MQTT as of 3.0 / currently targeting version 3.1.1 of the spec).
13
cf MQTT implementations : https://en.wikipedia.org/wiki/Comparison_of_MQTT_Implementations
Laurent Guérin - @ltguerin
Les brokers MQTT sont partout
14
Raspberry Pi
Smartphone
Cloud
Laptop
Server
Laurent Guérin - @ltguerin
Client MQTT
15
Laurent Guérin - @ltguerin
MQTT – Clients prêts à l’emploi
16
Extension pour Chrome
MQTT.fx
Ligne de commande :
Apps
pour
Android
& iOS
etc...
BROKER
Laurent Guérin - @ltguerin
MQTT – Développer un client
17
https://www.eclipse.org/paho/
"Eclipse Paho project provides open-source
client implementations of MQTT"
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
Java / pom.xml :
Librairie pour Java SE 1.7 et +
Laurent Guérin - @ltguerin
MQTT – Développer un client
18
Avec Paho/Java le client MQTT est représenté par
la classe « MqttClient »
Principales méthodes :
• connect
• disconnect
• reconnect
• close
• publish
• subscribe
• unsubscribe
Les erreurs sont gérées via l’exception « MqttException »
Laurent Guérin - @ltguerin
MQTT – Connexion d’un client
19
 Un client se connecte à un broker MQTT au niveau « TCP »
 Informations nécessaires pour se connecter
 le hostname
 le port ( par défaut 1883 )
 un client-id (identifiant unique)
 Il peut également spécifier des options lors de la connexion
CLIENT BROKER
tcp://localhost:1883
1 - Connexion
2 - Dialogue
3 - Déconnexion
Client-Id
Laurent Guérin - @ltguerin
MQTT – Exemple avec MQTT.fx
20
Laurent Guérin - @ltguerin
MQTT – Exemple en Java
21
NB : « connect » crée un pool de threads. Les threads restent actifs jusqu’au « close »
(les threads sont encore actifs même après « disconnect » )
Laurent Guérin - @ltguerin
MQTT – Clients
22
 Classiquement 2 types de clients : Publisher & Subscriber
 Techniquement un client MQTT n’est pas spécialisé,
un même client peut faire à la fois du Publish et du Subcribe
CLIENT 1 BROKER CLIENT 2
Publie un « message » Souscrit pour recevoir
des messages
CLIENT 1 BROKER CLIENT 2
PUB SUB
PUB
PUB SUB
Laurent Guérin - @ltguerin
Topic
23
Laurent Guérin - @ltguerin
MQTT – Clients & topics
24
 Tous les messages envoyés sont associés à un « topic »
 Techniquement un « topic » identifie un canal (une file de messages)
 L’utilisation des « topics » permet de définir une sémantique
CLIENT
« PUB »
BROKER CLIENT
« SUB »
Publie un message
associé à un topic
Souscrit pour recevoir
les messages d’un topic
ou de plusieurs topics
pub(topic,data) sub(topic)
Publie le message
à tous les clients
abonnés au topic
pub
topic
Laurent Guérin - @ltguerin
MQTT – Topics
25
 Un « topic » peut être vu comme un canal de communication
entre 1 « publisher » et N « subscribers »
 La création des « topics » est implicite,
dès qu’un « publisher » émet un message sur un nouveau « topic » il est
automatiquement créé dans le « broker »
Laurent Guérin - @ltguerin
MQTT – Structure des topics
26
 Un topic est identifié par une chaine de caractères UTF-8
(au moins 1 caractère, espaces autorisés)
 Longueur max : 65535 bytes (64 kb – 1)
( UTF-8 : 1 character can require up to 4 bytes to encode )
 Les topics sont organisés selon une structure arborescente
 Un nom de topic est composé de
1 à N niveaux séparés par un « / »
 Exemples :
Les noms de topics commençant par « $ » sont réservés pour les statistiques internes du broker.
Exemples : $SYS/broker/clients/connected $SYS/broker/uptime
jug/france/nantes
home/groundfloor/livingroom/temperature
building
floor-1 floor-2
room-1 room-2
templight
Laurent Guérin - @ltguerin
MQTT – Topics wildcards
27
 Les subcribers sont généralement intéressés par plusieurs topics
 Plutôt que de s’abonner spécifiquement à chaque topic il est possible d’utiliser
des « wildcards » :
 « + » : single level wildcard
 « # » : multi level wildcard
 Exemples :
home/groundfloor/livingroom/temperature
home/groundfloor/+/temperature
home/groundfloor/#
home/groundfloor/+/+
home/groundfloor/livingroom/temperature
home/groundfloor/kitchen/temperature
home/groundfloor/livingroom/temperature
home/groundfloor/livingroom/brightness
home/groundfloor/kitchen/temperature
home/groundfloor/kitchen/ brightness
Laurent Guérin - @ltguerin
MQTT – Publisher Java
28
CLIENT
« PUB »
BROKER
CLIENT
« SUB »
1
2
pub(topic,msg)
sub(topic)
Laurent Guérin - @ltguerin
MQTT – Subscriber Java
29
CLIENT
« PUB »
BROKER
CLIENT
« SUB »
1
2
sub(topic)
pub(topic,msg)
Laurent Guérin - @ltguerin
Quality of Service
« QoS »
30
Laurent Guérin - @ltguerin
MQTT – Quality of Service : « QoS »
 MQTT propose 3 niveaux de qualité de service pour les échanges
entre un client et un broker MQTT :
 QoS level 2
 QoS level 1
 QoS level 0
31
C’est le client qui choisit
le niveau de QoS
QoS = 0/1/2
CLIENT
BROKER
CLIENTCLIENT
CLIENT
QoS
QoS
QoS
QoS
+
-
Laurent Guérin - @ltguerin
MQTT – QoS level 0 (au plus une fois)
QoS 0 : "at-most-once"
 En mode « best effort », les messages sont remis en fonction des
capacités du réseau (TCP/IP).
 L’acheminement des messages n’est pas garanti.
32
“fire and
forget”
0 .. 1
MQTT
CLIENT
MQTT
BROKER
PUBLISH QoS 0
(pas de retour)
Laurent Guérin - @ltguerin
MQTT – QoS level 1 (au moins une fois)
QoS 1 : "at-least-once"
 L’acheminement des messages est garanti au moins une fois
(il peut y avoir des doublons)
 L’émetteur conserve le message et le republie (avec le flag
« DUP ») jusqu’à ce qu’il reçoive l’accusé de réception
(« PUBACK » packet)
33
MQTT
CLIENT
MQTT
BROKER
PUBLISH QoS 1
PUBACK
“fire and
confirm”
1 (.. N)
PUBLISH "DUP"
Laurent Guérin - @ltguerin
MQTT – QoS level 2 (exactement une fois)
QoS 2 : "exactly-once"
 L’acheminement des messages est garanti et sans doublon
34
MQTT
CLIENT
MQTT
BROKER
PUBLISH QoS 2
PUBREC
1
PUBREL
PUBCOMP
Niveau de qualité
le plus élevé
=> plus d’échanges
réseau
Laurent Guérin - @ltguerin
MQTT – « end to end » QoS
 La qualité de service globale pour 2 clients communicants via un broker
MQTT est déterminée par la combinaison des 2 QOS
 C’est le niveau le plus bas
qui détermine le niveau de
qualité globale
35
PUBLISHER BROKER SUBSCRIBER
Overall QoS = Min(X,Y)
QoS X QoS Y
QOS PUBLISH QOS SUBSCRIBE OVERALL QOS
0 2 0
1 2 1
2 1 1
2 2 2
Laurent Guérin - @ltguerin
MQTT – Exemple en Java
36
Par défaut :
QoS = 1
Exemple de « Publish » avec QoS = 2
Exemple de « Subscribe » avec QoS = 2
ou (sans objet MqttMessage) :
Laurent Guérin - @ltguerin
Session
37
Laurent Guérin - @ltguerin
MQTT – Par défaut : « non persistent session »
38
CLIENT
« PUB »
BROKER
mosquitto_pub
-h localhost
-t a/b/c
-m blabla
OK  Message reçu
CLIENT
« SUB »
mosquitto_sub
-h localhost
-t a/b/c
Avec un subscriber à l’écoute …
1
2
Laurent Guérin - @ltguerin
MQTT – Par défaut : « non persistent session »
39
CLIENT
« PUB »
BROKER
mosquitto_pub
-h localhost
-t a/b/c
-m blabla
Pas de subscriber connecté
au moment du “pub”
“MQTT is not a message queue by definition”
Sans aucun subscriber à l’écoute …
BROKER
CLIENT
« SUB »
mosquitto_sub
-h localhost
-t a/b/c
1
2
Rien  Message perdu !
Laurent Guérin - @ltguerin
MQTT – Session
40
CLIENT
BROKER
La session contient des états qui sont stockés côté client et côté serveur.
Par défaut la session est nettoyée entre chaque connexion.
Quand un client se connecte à un broker pour la première fois
une session MQTT est créée implicitement
SESSION
SESSION
SESSIONCLIENT
SESSION
Une session
identifie
l’attachement
d’un client à un
serveur.
CONNECT (ClientID1)
CONNECT (ClientID2)
ClientID1
ClientID2
Laurent Guérin - @ltguerin
MQTT – Session / Contenu
41
CLIENT BROKER
SESSION SESSION
• Messages QoS 1 et QoS 2
envoyés au serveur et qui n’ont pas encore
reçu l’acquitement
• Messages QoS 2 reçus du serveur, mais
qui n’ont pas été complètement acquittés
• Messages QoS 1 et QoS 2
envoyés au client et qui n’ont pas encore
reçu l’acquitement
• Les messages QoS 2 reçus du client, mais
qui n'ont pas été complètement acquittés
• Les souscriptions du client (topics)
• Messages QoS 1 et QoS 2 en attente de
transmission au client (et optionnellement
les messages QoS 0 )
Les informations des sessions peuvent
être stockées sur le filesystem.
Notion de « persistent datastores »
Ex : fichier mosquitto.dbEx : fichier {client-id}/.lck
Laurent Guérin - @ltguerin
MQTT – Session & « clean session »
42
Par défaut la session est nettoyée à chaque connexion
Le flag « clean session » permet de déterminer le type de connexion :
• True : « non persistent session » (par défaut)
• False : « persistent session »
mosquitto_sub -h localhost -t a/b/# -q 2 -i ID1 -c -c :
disable clean session
“Do not clean”
Laurent Guérin - @ltguerin
MQTT – « persistent session »
43
CLIENT
« PUB »
BROKER
-q 2 : QoS 2
-i : id client
-c : disable clean session (cleanSession = false)
Subscribe avec demande de "persistent session"
BROKER
CLIENT
« SUB »
mosquitto_sub
-h localhost
-t a/b/#
-q 2
-i ID001
-c
1
2
mosquitto_pub
-h localhost
-t a/b/c
-q 2 -m blabla
BROKER
CLIENT
« SUB »
mosquitto_sub
-h localhost
-t a/b/#
-q 2
-i ID001
-c
3
Session
Session
Session
clean session = false
Laurent Guérin - @ltguerin
Cas d'utilisation
44
Laurent Guérin - @ltguerin
Sensors  Mosquitto  Outils de monitoring
45
MQTT consumer
[[inputs.mqtt_consumer]]
servers = ["mosquitto:1883"]
qos = 0
topics = [ "device/a" ]
data_format = "value"
data_type = "float"
mqtt_blackbox_exporter
PUB
SUB
SUB
Laurent Guérin - @ltguerin
Démo : Appli Java  Broker  Smartphones
46
tcp://test.mosquitto.org:1883
PUB
SUB
Topics :
jug/nantes/txt
 Message texte
jug/nantes/num
 Numérique (entier)
Application
Laurent Guérin - @ltguerin
App Android – Config MQTT Dash
MQTT Dash
47
« jug/nantes/txt »
 Message texte
« jug/nantes/num »
 Numérique (entier)
Laurent Guérin - @ltguerin
Questions ?
48

Contenu connexe

Similaire à MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018

Presto standard OW2 Conference-nov10
Presto standard OW2 Conference-nov10Presto standard OW2 Conference-nov10
Presto standard OW2 Conference-nov10
OW2
 
05 02 surveillance et analyse de traffic tcpip
05 02 surveillance et analyse de traffic tcpip05 02 surveillance et analyse de traffic tcpip
05 02 surveillance et analyse de traffic tcpip
Noël
 
Workshop IoT Hub : Pilotez une ampoule connectée
Workshop IoT Hub : Pilotez une ampoule connectéeWorkshop IoT Hub : Pilotez une ampoule connectée
Workshop IoT Hub : Pilotez une ampoule connectée
Scaleway
 
Architecture hétérogène au service de l'IoT industriel ?
Architecture hétérogène au service de l'IoT industriel ?Architecture hétérogène au service de l'IoT industriel ?
Architecture hétérogène au service de l'IoT industriel ?
Pierre-jean Texier
 
Liaison modbus wago_atv_31
Liaison modbus wago_atv_31Liaison modbus wago_atv_31
Liaison modbus wago_atv_31
Moha Belkaid
 

Similaire à MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018 (20)

Une introduction à MapReduce
Une introduction à MapReduceUne introduction à MapReduce
Une introduction à MapReduce
 
Rapport application chat
Rapport application chatRapport application chat
Rapport application chat
 
Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache Pulsar
 
Qt5 embedded
Qt5 embeddedQt5 embedded
Qt5 embedded
 
Présentation devops&puppet 04112014
Présentation devops&puppet 04112014 Présentation devops&puppet 04112014
Présentation devops&puppet 04112014
 
Virtual Private Network Virtual Private Network
Virtual Private Network Virtual Private NetworkVirtual Private Network Virtual Private Network
Virtual Private Network Virtual Private Network
 
Réseau de capteurs sans fil
Réseau de capteurs sans fil  Réseau de capteurs sans fil
Réseau de capteurs sans fil
 
Introduction à Apache Pulsar
 Introduction à Apache Pulsar Introduction à Apache Pulsar
Introduction à Apache Pulsar
 
Développement d'un client MQTT sur Raspberry Pi
Développement d'un client MQTT sur Raspberry PiDéveloppement d'un client MQTT sur Raspberry Pi
Développement d'un client MQTT sur Raspberry Pi
 
Vpn
VpnVpn
Vpn
 
Presto standard OW2 Conference-nov10
Presto standard OW2 Conference-nov10Presto standard OW2 Conference-nov10
Presto standard OW2 Conference-nov10
 
Creation de cluster (Master et deux slave ) nfs, htcondor, mpi
Creation de cluster (Master et deux slave ) nfs, htcondor, mpiCreation de cluster (Master et deux slave ) nfs, htcondor, mpi
Creation de cluster (Master et deux slave ) nfs, htcondor, mpi
 
05 02 surveillance et analyse de traffic tcpip
05 02 surveillance et analyse de traffic tcpip05 02 surveillance et analyse de traffic tcpip
05 02 surveillance et analyse de traffic tcpip
 
Workshop IoT Hub : Pilotez une ampoule connectée
Workshop IoT Hub : Pilotez une ampoule connectéeWorkshop IoT Hub : Pilotez une ampoule connectée
Workshop IoT Hub : Pilotez une ampoule connectée
 
Socket tcp ip client server on langace c
Socket tcp ip client server on langace c Socket tcp ip client server on langace c
Socket tcp ip client server on langace c
 
Presentation final
Presentation finalPresentation final
Presentation final
 
Architecture hétérogène au service de l'IoT industriel ?
Architecture hétérogène au service de l'IoT industriel ?Architecture hétérogène au service de l'IoT industriel ?
Architecture hétérogène au service de l'IoT industriel ?
 
Liaison modbus wago_atv_31
Liaison modbus wago_atv_31Liaison modbus wago_atv_31
Liaison modbus wago_atv_31
 
Annex
AnnexAnnex
Annex
 
Apache kafka big data track
Apache kafka   big data trackApache kafka   big data track
Apache kafka big data track
 

Plus de Laurent Guérin

Plus de Laurent Guérin (13)

Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022
 
My web application in 20 minutes with Telosys
My web application in 20 minutes with Telosys My web application in 20 minutes with Telosys
My web application in 20 minutes with Telosys
 
Telosys project booster Paris Open Source Summit 2019
Telosys project booster Paris Open Source Summit 2019Telosys project booster Paris Open Source Summit 2019
Telosys project booster Paris Open Source Summit 2019
 
Telosys tutorial - Code generation for a Python web application based on Bott...
Telosys tutorial - Code generation for a Python web application based on Bott...Telosys tutorial - Code generation for a Python web application based on Bott...
Telosys tutorial - Code generation for a Python web application based on Bott...
 
Meetup python-bottle-telosys-2018-lgu-v1.0
Meetup python-bottle-telosys-2018-lgu-v1.0Meetup python-bottle-telosys-2018-lgu-v1.0
Meetup python-bottle-telosys-2018-lgu-v1.0
 
Sogeti labs developer-today-v1.1
Sogeti labs developer-today-v1.1Sogeti labs developer-today-v1.1
Sogeti labs developer-today-v1.1
 
DevOps MeetUp NL - Docker (Oct 2014)
DevOps MeetUp NL - Docker (Oct 2014)DevOps MeetUp NL - Docker (Oct 2014)
DevOps MeetUp NL - Docker (Oct 2014)
 
Telosys tools jug-nantes-2014-v1.2
Telosys tools jug-nantes-2014-v1.2Telosys tools jug-nantes-2014-v1.2
Telosys tools jug-nantes-2014-v1.2
 
Bean Validation - Cours v 1.1
Bean Validation - Cours v 1.1Bean Validation - Cours v 1.1
Bean Validation - Cours v 1.1
 
Genie logiciel eseo-v1.1-1spp
Genie logiciel eseo-v1.1-1sppGenie logiciel eseo-v1.1-1spp
Genie logiciel eseo-v1.1-1spp
 
Devoxx 2011 - Scaffolding with Telosys
Devoxx 2011 - Scaffolding with TelosysDevoxx 2011 - Scaffolding with Telosys
Devoxx 2011 - Scaffolding with Telosys
 
Open World Forum 2009 Migration With Telosys
Open World Forum 2009 Migration With TelosysOpen World Forum 2009 Migration With Telosys
Open World Forum 2009 Migration With Telosys
 
Solutions Linux Développement Rapide Java
Solutions Linux Développement Rapide JavaSolutions Linux Développement Rapide Java
Solutions Linux Développement Rapide Java
 

MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018

  • 1. MQTT Mosquitto & Paho Laurent Guérin Nantes JUG - 20 Novembre 2018
  • 2. Laurent Guérin - @ltguerin Who's speaking ? 2 Laurent Guérin @ltguerin l-gu https://github.com/lgu-lab https://github.com/telosys-tools-bricks https://github.com/telosys-templates-v3 https://github.com/telosys-eclipse-v3 Consultant / Architecte Sogeti Labs Fellow Project leader (open source code generator)
  • 3. Laurent Guérin - @ltguerin Préambule : installer un client MQTT / smartphone 3 MQTT Dash MQTTool
  • 4. Laurent Guérin - @ltguerin MQTT en bref 4
  • 5. Laurent Guérin - @ltguerin MQTT 5 MQTT 3.1 MQTT 3.1.1 Protocole de transport « léger » conçu pour des échanges de type « M2M » (Machine to Machine) et donc « IoT » https://mqtt.org/ https://www.oasis-open.org/committees/mqtt IBM Andy Stanford-Clark EUROTECH Arlen Nipper MQTT = MQ (Message Queuing) Telemetry Transport
  • 6. Laurent Guérin - @ltguerin MQTT – TCP/IP 6 TCP/IP stack MQTT Ethernet Hardware Application Encryption MQTT Ethernet Hardware Application TCP/IP stack SSL / TLS MQTT est basé sur la stack TCP/IP ( pour la sécurité : MQTT over TLS ) tcp://host:1883 ssl://host:8883
  • 7. Laurent Guérin - @ltguerin MQTT – Cas d’utilisation 7 “MQTT is designed to use bandwidth and batteries sparingly” IoT Event Bus Messaging Chat M2M
  • 8. Laurent Guérin - @ltguerin MQTT – Messages 8 Message payload : un simple tableau d’octets (texte, binaire, etc ) Le header MQTT se résume généralement à 2 octets Message max size : 256 MB
  • 9. Laurent Guérin - @ltguerin MQTT – Pattern « Publish/Subscribe » 9 BROKER MQTT PUB SUB SUB SUB Publishing clients Receiving clients
  • 10. Laurent Guérin - @ltguerin MQTT – Publish/Subscribe = Découplage 10 PUBLISHER BROKER SUBSCRIBER PUB SUB L’un ne sait pas que l’autre existe (et réciproquement) Temps Découplage dans l’espace + Découplage dans le temps
  • 11. Laurent Guérin - @ltguerin Broker MQTT 11
  • 12. Laurent Guérin - @ltguerin Mosquitto le broker de référence  Mosquitto : broker MQTT de la fondation Eclipse  écrit en C (258 kb)  https://mosquitto.org/ 12 https://iot.eclipse.org/
  • 13. Laurent Guérin - @ltguerin Autres brokers MQTT Quelques brokers MQTT :  Moquette : broker écrit en Java (fondation Eclipse)  HiveMQ : "enterprise MQTT broker" https://www.hivemq.com/  VerneMQ : "high-performance, distributed MQTT broker" https://vernemq.com/  EMQ : broker écrit en Erlang http://emqtt.io/  CloudMQTT : comme son nom l’indique… https://www.cloudmqtt.com/ Brokers « MQ classiques » supportant le protocole MQTT :  ActiveMQ : http://activemq.apache.org/mqtt.html  RabbitMQ : MQTT Adapter https://www.rabbitmq.com/mqtt.html (MQTT as of 3.0 / currently targeting version 3.1.1 of the spec). 13 cf MQTT implementations : https://en.wikipedia.org/wiki/Comparison_of_MQTT_Implementations
  • 14. Laurent Guérin - @ltguerin Les brokers MQTT sont partout 14 Raspberry Pi Smartphone Cloud Laptop Server
  • 15. Laurent Guérin - @ltguerin Client MQTT 15
  • 16. Laurent Guérin - @ltguerin MQTT – Clients prêts à l’emploi 16 Extension pour Chrome MQTT.fx Ligne de commande : Apps pour Android & iOS etc... BROKER
  • 17. Laurent Guérin - @ltguerin MQTT – Développer un client 17 https://www.eclipse.org/paho/ "Eclipse Paho project provides open-source client implementations of MQTT" <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.0</version> </dependency> Java / pom.xml : Librairie pour Java SE 1.7 et +
  • 18. Laurent Guérin - @ltguerin MQTT – Développer un client 18 Avec Paho/Java le client MQTT est représenté par la classe « MqttClient » Principales méthodes : • connect • disconnect • reconnect • close • publish • subscribe • unsubscribe Les erreurs sont gérées via l’exception « MqttException »
  • 19. Laurent Guérin - @ltguerin MQTT – Connexion d’un client 19  Un client se connecte à un broker MQTT au niveau « TCP »  Informations nécessaires pour se connecter  le hostname  le port ( par défaut 1883 )  un client-id (identifiant unique)  Il peut également spécifier des options lors de la connexion CLIENT BROKER tcp://localhost:1883 1 - Connexion 2 - Dialogue 3 - Déconnexion Client-Id
  • 20. Laurent Guérin - @ltguerin MQTT – Exemple avec MQTT.fx 20
  • 21. Laurent Guérin - @ltguerin MQTT – Exemple en Java 21 NB : « connect » crée un pool de threads. Les threads restent actifs jusqu’au « close » (les threads sont encore actifs même après « disconnect » )
  • 22. Laurent Guérin - @ltguerin MQTT – Clients 22  Classiquement 2 types de clients : Publisher & Subscriber  Techniquement un client MQTT n’est pas spécialisé, un même client peut faire à la fois du Publish et du Subcribe CLIENT 1 BROKER CLIENT 2 Publie un « message » Souscrit pour recevoir des messages CLIENT 1 BROKER CLIENT 2 PUB SUB PUB PUB SUB
  • 23. Laurent Guérin - @ltguerin Topic 23
  • 24. Laurent Guérin - @ltguerin MQTT – Clients & topics 24  Tous les messages envoyés sont associés à un « topic »  Techniquement un « topic » identifie un canal (une file de messages)  L’utilisation des « topics » permet de définir une sémantique CLIENT « PUB » BROKER CLIENT « SUB » Publie un message associé à un topic Souscrit pour recevoir les messages d’un topic ou de plusieurs topics pub(topic,data) sub(topic) Publie le message à tous les clients abonnés au topic pub topic
  • 25. Laurent Guérin - @ltguerin MQTT – Topics 25  Un « topic » peut être vu comme un canal de communication entre 1 « publisher » et N « subscribers »  La création des « topics » est implicite, dès qu’un « publisher » émet un message sur un nouveau « topic » il est automatiquement créé dans le « broker »
  • 26. Laurent Guérin - @ltguerin MQTT – Structure des topics 26  Un topic est identifié par une chaine de caractères UTF-8 (au moins 1 caractère, espaces autorisés)  Longueur max : 65535 bytes (64 kb – 1) ( UTF-8 : 1 character can require up to 4 bytes to encode )  Les topics sont organisés selon une structure arborescente  Un nom de topic est composé de 1 à N niveaux séparés par un « / »  Exemples : Les noms de topics commençant par « $ » sont réservés pour les statistiques internes du broker. Exemples : $SYS/broker/clients/connected $SYS/broker/uptime jug/france/nantes home/groundfloor/livingroom/temperature building floor-1 floor-2 room-1 room-2 templight
  • 27. Laurent Guérin - @ltguerin MQTT – Topics wildcards 27  Les subcribers sont généralement intéressés par plusieurs topics  Plutôt que de s’abonner spécifiquement à chaque topic il est possible d’utiliser des « wildcards » :  « + » : single level wildcard  « # » : multi level wildcard  Exemples : home/groundfloor/livingroom/temperature home/groundfloor/+/temperature home/groundfloor/# home/groundfloor/+/+ home/groundfloor/livingroom/temperature home/groundfloor/kitchen/temperature home/groundfloor/livingroom/temperature home/groundfloor/livingroom/brightness home/groundfloor/kitchen/temperature home/groundfloor/kitchen/ brightness
  • 28. Laurent Guérin - @ltguerin MQTT – Publisher Java 28 CLIENT « PUB » BROKER CLIENT « SUB » 1 2 pub(topic,msg) sub(topic)
  • 29. Laurent Guérin - @ltguerin MQTT – Subscriber Java 29 CLIENT « PUB » BROKER CLIENT « SUB » 1 2 sub(topic) pub(topic,msg)
  • 30. Laurent Guérin - @ltguerin Quality of Service « QoS » 30
  • 31. Laurent Guérin - @ltguerin MQTT – Quality of Service : « QoS »  MQTT propose 3 niveaux de qualité de service pour les échanges entre un client et un broker MQTT :  QoS level 2  QoS level 1  QoS level 0 31 C’est le client qui choisit le niveau de QoS QoS = 0/1/2 CLIENT BROKER CLIENTCLIENT CLIENT QoS QoS QoS QoS + -
  • 32. Laurent Guérin - @ltguerin MQTT – QoS level 0 (au plus une fois) QoS 0 : "at-most-once"  En mode « best effort », les messages sont remis en fonction des capacités du réseau (TCP/IP).  L’acheminement des messages n’est pas garanti. 32 “fire and forget” 0 .. 1 MQTT CLIENT MQTT BROKER PUBLISH QoS 0 (pas de retour)
  • 33. Laurent Guérin - @ltguerin MQTT – QoS level 1 (au moins une fois) QoS 1 : "at-least-once"  L’acheminement des messages est garanti au moins une fois (il peut y avoir des doublons)  L’émetteur conserve le message et le republie (avec le flag « DUP ») jusqu’à ce qu’il reçoive l’accusé de réception (« PUBACK » packet) 33 MQTT CLIENT MQTT BROKER PUBLISH QoS 1 PUBACK “fire and confirm” 1 (.. N) PUBLISH "DUP"
  • 34. Laurent Guérin - @ltguerin MQTT – QoS level 2 (exactement une fois) QoS 2 : "exactly-once"  L’acheminement des messages est garanti et sans doublon 34 MQTT CLIENT MQTT BROKER PUBLISH QoS 2 PUBREC 1 PUBREL PUBCOMP Niveau de qualité le plus élevé => plus d’échanges réseau
  • 35. Laurent Guérin - @ltguerin MQTT – « end to end » QoS  La qualité de service globale pour 2 clients communicants via un broker MQTT est déterminée par la combinaison des 2 QOS  C’est le niveau le plus bas qui détermine le niveau de qualité globale 35 PUBLISHER BROKER SUBSCRIBER Overall QoS = Min(X,Y) QoS X QoS Y QOS PUBLISH QOS SUBSCRIBE OVERALL QOS 0 2 0 1 2 1 2 1 1 2 2 2
  • 36. Laurent Guérin - @ltguerin MQTT – Exemple en Java 36 Par défaut : QoS = 1 Exemple de « Publish » avec QoS = 2 Exemple de « Subscribe » avec QoS = 2 ou (sans objet MqttMessage) :
  • 37. Laurent Guérin - @ltguerin Session 37
  • 38. Laurent Guérin - @ltguerin MQTT – Par défaut : « non persistent session » 38 CLIENT « PUB » BROKER mosquitto_pub -h localhost -t a/b/c -m blabla OK  Message reçu CLIENT « SUB » mosquitto_sub -h localhost -t a/b/c Avec un subscriber à l’écoute … 1 2
  • 39. Laurent Guérin - @ltguerin MQTT – Par défaut : « non persistent session » 39 CLIENT « PUB » BROKER mosquitto_pub -h localhost -t a/b/c -m blabla Pas de subscriber connecté au moment du “pub” “MQTT is not a message queue by definition” Sans aucun subscriber à l’écoute … BROKER CLIENT « SUB » mosquitto_sub -h localhost -t a/b/c 1 2 Rien  Message perdu !
  • 40. Laurent Guérin - @ltguerin MQTT – Session 40 CLIENT BROKER La session contient des états qui sont stockés côté client et côté serveur. Par défaut la session est nettoyée entre chaque connexion. Quand un client se connecte à un broker pour la première fois une session MQTT est créée implicitement SESSION SESSION SESSIONCLIENT SESSION Une session identifie l’attachement d’un client à un serveur. CONNECT (ClientID1) CONNECT (ClientID2) ClientID1 ClientID2
  • 41. Laurent Guérin - @ltguerin MQTT – Session / Contenu 41 CLIENT BROKER SESSION SESSION • Messages QoS 1 et QoS 2 envoyés au serveur et qui n’ont pas encore reçu l’acquitement • Messages QoS 2 reçus du serveur, mais qui n’ont pas été complètement acquittés • Messages QoS 1 et QoS 2 envoyés au client et qui n’ont pas encore reçu l’acquitement • Les messages QoS 2 reçus du client, mais qui n'ont pas été complètement acquittés • Les souscriptions du client (topics) • Messages QoS 1 et QoS 2 en attente de transmission au client (et optionnellement les messages QoS 0 ) Les informations des sessions peuvent être stockées sur le filesystem. Notion de « persistent datastores » Ex : fichier mosquitto.dbEx : fichier {client-id}/.lck
  • 42. Laurent Guérin - @ltguerin MQTT – Session & « clean session » 42 Par défaut la session est nettoyée à chaque connexion Le flag « clean session » permet de déterminer le type de connexion : • True : « non persistent session » (par défaut) • False : « persistent session » mosquitto_sub -h localhost -t a/b/# -q 2 -i ID1 -c -c : disable clean session “Do not clean”
  • 43. Laurent Guérin - @ltguerin MQTT – « persistent session » 43 CLIENT « PUB » BROKER -q 2 : QoS 2 -i : id client -c : disable clean session (cleanSession = false) Subscribe avec demande de "persistent session" BROKER CLIENT « SUB » mosquitto_sub -h localhost -t a/b/# -q 2 -i ID001 -c 1 2 mosquitto_pub -h localhost -t a/b/c -q 2 -m blabla BROKER CLIENT « SUB » mosquitto_sub -h localhost -t a/b/# -q 2 -i ID001 -c 3 Session Session Session clean session = false
  • 44. Laurent Guérin - @ltguerin Cas d'utilisation 44
  • 45. Laurent Guérin - @ltguerin Sensors  Mosquitto  Outils de monitoring 45 MQTT consumer [[inputs.mqtt_consumer]] servers = ["mosquitto:1883"] qos = 0 topics = [ "device/a" ] data_format = "value" data_type = "float" mqtt_blackbox_exporter PUB SUB SUB
  • 46. Laurent Guérin - @ltguerin Démo : Appli Java  Broker  Smartphones 46 tcp://test.mosquitto.org:1883 PUB SUB Topics : jug/nantes/txt  Message texte jug/nantes/num  Numérique (entier) Application
  • 47. Laurent Guérin - @ltguerin App Android – Config MQTT Dash MQTT Dash 47 « jug/nantes/txt »  Message texte « jug/nantes/num »  Numérique (entier)
  • 48. Laurent Guérin - @ltguerin Questions ? 48