SlideShare une entreprise Scribd logo
1  sur  14
Télécharger pour lire hors ligne
Présentation Chiheb Ameur ABID 63/ 77
Développer un client MQTT sur RPI
Plan
1 Introduction à l’Internet des Objets
2 Architectures IOT
3 Réseaux et détections de proximité
4 Le réseau LPWAN
5 Mise en place d’une application IOT
6 Développer un client MQTT sur RPI
Présentation Chiheb Ameur ABID 64/ 77
Développer un client MQTT sur RPI
Objectif
Architecture générale d’une solution IOT
Présentation Chiheb Ameur ABID 65/ 77
Développer un client MQTT sur RPI
Présentation du projet Paho MQTT
Paho MQTT en bref
å Projet opensource développé par la fondation Eclipse
å Bibliothèque client Paho MQTT qui implémente les versions 3.1, 3.1.1.1 et 5.0 du
protocole MQTT
å API fournit en C, C ++, Java, Javascript, Python, Go, C#
å Site officiel : http://www.eclipse.org/paho
å Documentation C++ :
https://www.eclipse.org/paho/files/cppdoc/index.html
Présentation Chiheb Ameur ABID 66/ 77
Développer un client MQTT sur RPI
Installation de la bibliothèque Paho MQTT C++
Installation de la bibliothèque Paho MQTT C++ sur RPI
å Compilation et installation depuis le code source
å Elle nécessite la compilation et l’installation de la bibliothèque de Paho C version 3.1.8
ou supérieure
å Installer les paquets de dépendances
Z Outils de compilation : build-essential gcc make cmake
Z Utilisation de SSL : libssl-dev
Z Construction de la documentation : doxygen
Compilation et installation de la bibliothèque Paho MQTT C
å Télécharger le code source
git clone https://github.com/eclipse/paho.mqtt.c ; cd
paho.mqtt.c
å Compilation avec cmake
cmake -Bbuild -H. -DPAHO_ENABLE_TESTING=OFF
-DPAHO_BUILD_STATIC=ON -DPAHO_WITH_SSL=ON
-DPAHO_HIGH_PERFORMANCE=ON
å Installation
sudo cmake --build build/ --target install
sudo ldconfig
Présentation Chiheb Ameur ABID 67/ 77
Développer un client MQTT sur RPI
Installation de la bibliothèque Paho MQTT C++
Compilation et installation de la bibliothèque Paho MQTT C++
å Télécharger le code source
git clone https://github.com/eclipse/paho.mqtt.cpp
cd paho.mqtt.cpp
å Compilation avec cmake
cmake -Bbuild -H. -DPAHO_BUILD_STATIC=ON
-DPAHO_BUILD_DOCUMENTATION=TRUE -DPAHO_BUILD_SAMPLES=TRUE
å Installation
sudo cmake --build build/ --target install
sudo ldconfig
Présentation Chiheb Ameur ABID 68/ 77
Développer un client MQTT sur RPI
Utilisation de la Bibliothèque Paho MQTT
Connexion : la classe mqtt::async_client
å #include <async_client.h>
å La classe mqtt::async_client permet de communiquer avec un broker en utilisant
des méthodes non bloquantes
å Constructeur async_client (const string &serverURI, const string
&clientId, iclient_persistence *persistence=nullptr)
Z serverURI : spécifie l’adresse et le port du broker
Z clienId : une chaine choisie pour identifier le client
å La méthode token_ptr connect() permet d’établir la connexion. Elle renvoie un
pointeur sur un jeton permettant de surveiller l’état de la connexion
å La méthode token_ptr disconnect() permet de se déconnecter
å La méthode bool is_connected() indique si une connexion est bien établie
Présentation Chiheb Ameur ABID 69/ 77
Développer un client MQTT sur RPI
Utilisation de la Bibliothèque Paho MQTT
Connexion : la classe mqtt::token
å #include <token.h>
å La classe mqtt::token fournit un mécanisme pour surveiller les actions asynchrones
å La méthode wait() permet de bloquer la tâche courante jusqu’à que l’action associée au
jeton soit terminée
å La méthode connect_response get_connect_response() const renvoie la
réponse de l’opération de connexion. Si l’opération n’est pas encore terminée, la tâche en
cours se bloquera jusqu’à ce que le résultat soit disponible.
Connexion : la classe mqtt::connect_response
å #include <server_response.h>
å Elle fournit des informations sur une connexion établie
å Vérifier si une session existait déjà pour un client sur le serveur : le serveur a une session
persistante stockée pour le client, étant donné l’identifiant du client spécifié dans le
message de connexion.
bool mqtt::connect_response::is_session_present () const
å Renvoyer la version MQTT utilisée pour la connexion
int mqtt::connect_response::get_mqtt_version() const
Présentation Chiheb Ameur ABID 70/ 77
Développer un client MQTT sur RPI
Utilisation de la Bibliothèque Paho MQTT
Exemple : connexion à un broker
const std::string SERVER_ADDRESS("tcp://localhost:1883");
const std::string CLIENT_ID("paho_cpp_async_subcribe");
mqtt::async_client cli(SERVER_ADDRESS, CLIENT_ID);
try {
// Connect to the server
cout << "Connecting to the MQTT server..." << flush;
cli.connect()->wait();
} catch(const mqtt::exception &exc) {
cerr << "n " << exc << endl;
return 1;
}
...
try {
std::cout << "nDisconnecting from the MQTT server..." << std::flush;
cli.disconnect()->wait();
std::cout << "OK" << std::endl;
}
catch (const mqtt::exception& exc) {
std::cerr << exc << std::endl;
return 1;
}
Présentation Chiheb Ameur ABID 71/ 77
Développer un client MQTT sur RPI
Utilisation de la Bibliothèque Paho MQTT
Inscription à un sujet
å Pour récevoir les messages d’un sujet, il faut d’abord s’inscrire
token_ptr mqtt::async_client::subscribe(const string &topicFilter,int qos,const
subscribe_options &opts=subscribe_options(),const properties &props=properties())
Z topicFilter : le sujet avec la possibilité d’inclure des jokers
Z qos : le degré de la qualité du service
Z opts : des options d’inscription avec MQTT v5
Z props : les propriétés de MQTT v5
å Se désinscrire d’un sujet
token_ptr mqtt::async_client::unsubscribe(const string &topicFilter,const properties &props=
properties())
Z topicFilter : le sujet avec la possibilité d’inclure des jokers
Z props : les propriétés de MQTT v5
Présentation Chiheb Ameur ABID 72/ 77
Développer un client MQTT sur RPI
Utilisation de la Bibliothèque Paho MQTT
Démarrer la réception des messages
å Démarrer la réception asynchrone des messages et les stocker dans une file
void mqtt::async_client::start_consuming()
å Arrêter la réception des messages et ignorer tout message non lu
void mqtt::async_client::stop_consuming()
Présentation Chiheb Ameur ABID 73/ 77
Développer un client MQTT sur RPI
Utilisation de la Bibliothèque Paho MQTT
Lecture des messages
å La lecture bloquante des messages se fait à partir d’une file
const_message_ptr mqtt::async_client::consume_message()
Z const_message_ptr : un pointeur sur l’objet encapsulant le message. Si
nullptr : échec de lecture
å Lecture non bloquante
bool mqtt::async_client::try_consume_message(const_message_ptr * msg)
La classe message
å Récupérer le nom du sujet d’un message reçu
const string& mqtt::message::get_topic() const
å Renvoyer sous forme d’une chaine de caractère la charge utile d’un message reçu
string mqtt::message::to_string() const
Présentation Chiheb Ameur ABID 74/ 77
Développer un client MQTT sur RPI
Utilisation de la Bibliothèque Paho MQTT
Exemple : Réception asynchrone et lecture synchrone des messages
const string SERVER_ADDRESS { "tcp://localhost:1883" };
const string CLIENT_ID { "paho_cpp_async_consume" };
const string TOPIC { "#" };
const int QOS = 1;
int main(int argc, char* argv[]) {
mqtt::async_client cli(SERVER_ADDRESS, CLIENT_ID);
try { // Start consumer before connecting to make sure to not miss messages
cli.start_consuming();
auto rsp = cli.connect()->get_connect_response();
// If there is no session present, then we need to subscribe, but if
// there is a session, then the server remembers us and our subscriptions.
if (!rsp.is_session_present()) cli.subscribe(TOPIC, QOS)->wait();
while (true) { // Loop to consume read messages
auto msg = cli.consume_message();
if (!msg) break;
cout << msg->get_topic() << ": " << msg->to_string() << endl;
}
if (cli.is_connected()) {
cli.unsubscribe(TOPIC)->wait();
cli.stop_consuming();
cli.disconnect()->wait();
}
else cout << "nClient was disconnected" << endl;
}
catch (const mqtt::exception& exc) {
cerr << "n " << exc << endl;
return 1;
}
return 0;
}
Présentation Chiheb Ameur ABID 75/ 77
Développer un client MQTT sur RPI
Utilisation de la Bibliothèque Paho MQTT
Envoie de messages
å Il faut créer une instance de la classe message pour le message à envoyer
message_ptr mqtt::make_message(string_ref topic,binary_ref payload)
message_ptr mqtt::make_message(string_ref topic,const void *payload,size_t len)
Z topic : le sujet
Z payload : la charge utile du message
Z len : taille de message en nombre d’octets
å Se désinscrire d’un sujet
delivery_token_ptr mqtt::async_client::publish(string_ref topic, binary_ref payload)
delivery_token_ptr mqtt::async_client::publish(string_ref topic, binary_ref payload,int qos,bool
retained)
Z topicFilter : le sujet avec la possibilité d’inclure des jokers
Z props : les propriétés de MQTT v5
Présentation Chiheb Ameur ABID 76/ 77
Développer un client MQTT sur RPI
Utilisation de la Bibliothèque Paho MQTT
Exemple : Réception asynchrone et lecture synchrone des messages
const string SERVER_ADDRESS {"tcp://localhost:1883"};
const string CLIENT_ID {"paho_cpp_async_publish"};
const string TOPIC { "hello" };
const char* PAYLOAD1 = "Hello World!";
const char* PAYLOAD2 = "Hi there!";
const int QOS=1;
const auto TIMEOUT = std::chrono::seconds(10);
int main(int argc, char* argv[])
{
mqtt::async_client client(SERVER_ADDRESS, CLIENT_ID);
try {
client.connect()->wait();
mqtt::message_ptr pubmsg = mqtt::make_message(TOPIC, PAYLOAD1);
pubmsg->set_qos(QOS);
client.publish(pubmsg)->wait_for(TIMEOUT);
cout << "First message was sent..." << endl;
// Now try with itemized publish
mqtt::delivery_token_ptr pubtok;
pubtok = client.publish(TOPIC, PAYLOAD2, strlen(PAYLOAD2), QOS, false);
cout << " ...with token: " << pubtok->get_message_id() << endl;
cout << " ...for message with " << pubtok->get_message()->get_payload().size()<< " bytes" <<
endl;
pubtok->wait_for(TIMEOUT);
client.disconnect()->wait();
cout << "nDisconnected" << endl;
}
catch (const mqtt::exception& exc) {
cerr << exc.what() << endl;
return 1;
}
return 0;
}

Contenu connexe

Tendances

Implementation d'un portail captif cas de pfsense produit par bamba bamoussa
Implementation d'un portail captif  cas de pfsense produit par bamba bamoussa Implementation d'un portail captif  cas de pfsense produit par bamba bamoussa
Implementation d'un portail captif cas de pfsense produit par bamba bamoussa Bamoussa Bamba
 
Voix et téléphonie sur IP- Convergence voix et données
Voix et téléphonie sur IP- Convergence voix et données Voix et téléphonie sur IP- Convergence voix et données
Voix et téléphonie sur IP- Convergence voix et données Aymen Bouzid
 
Mise en place de la telephonie ip avec Asterisk
Mise en place de la telephonie ip avec AsteriskMise en place de la telephonie ip avec Asterisk
Mise en place de la telephonie ip avec AsteriskPape Moussa SONKO
 
Gateway d’un système de monitoring
Gateway d’un système de monitoringGateway d’un système de monitoring
Gateway d’un système de monitoringGhassen Chaieb
 
Reseaux sans fil_fev2009-2010-00112-01-e
Reseaux sans fil_fev2009-2010-00112-01-eReseaux sans fil_fev2009-2010-00112-01-e
Reseaux sans fil_fev2009-2010-00112-01-eGimélec
 
IP Multimedia Subsystem (IMS)
IP Multimedia Subsystem (IMS)IP Multimedia Subsystem (IMS)
IP Multimedia Subsystem (IMS)Papa Cheikh Cisse
 
Déploiement d'un serveur Asterisk
Déploiement d'un serveur Asterisk Déploiement d'un serveur Asterisk
Déploiement d'un serveur Asterisk ImnaTech
 
Description des réseaux 4G LTE
Description des réseaux 4G LTEDescription des réseaux 4G LTE
Description des réseaux 4G LTEOussama Hosni
 
Securisation de la VoIP sous Asterisk: solution avec Asterisk, OpenVPN et Ope...
Securisation de la VoIP sous Asterisk: solution avec Asterisk, OpenVPN et Ope...Securisation de la VoIP sous Asterisk: solution avec Asterisk, OpenVPN et Ope...
Securisation de la VoIP sous Asterisk: solution avec Asterisk, OpenVPN et Ope...Stephen Salama
 
Atelier configuration d une maquette voip
Atelier configuration d une maquette voip Atelier configuration d une maquette voip
Atelier configuration d une maquette voip sahar dridi
 
Architecture d'un réseau GSM 2G (Téléphonie Mobile)
Architecture d'un réseau GSM 2G (Téléphonie Mobile)Architecture d'un réseau GSM 2G (Téléphonie Mobile)
Architecture d'un réseau GSM 2G (Téléphonie Mobile)Assia Mounir
 

Tendances (20)

Implementation d'un portail captif cas de pfsense produit par bamba bamoussa
Implementation d'un portail captif  cas de pfsense produit par bamba bamoussa Implementation d'un portail captif  cas de pfsense produit par bamba bamoussa
Implementation d'un portail captif cas de pfsense produit par bamba bamoussa
 
CDMA
CDMACDMA
CDMA
 
Internet Of Things
Internet Of Things Internet Of Things
Internet Of Things
 
Voix et téléphonie sur IP- Convergence voix et données
Voix et téléphonie sur IP- Convergence voix et données Voix et téléphonie sur IP- Convergence voix et données
Voix et téléphonie sur IP- Convergence voix et données
 
Mise en place de la telephonie ip avec Asterisk
Mise en place de la telephonie ip avec AsteriskMise en place de la telephonie ip avec Asterisk
Mise en place de la telephonie ip avec Asterisk
 
VoIP
VoIPVoIP
VoIP
 
TELEPHONIE SUR IP
TELEPHONIE SUR IPTELEPHONIE SUR IP
TELEPHONIE SUR IP
 
Gateway d’un système de monitoring
Gateway d’un système de monitoringGateway d’un système de monitoring
Gateway d’un système de monitoring
 
Reseaux sans fil_fev2009-2010-00112-01-e
Reseaux sans fil_fev2009-2010-00112-01-eReseaux sans fil_fev2009-2010-00112-01-e
Reseaux sans fil_fev2009-2010-00112-01-e
 
IP Multimedia Subsystem (IMS)
IP Multimedia Subsystem (IMS)IP Multimedia Subsystem (IMS)
IP Multimedia Subsystem (IMS)
 
Rapport PFE VoIP
Rapport PFE VoIPRapport PFE VoIP
Rapport PFE VoIP
 
Sip
SipSip
Sip
 
Rapport de fin d'etude
Rapport  de fin d'etudeRapport  de fin d'etude
Rapport de fin d'etude
 
Déploiement d'un serveur Asterisk
Déploiement d'un serveur Asterisk Déploiement d'un serveur Asterisk
Déploiement d'un serveur Asterisk
 
Description des réseaux 4G LTE
Description des réseaux 4G LTEDescription des réseaux 4G LTE
Description des réseaux 4G LTE
 
FTTH
FTTHFTTH
FTTH
 
Securisation de la VoIP sous Asterisk: solution avec Asterisk, OpenVPN et Ope...
Securisation de la VoIP sous Asterisk: solution avec Asterisk, OpenVPN et Ope...Securisation de la VoIP sous Asterisk: solution avec Asterisk, OpenVPN et Ope...
Securisation de la VoIP sous Asterisk: solution avec Asterisk, OpenVPN et Ope...
 
Compte rendu
Compte renduCompte rendu
Compte rendu
 
Atelier configuration d une maquette voip
Atelier configuration d une maquette voip Atelier configuration d une maquette voip
Atelier configuration d une maquette voip
 
Architecture d'un réseau GSM 2G (Téléphonie Mobile)
Architecture d'un réseau GSM 2G (Téléphonie Mobile)Architecture d'un réseau GSM 2G (Téléphonie Mobile)
Architecture d'un réseau GSM 2G (Téléphonie Mobile)
 

Similaire à Développement d'un client MQTT sur Raspberry Pi

Rapport application chat
Rapport application chatRapport application chat
Rapport application chatTbatou sanae
 
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfRAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfSouf212
 
Messaging temps réel avec Go
Messaging temps réel avec GoMessaging temps réel avec Go
Messaging temps réel avec GoMickaël Rémond
 
Les socket ing1_issat
Les socket ing1_issatLes socket ing1_issat
Les socket ing1_issatsloumaallagui
 
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 mouad Lousimi
 
Réseau de capteurs sans fil
Réseau de capteurs sans fil  Réseau de capteurs sans fil
Réseau de capteurs sans fil Ghassen Chaieb
 
173544 introduction-aux-sockets
173544 introduction-aux-sockets173544 introduction-aux-sockets
173544 introduction-aux-socketsnaimanaima1
 
Parlez vous IoT - Présentation du protocole MQTT
Parlez vous IoT - Présentation du protocole MQTTParlez vous IoT - Présentation du protocole MQTT
Parlez vous IoT - Présentation du protocole MQTTArnaud Thorel
 
programmation réseau en java
programmation réseau en java programmation réseau en java
programmation réseau en java Ezéquiel Tsagué
 
Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache PulsarBruno Bonnin
 
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...sametmax
 

Similaire à Développement d'un client MQTT sur Raspberry Pi (20)

Rapport application chat
Rapport application chatRapport application chat
Rapport application chat
 
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfRAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
 
Chap7_JavaNet.pdf
Chap7_JavaNet.pdfChap7_JavaNet.pdf
Chap7_JavaNet.pdf
 
Messaging temps réel avec Go
Messaging temps réel avec GoMessaging temps réel avec Go
Messaging temps réel avec Go
 
Formation1 sockets
Formation1 socketsFormation1 sockets
Formation1 sockets
 
Les socket ing1_issat
Les socket ing1_issatLes socket ing1_issat
Les socket ing1_issat
 
Développement informatique : Programmation réseau
Développement informatique : Programmation réseauDéveloppement informatique : Programmation réseau
Développement informatique : Programmation réseau
 
8-socket.pdf
8-socket.pdf8-socket.pdf
8-socket.pdf
 
Chap7 java net
Chap7 java netChap7 java net
Chap7 java net
 
module_I6_Sockets.pdf
module_I6_Sockets.pdfmodule_I6_Sockets.pdf
module_I6_Sockets.pdf
 
Projet MQTT
Projet MQTTProjet MQTT
Projet MQTT
 
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
 
Réseau de capteurs sans fil
Réseau de capteurs sans fil  Réseau de capteurs sans fil
Réseau de capteurs sans fil
 
173544 introduction-aux-sockets
173544 introduction-aux-sockets173544 introduction-aux-sockets
173544 introduction-aux-sockets
 
Parlez vous IoT - Présentation du protocole MQTT
Parlez vous IoT - Présentation du protocole MQTTParlez vous IoT - Présentation du protocole MQTT
Parlez vous IoT - Présentation du protocole MQTT
 
Reseau
ReseauReseau
Reseau
 
programmation réseau en java
programmation réseau en java programmation réseau en java
programmation réseau en java
 
Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache Pulsar
 
Le Réseau et Java
Le Réseau et JavaLe Réseau et Java
Le Réseau et Java
 
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
 

Plus de Chiheb Ameur ABID

Mesure de température et humidité avec le capteur DHT11 et la Raspberry Pi 3
Mesure de température et humidité  avec le capteur DHT11 et la Raspberry Pi 3Mesure de température et humidité  avec le capteur DHT11 et la Raspberry Pi 3
Mesure de température et humidité avec le capteur DHT11 et la Raspberry Pi 3Chiheb Ameur ABID
 
Communication SPI avec la Raspberry Pi 3
Communication SPI avec la Raspberry Pi 3 Communication SPI avec la Raspberry Pi 3
Communication SPI avec la Raspberry Pi 3 Chiheb Ameur ABID
 
TDD (Développement dirigé par les tests) en Java avec JUnit 4 et JUnit 5
TDD (Développement dirigé par les tests) en Java avec JUnit 4 et JUnit 5TDD (Développement dirigé par les tests) en Java avec JUnit 4 et JUnit 5
TDD (Développement dirigé par les tests) en Java avec JUnit 4 et JUnit 5Chiheb Ameur ABID
 
Communication sur le bus i2c entre Raspberry PI et le capteur MCP9808 en C++
Communication sur le bus i2c entre Raspberry PI et le capteur MCP9808 en C++Communication sur le bus i2c entre Raspberry PI et le capteur MCP9808 en C++
Communication sur le bus i2c entre Raspberry PI et le capteur MCP9808 en C++Chiheb Ameur ABID
 
Configuration "from scratch" d'une distribution Linux sur Raspberry Pi
Configuration "from scratch" d'une distribution Linux sur Raspberry PiConfiguration "from scratch" d'une distribution Linux sur Raspberry Pi
Configuration "from scratch" d'une distribution Linux sur Raspberry PiChiheb Ameur ABID
 
Gestion des erreurs et des exceptions avec C++
Gestion des erreurs et des exceptions avec C++Gestion des erreurs et des exceptions avec C++
Gestion des erreurs et des exceptions avec C++Chiheb Ameur ABID
 

Plus de Chiheb Ameur ABID (6)

Mesure de température et humidité avec le capteur DHT11 et la Raspberry Pi 3
Mesure de température et humidité  avec le capteur DHT11 et la Raspberry Pi 3Mesure de température et humidité  avec le capteur DHT11 et la Raspberry Pi 3
Mesure de température et humidité avec le capteur DHT11 et la Raspberry Pi 3
 
Communication SPI avec la Raspberry Pi 3
Communication SPI avec la Raspberry Pi 3 Communication SPI avec la Raspberry Pi 3
Communication SPI avec la Raspberry Pi 3
 
TDD (Développement dirigé par les tests) en Java avec JUnit 4 et JUnit 5
TDD (Développement dirigé par les tests) en Java avec JUnit 4 et JUnit 5TDD (Développement dirigé par les tests) en Java avec JUnit 4 et JUnit 5
TDD (Développement dirigé par les tests) en Java avec JUnit 4 et JUnit 5
 
Communication sur le bus i2c entre Raspberry PI et le capteur MCP9808 en C++
Communication sur le bus i2c entre Raspberry PI et le capteur MCP9808 en C++Communication sur le bus i2c entre Raspberry PI et le capteur MCP9808 en C++
Communication sur le bus i2c entre Raspberry PI et le capteur MCP9808 en C++
 
Configuration "from scratch" d'une distribution Linux sur Raspberry Pi
Configuration "from scratch" d'une distribution Linux sur Raspberry PiConfiguration "from scratch" d'une distribution Linux sur Raspberry Pi
Configuration "from scratch" d'une distribution Linux sur Raspberry Pi
 
Gestion des erreurs et des exceptions avec C++
Gestion des erreurs et des exceptions avec C++Gestion des erreurs et des exceptions avec C++
Gestion des erreurs et des exceptions avec C++
 

Développement d'un client MQTT sur Raspberry Pi

  • 1. Présentation Chiheb Ameur ABID 63/ 77 Développer un client MQTT sur RPI Plan 1 Introduction à l’Internet des Objets 2 Architectures IOT 3 Réseaux et détections de proximité 4 Le réseau LPWAN 5 Mise en place d’une application IOT 6 Développer un client MQTT sur RPI
  • 2. Présentation Chiheb Ameur ABID 64/ 77 Développer un client MQTT sur RPI Objectif Architecture générale d’une solution IOT
  • 3. Présentation Chiheb Ameur ABID 65/ 77 Développer un client MQTT sur RPI Présentation du projet Paho MQTT Paho MQTT en bref å Projet opensource développé par la fondation Eclipse å Bibliothèque client Paho MQTT qui implémente les versions 3.1, 3.1.1.1 et 5.0 du protocole MQTT å API fournit en C, C ++, Java, Javascript, Python, Go, C# å Site officiel : http://www.eclipse.org/paho å Documentation C++ : https://www.eclipse.org/paho/files/cppdoc/index.html
  • 4. Présentation Chiheb Ameur ABID 66/ 77 Développer un client MQTT sur RPI Installation de la bibliothèque Paho MQTT C++ Installation de la bibliothèque Paho MQTT C++ sur RPI å Compilation et installation depuis le code source å Elle nécessite la compilation et l’installation de la bibliothèque de Paho C version 3.1.8 ou supérieure å Installer les paquets de dépendances Z Outils de compilation : build-essential gcc make cmake Z Utilisation de SSL : libssl-dev Z Construction de la documentation : doxygen Compilation et installation de la bibliothèque Paho MQTT C å Télécharger le code source git clone https://github.com/eclipse/paho.mqtt.c ; cd paho.mqtt.c å Compilation avec cmake cmake -Bbuild -H. -DPAHO_ENABLE_TESTING=OFF -DPAHO_BUILD_STATIC=ON -DPAHO_WITH_SSL=ON -DPAHO_HIGH_PERFORMANCE=ON å Installation sudo cmake --build build/ --target install sudo ldconfig
  • 5. Présentation Chiheb Ameur ABID 67/ 77 Développer un client MQTT sur RPI Installation de la bibliothèque Paho MQTT C++ Compilation et installation de la bibliothèque Paho MQTT C++ å Télécharger le code source git clone https://github.com/eclipse/paho.mqtt.cpp cd paho.mqtt.cpp å Compilation avec cmake cmake -Bbuild -H. -DPAHO_BUILD_STATIC=ON -DPAHO_BUILD_DOCUMENTATION=TRUE -DPAHO_BUILD_SAMPLES=TRUE å Installation sudo cmake --build build/ --target install sudo ldconfig
  • 6. Présentation Chiheb Ameur ABID 68/ 77 Développer un client MQTT sur RPI Utilisation de la Bibliothèque Paho MQTT Connexion : la classe mqtt::async_client å #include <async_client.h> å La classe mqtt::async_client permet de communiquer avec un broker en utilisant des méthodes non bloquantes å Constructeur async_client (const string &serverURI, const string &clientId, iclient_persistence *persistence=nullptr) Z serverURI : spécifie l’adresse et le port du broker Z clienId : une chaine choisie pour identifier le client å La méthode token_ptr connect() permet d’établir la connexion. Elle renvoie un pointeur sur un jeton permettant de surveiller l’état de la connexion å La méthode token_ptr disconnect() permet de se déconnecter å La méthode bool is_connected() indique si une connexion est bien établie
  • 7. Présentation Chiheb Ameur ABID 69/ 77 Développer un client MQTT sur RPI Utilisation de la Bibliothèque Paho MQTT Connexion : la classe mqtt::token å #include <token.h> å La classe mqtt::token fournit un mécanisme pour surveiller les actions asynchrones å La méthode wait() permet de bloquer la tâche courante jusqu’à que l’action associée au jeton soit terminée å La méthode connect_response get_connect_response() const renvoie la réponse de l’opération de connexion. Si l’opération n’est pas encore terminée, la tâche en cours se bloquera jusqu’à ce que le résultat soit disponible. Connexion : la classe mqtt::connect_response å #include <server_response.h> å Elle fournit des informations sur une connexion établie å Vérifier si une session existait déjà pour un client sur le serveur : le serveur a une session persistante stockée pour le client, étant donné l’identifiant du client spécifié dans le message de connexion. bool mqtt::connect_response::is_session_present () const å Renvoyer la version MQTT utilisée pour la connexion int mqtt::connect_response::get_mqtt_version() const
  • 8. Présentation Chiheb Ameur ABID 70/ 77 Développer un client MQTT sur RPI Utilisation de la Bibliothèque Paho MQTT Exemple : connexion à un broker const std::string SERVER_ADDRESS("tcp://localhost:1883"); const std::string CLIENT_ID("paho_cpp_async_subcribe"); mqtt::async_client cli(SERVER_ADDRESS, CLIENT_ID); try { // Connect to the server cout << "Connecting to the MQTT server..." << flush; cli.connect()->wait(); } catch(const mqtt::exception &exc) { cerr << "n " << exc << endl; return 1; } ... try { std::cout << "nDisconnecting from the MQTT server..." << std::flush; cli.disconnect()->wait(); std::cout << "OK" << std::endl; } catch (const mqtt::exception& exc) { std::cerr << exc << std::endl; return 1; }
  • 9. Présentation Chiheb Ameur ABID 71/ 77 Développer un client MQTT sur RPI Utilisation de la Bibliothèque Paho MQTT Inscription à un sujet å Pour récevoir les messages d’un sujet, il faut d’abord s’inscrire token_ptr mqtt::async_client::subscribe(const string &topicFilter,int qos,const subscribe_options &opts=subscribe_options(),const properties &props=properties()) Z topicFilter : le sujet avec la possibilité d’inclure des jokers Z qos : le degré de la qualité du service Z opts : des options d’inscription avec MQTT v5 Z props : les propriétés de MQTT v5 å Se désinscrire d’un sujet token_ptr mqtt::async_client::unsubscribe(const string &topicFilter,const properties &props= properties()) Z topicFilter : le sujet avec la possibilité d’inclure des jokers Z props : les propriétés de MQTT v5
  • 10. Présentation Chiheb Ameur ABID 72/ 77 Développer un client MQTT sur RPI Utilisation de la Bibliothèque Paho MQTT Démarrer la réception des messages å Démarrer la réception asynchrone des messages et les stocker dans une file void mqtt::async_client::start_consuming() å Arrêter la réception des messages et ignorer tout message non lu void mqtt::async_client::stop_consuming()
  • 11. Présentation Chiheb Ameur ABID 73/ 77 Développer un client MQTT sur RPI Utilisation de la Bibliothèque Paho MQTT Lecture des messages å La lecture bloquante des messages se fait à partir d’une file const_message_ptr mqtt::async_client::consume_message() Z const_message_ptr : un pointeur sur l’objet encapsulant le message. Si nullptr : échec de lecture å Lecture non bloquante bool mqtt::async_client::try_consume_message(const_message_ptr * msg) La classe message å Récupérer le nom du sujet d’un message reçu const string& mqtt::message::get_topic() const å Renvoyer sous forme d’une chaine de caractère la charge utile d’un message reçu string mqtt::message::to_string() const
  • 12. Présentation Chiheb Ameur ABID 74/ 77 Développer un client MQTT sur RPI Utilisation de la Bibliothèque Paho MQTT Exemple : Réception asynchrone et lecture synchrone des messages const string SERVER_ADDRESS { "tcp://localhost:1883" }; const string CLIENT_ID { "paho_cpp_async_consume" }; const string TOPIC { "#" }; const int QOS = 1; int main(int argc, char* argv[]) { mqtt::async_client cli(SERVER_ADDRESS, CLIENT_ID); try { // Start consumer before connecting to make sure to not miss messages cli.start_consuming(); auto rsp = cli.connect()->get_connect_response(); // If there is no session present, then we need to subscribe, but if // there is a session, then the server remembers us and our subscriptions. if (!rsp.is_session_present()) cli.subscribe(TOPIC, QOS)->wait(); while (true) { // Loop to consume read messages auto msg = cli.consume_message(); if (!msg) break; cout << msg->get_topic() << ": " << msg->to_string() << endl; } if (cli.is_connected()) { cli.unsubscribe(TOPIC)->wait(); cli.stop_consuming(); cli.disconnect()->wait(); } else cout << "nClient was disconnected" << endl; } catch (const mqtt::exception& exc) { cerr << "n " << exc << endl; return 1; } return 0; }
  • 13. Présentation Chiheb Ameur ABID 75/ 77 Développer un client MQTT sur RPI Utilisation de la Bibliothèque Paho MQTT Envoie de messages å Il faut créer une instance de la classe message pour le message à envoyer message_ptr mqtt::make_message(string_ref topic,binary_ref payload) message_ptr mqtt::make_message(string_ref topic,const void *payload,size_t len) Z topic : le sujet Z payload : la charge utile du message Z len : taille de message en nombre d’octets å Se désinscrire d’un sujet delivery_token_ptr mqtt::async_client::publish(string_ref topic, binary_ref payload) delivery_token_ptr mqtt::async_client::publish(string_ref topic, binary_ref payload,int qos,bool retained) Z topicFilter : le sujet avec la possibilité d’inclure des jokers Z props : les propriétés de MQTT v5
  • 14. Présentation Chiheb Ameur ABID 76/ 77 Développer un client MQTT sur RPI Utilisation de la Bibliothèque Paho MQTT Exemple : Réception asynchrone et lecture synchrone des messages const string SERVER_ADDRESS {"tcp://localhost:1883"}; const string CLIENT_ID {"paho_cpp_async_publish"}; const string TOPIC { "hello" }; const char* PAYLOAD1 = "Hello World!"; const char* PAYLOAD2 = "Hi there!"; const int QOS=1; const auto TIMEOUT = std::chrono::seconds(10); int main(int argc, char* argv[]) { mqtt::async_client client(SERVER_ADDRESS, CLIENT_ID); try { client.connect()->wait(); mqtt::message_ptr pubmsg = mqtt::make_message(TOPIC, PAYLOAD1); pubmsg->set_qos(QOS); client.publish(pubmsg)->wait_for(TIMEOUT); cout << "First message was sent..." << endl; // Now try with itemized publish mqtt::delivery_token_ptr pubtok; pubtok = client.publish(TOPIC, PAYLOAD2, strlen(PAYLOAD2), QOS, false); cout << " ...with token: " << pubtok->get_message_id() << endl; cout << " ...for message with " << pubtok->get_message()->get_payload().size()<< " bytes" << endl; pubtok->wait_for(TIMEOUT); client.disconnect()->wait(); cout << "nDisconnected" << endl; } catch (const mqtt::exception& exc) { cerr << exc.what() << endl; return 1; } return 0; }