EA2014ProtforIoT: Difference between revisions

From air
Jump to navigation Jump to search
No edit summary
No edit summary
Line 46: Line 46:
===Principe de fonctionnement===
===Principe de fonctionnement===


Le fonctionnement du protocole MQTT est simple : les objets publient des messages sur des topiques.Les clients intéréssés par un ou plusieurs topiques en particulier s’inscrivent sur ceux-ci auprès d’un broker. A emission d’un message par un objet sur un topique donné, le broker aura pour tâche d’envoyer le message à tous les clients s’étant inscrits sur le topique en question.
Le fonctionnement du protocole MQTT est simple : les objets publient des messages sur des topics.Les clients intéréssés par un ou plusieurs topics en particulier s’inscrivent sur ceux-ci auprès d’un broker. A emission d’un message par un objet sur un topic donné, le broker aura pour tâche d’envoyer le message à tous les clients s’étant inscrits sur le topic en question.
Il existe de nombreux broker pour MQTT, l'un d'eux est [http://mosquitto.org/ Mosquitto], un broker open source capable de supporter le protocole TLS.
Il existe de nombreux broker pour MQTT, l'un d'eux est [http://mosquitto.org/ Mosquitto], un broker open source capable de supporter le protocole TLS.


Line 52: Line 52:


L'image ci-dessus explique le principe de fonctionnement du protocole :
L'image ci-dessus explique le principe de fonctionnement du protocole :
*Dans un premier temps, des clients s'inscrivent pour différents topiques auprès du broker.
*Dans un premier temps, des clients s'inscrivent pour différents topics auprès du broker.
*Une machine décide de publier une information sur un topique donné. Ici, le capteur décide de publier la valeur 25 sur le topique nommé "Temp".
*Une machine décide de publier une information sur un topic donné. Ici, le capteur décide de publier la valeur 25 sur le topic nommé "Temp".
*La valeur 25 va être envoyée aux machines A et B puisqu'elles ont toutes deux souscrit à ce topique.
*La valeur 25 va être envoyée aux machines A et B puisqu'elles ont toutes deux souscrit à ce topic.
*Nous pouvons imaginer que par la suite, le capteur publie la valeur 10 sur le topique "Humi", dans ce cas, seule la machine B recevra la valeur 10, car elle est la seule à avoir souscrit à ce topique.
*Nous pouvons imaginer que par la suite, le capteur publie la valeur 10 sur le topic "Humi", dans ce cas, seule la machine B recevra la valeur 10, car elle est la seule à avoir souscrit à ce topic.


MQTT possède plusieurs particularités :
MQTT possède plusieurs particularités :
Line 116: Line 116:


Si vous désirez juste tester le protocole MQTT dans un terminal, il vous suffit d'ouvrir deux fenêtres et de taper dans la première
Si vous désirez juste tester le protocole MQTT dans un terminal, il vous suffit d'ouvrir deux fenêtres et de taper dans la première
<pre>mosquitto-sub -t "votre nom de topique" #permet de souscrire a un topique MQTT</pre>
<pre>mosquitto-sub -t "votre nom de topic" #permet de souscrire a un topic MQTT</pre>
<pre>mosquitto-pub -t "votre nom de topique" -m "votre message" #permet de publier un message sur un topique donné</pre>
<pre>mosquitto-pub -t "votre nom de topic" -m "votre message" #permet de publier un message sur un topic donné</pre>
Un petit script en python est également disponible pour publier des données continuellement sur un topique :
Un petit script en python est également disponible pour publier des données continuellement sur un topic :
<pre>#!/usr/bin/env python
<pre>#!/usr/bin/env python


Line 143: Line 143:
===MQTT avec Node-Red===
===MQTT avec Node-Red===


Pour cette démonstration Node-Red doit avoir été lancé. Node-Red permet de connecter de façon simple divers éléments. J'ai utilisé un Arduino Yun avec une [https://github.com/bobbytech/Easy-Arduino-Yun-MQTT-Client librairie] pour utiliser MQTT dessus comme client publiant sur un topique. La seule contrainte est de relier par Ethernet l'Arduino au broker MQTT.
Pour cette démonstration Node-Red doit avoir été lancé. Node-Red permet de connecter de façon simple divers éléments. J'ai utilisé un Arduino Yun avec une [https://github.com/bobbytech/Easy-Arduino-Yun-MQTT-Client librairie] pour utiliser MQTT dessus comme client publiant sur un topic. La seule contrainte est de relier par Ethernet l'Arduino au broker MQTT.


Une fois Node-Red démarré et votre Arduino configuré pour publier des messages, rendez-vous sur votre navigateur afin de vous rendre sur la page http://localhost:1880 pour y accéder. De la vous pouvez rapidement créer un petit ensemble d'éléments pour voir les messages publiés par votre Arduino.
Une fois Node-Red démarré et votre Arduino configuré pour publier des messages, rendez-vous sur votre navigateur afin de vous rendre sur la page http://localhost:1880 pour y accéder. De la vous pouvez rapidement créer un petit ensemble d'éléments pour voir les messages publiés par votre Arduino.
*Ajoutez d'abord un élément MQTT du bloc "input", configurez le en ajoutant un nouveau broker MQTT (normalement sur localhost, port 1883). Sauvegarder et revenu aux options générales du bloc, il ne vous reste qu'à donner le nom du topique auquel vous voulez souscrire (celui sur lequel publie votre Arduino).
*Ajoutez d'abord un élément MQTT du bloc "input", configurez le en ajoutant un nouveau broker MQTT (normalement sur localhost, port 1883). Sauvegarder et revenu aux options générales du bloc, il ne vous reste qu'à donner le nom du topic auquel vous voulez souscrire (celui sur lequel publie votre Arduino).
*Ensuite, ajoutez un bloc "output" de type debug, afin de pouvoir suivre directement depuis votre navigateur les différents messages publiés sur l'interface de Node-Red. Il est possible d'effectuer des traitements sur les données avec des blocs spécifiques proposés par Node-Red.
*Ensuite, ajoutez un bloc "output" de type debug, afin de pouvoir suivre directement depuis votre navigateur les différents messages publiés sur l'interface de Node-Red. Il est possible d'effectuer des traitements sur les données avec des blocs spécifiques proposés par Node-Red.
*Ajoutez d'autres bloc à votre convenance : pour twitter des messages, ou bien les envoyer au travers d'une websocket afin de les récupérer sur une page web. Vous pouvez également ajouter de nouveaux blocs créer par d'autres personnes ou vous même (en Node JS), afin d'effectuer du stockage dans une base de donnée MongoDB par exemple.
*Ajoutez d'autres bloc à votre convenance : pour twitter des messages, ou bien les envoyer au travers d'une websocket afin de les récupérer sur une page web. Vous pouvez également ajouter de nouveaux blocs créer par d'autres personnes ou vous même (en Node JS), afin d'effectuer du stockage dans une base de donnée MongoDB par exemple.
Line 153: Line 153:




Si vous ne disposez pas d'un Arduino, ou que vous voulez juste rapidement essayer Node-Red, vous pouvez simplement déployer un bloc "input" de type inject pour injecter du texte, et l'envoyer vers un bloc MQTT pour le publier sur un topique donné, il ne vous reste plus qu'à utiliser la commande "mosquitto_sub -t "votre topique"" afin de voir les messages dans un terminal.
Si vous ne disposez pas d'un Arduino, ou que vous voulez juste rapidement essayer Node-Red, vous pouvez simplement déployer un bloc "input" de type inject pour injecter du texte, et l'envoyer vers un bloc MQTT pour le publier sur un topic donné, il ne vous reste plus qu'à utiliser la commande "mosquitto_sub -t "votre topic"" afin de voir les messages dans un terminal.


[[Image:Noderedexemple2.png|250px|thumb|center|Démonstration de Node-Red avec un bloc Inject et une publication sur un topique MQTT.]]
[[Image:Noderedexemple2.png|250px|thumb|center|Démonstration de Node-Red avec un bloc Inject et une publication sur un topic MQTT.]]


===CoAP avec Copper et Californium===
===CoAP avec Copper et Californium===

Revision as of 21:35, 8 October 2014

Présentation

  • Enseignants : Georges-Pierre Bonneau, Didier Donsez (EA2014)
  • Sujet : Protocoles de communications pour l'IoT et le M2M
  • Date : 10 octobre 2014
  • Auteur : Rodolphe Fréby <rodolphe.freby@e.ujf-grenoble.fr>
  • Télécharger les slides de la présentation : A venir

Résumé

L’Internet des objets représente la connexion à internet de la plupart des objets de notre vie courante, du monde réel, tels que des capteurs, des montres...


2 milliards. C’est le nombre approximatif de ces objets connectés aujourd’hui (en 2014). Certaines estimations placent ce chiffre à 8 milliards pour 2020, d’autres à beaucoup plus. Il est donc nécessaire de concevoir et standardiser des protocoles pour permettre à ces objets de communiquer entre eux, les anciens protocoles étant trop lourds pour ces petits appareils.

Mots clefs

Protocole, Machine-to-Machine, Internet des Objets, Open-source, MQTT, CoAP, XMPP

Abstract

The Internet of Things (IoT) is the Internet connection of most objects in our everyday life, the real world, such as sensors, watches, ...


2 Billion. this is an approximate number of these connected Devices nowadays (2014). Some estimates put this figure at $ 8 billion for 2020, others much later. It is therefore necessary to develop and standardize the protocols to allow these objects to communicate with each other the old protocols are too heavy for these small devices.

Synthèse

[...]les objets parlent réellement et vous préviennent quand il y a besoin de faire/savoir quelque chose. Par exemple, le frigo détecte un surplus de glace, il vous envoie donc un message pour vous dire quoi faire. 

orange

[...]the Internet of Things—what we view as the latest wave of the Internet -- connecting physical objects in ways that help us analyze and control our environment to provide better safety, comfort, and efficiency.

cisco

Et si demain votre maison était équipée de capteurs de températures, d’humidités dans différentes pièces afin de régler automatiquement le chauffage? Et si ce type de données pouvaient être relevées dans une ville afin de notifier les citoyens sur de nombreux sujets? Ces objets, de plus en plus nombreux, renvoient une grande quantité de données au travers des réseaux. Ces appareils ont besoin de protocoles de communication pouvant fonctionner sur des appareils avec une puissance de calcul limitée, et sur des réseaux avec une forte latence.

De nombreux protocoles de communication pour l’Internet des objets existent déjà : MQTT, COaP, XMPP… Chacun d’entre eux possède ces propres particularités. Quand MQTT utilisera le principe de publication et souscription, COaP s’inspirera plutôt du protocole HTTP avec des requêtes de type GET, PUT…

MQTT

Présentation

Message Queue Telemetry Transport. Il s’agit d’un protocole de communication pour l’internet des objets basés sur le principe de la publication et souscription. Conçu en 1999 par IBM et Eurotech, il est actuellement dans sa version 3.1. Il a été conçu pour être utilisé comme protocole de communication de machines à machines (M2M : Machine to Machine) par des systèmes avec une puissance limitée sur des réseaux non fiables. Il a été récemment proposé à OASIS (Organization for the Advancement of Structured Information Standards) comme standard de communication pour l’Internet des objets. Il a été choisi en 2012 pour être utilisé au sein du logiciel Facebook Messenger comme protocole pour l’envoi de message.

Principe de fonctionnement

Le fonctionnement du protocole MQTT est simple : les objets publient des messages sur des topics.Les clients intéréssés par un ou plusieurs topics en particulier s’inscrivent sur ceux-ci auprès d’un broker. A emission d’un message par un objet sur un topic donné, le broker aura pour tâche d’envoyer le message à tous les clients s’étant inscrits sur le topic en question. Il existe de nombreux broker pour MQTT, l'un d'eux est Mosquitto, un broker open source capable de supporter le protocole TLS.

schéma explicatif du fonctionnement du protocole MQTT

L'image ci-dessus explique le principe de fonctionnement du protocole :

  • Dans un premier temps, des clients s'inscrivent pour différents topics auprès du broker.
  • Une machine décide de publier une information sur un topic donné. Ici, le capteur décide de publier la valeur 25 sur le topic nommé "Temp".
  • La valeur 25 va être envoyée aux machines A et B puisqu'elles ont toutes deux souscrit à ce topic.
  • Nous pouvons imaginer que par la suite, le capteur publie la valeur 10 sur le topic "Humi", dans ce cas, seule la machine B recevra la valeur 10, car elle est la seule à avoir souscrit à ce topic.

MQTT possède plusieurs particularités :

  • Le protocole fonctionne au dessus de TCP/IP
  • La QoS est disponible, avec 3 options différentes, à savoir :
    • At least once : au moins un message arrivera à destination
    • At more once : au plus un message arrivera à destination
    • Exactly once : un et un seul message arrivera à destination
  • Des librairies disponibles dans plusieurs langages : Java, Arduino, C, Android…
  • La possibilité d’utiliser un système d’authentification avec nom d’utilisateur et un mot de passe. De plus, SSL peut être utilisé, mais de manière indépendante du protocole MQTT.

MQTT-SN

Anciennement MQTT-S, MQTT-SN (pour Message Queue Telemetry Transport for Sensor Networks) utilise UDP et non TCP, cela permettant de recevoir les messages dans n’importe quel ordre. Il a été conçu pour être utilisé dans réseaux sans fils de capteurs. L’une des différences entre MQTT et MQTT-SN est la prise en charge des clients se mettant en veille pour le second. Le serveur conserve les messages destinés aux appareils endormis, afin de les communiquer plus tard à leur réveil.

CoAP

Histoire

CoAP (pour Constrained Application Protocol) est un protocole conçu pour la communication dans l'IoT et le M2M, basé sur le principe du protocole HTTP, à savoir le transfert de documents. La standardisation de ce protocole s'est majoritairement faite par l'IETF (The Internet Engineering Task Force). La différence réside dans le faite que CoAP a été conçu pour être utilisé par des petits équipements embarqués et sur des réseaux contraints.

Fonctionnement

CoAP repose sur le principe de requêtes et de réponses entre un client et un serveur. Ce qui est appelé serveur est général l'objet (le capteur, la carte embarquée) qui récolte les données, auquel le client vient demander des informations. Le client peut effectuer plusieurs types de requêtes, similaires au protocole HTTP :

  • GET : permet de récupérer une ressource.
  • PUT : pour créer une nouvelle ressource sur le serveur à l'URI demandée.
  • POST : pour créer ou modifier une ressource sur le serveur à l'URI demandée.
  • DELETE : afin de supprimer une ressource sur le serveur à l'URI demandée.
exemple d'un résultat d'une requête GET sur l'un des objets de l'URI coap://iot.eclipse.org:5683/ avec le plugin pour Firefox Copper.

Les ressources sont accessibles au travers d'URI comme pour HTTP. Un exemple d'URI CoAP (possible d'y accéder si vous possédez le plugin Copper pour Firefox) : coap://iot.eclipse.org:5683/. Un exemple est proposé ci-contre.

Il est possible pour le serveur d'autoriser une souscription afin de notifier le client de manière récurrente sur l'état d'une valeur. Le client peut également se désinscrire s'il le souhaite. Au sein de sa réponse, le serveur choisi d'affecter ou non une durée de validité à la ressource renvoyée. Le plugin Copper par exemple (qui permet également de bien voir cette information) effectuera une notification pour prévenir que cette durée est écoulée, en surlignant en rouge le champ associé à la validité. Tout comme le protocole HTTP, CoAP utilise des codes dans les réponses renvoyées à la suite de requêtes. Ceux-ci sont issus du protocole HTTP, avec certains en plus créés pour CoAP. Ce protocole utilise UDP et non TCP.

Un principe de QoS existe également, en demandant ou non l'acquittement des messages à l'aide d'un flag pour le type de message. 4 flags sont disponibles :

  • CON : le message doit recevoir un acquittement.
  • NON : le message n'a pas besoin d'acquittement.
  • ACK : cela identifie un message d'acquittement.
  • RST : il s'agit d'un message "reset". Envoyé à réception d'un message typé CON pour lequel des informations seraient manquantes.

Une autre particularité de CoAP par rapport à HTTP est d'avoir des messages plus petit. La taille minimum possible est ainsi seulement de 4 octets.

XMPP

Il existe de nombreux autres protocoles de communications pour l'Internet des Objets. L'un d'eux est XMPP (Extensible Messaging and Presence Protocol). Il est à l'origine utilisé comme protocole pour l'envoie de messages instantanés, en utilisant XML et TCP. Créer en 1998 sous le nom de Jabber, celui-ci est utilisé par de nombreux logiciels tels que Facebook, Skype, Google Talk, IChat, MSN, ... Il fonctionne sur le principe de clients et de serveurs.

Ce protocole utilise des extensions, nommés XEF (pour XMPP Extension Protocols). Une partie d'entre elles sont actuellement en cours d'implémentation pour l'Internet des Objets. Parmi elles figure le format EXI (Efficient XML Interchange), ainsi que d'autres implémentations pour la sécurité dans le domaine de l'IoT, la communication des données au travers d'XMPP...

Demonstration

Afin de réaliser deux démonstrations, plusieurs outils seront nécessaire : l'installation de Mosquitto (l'installation du paquet mosquitto-clients peut être intéressante pour une utilisation en local), Node-Red pour l'utilisation de MQTT.

Pour installer Node-Red, je vous conseil de suivre le tutoriel fourni sur le site.

MQTT sans Node-Red

Si vous désirez juste tester le protocole MQTT dans un terminal, il vous suffit d'ouvrir deux fenêtres et de taper dans la première

mosquitto-sub -t "votre nom de topic" #permet de souscrire a un topic MQTT
mosquitto-pub -t "votre nom de topic" -m "votre message" #permet de publier un message sur un topic donné

Un petit script en python est également disponible pour publier des données continuellement sur un topic :

#!/usr/bin/env python

import random
import mosquitto

broker = '127.0.0.1'
port = 1883

print ('Messages are published')

client = mosquitto.Mosquitto("EARICM")
client.connect(broker)
topic = "ricmEA"
while True:

    value = str(random.uniform(0.0, 50.0))
    message = value + " degrés"

    client.publish(topic, message)
    time.sleep(3)

MQTT avec Node-Red

Pour cette démonstration Node-Red doit avoir été lancé. Node-Red permet de connecter de façon simple divers éléments. J'ai utilisé un Arduino Yun avec une librairie pour utiliser MQTT dessus comme client publiant sur un topic. La seule contrainte est de relier par Ethernet l'Arduino au broker MQTT.

Une fois Node-Red démarré et votre Arduino configuré pour publier des messages, rendez-vous sur votre navigateur afin de vous rendre sur la page http://localhost:1880 pour y accéder. De la vous pouvez rapidement créer un petit ensemble d'éléments pour voir les messages publiés par votre Arduino.

  • Ajoutez d'abord un élément MQTT du bloc "input", configurez le en ajoutant un nouveau broker MQTT (normalement sur localhost, port 1883). Sauvegarder et revenu aux options générales du bloc, il ne vous reste qu'à donner le nom du topic auquel vous voulez souscrire (celui sur lequel publie votre Arduino).
  • Ensuite, ajoutez un bloc "output" de type debug, afin de pouvoir suivre directement depuis votre navigateur les différents messages publiés sur l'interface de Node-Red. Il est possible d'effectuer des traitements sur les données avec des blocs spécifiques proposés par Node-Red.
  • Ajoutez d'autres bloc à votre convenance : pour twitter des messages, ou bien les envoyer au travers d'une websocket afin de les récupérer sur une page web. Vous pouvez également ajouter de nouveaux blocs créer par d'autres personnes ou vous même (en Node JS), afin d'effectuer du stockage dans une base de donnée MongoDB par exemple.
Démonstration de Node-Red avec plusieurs types de blocs.


Si vous ne disposez pas d'un Arduino, ou que vous voulez juste rapidement essayer Node-Red, vous pouvez simplement déployer un bloc "input" de type inject pour injecter du texte, et l'envoyer vers un bloc MQTT pour le publier sur un topic donné, il ne vous reste plus qu'à utiliser la commande "mosquitto_sub -t "votre topic"" afin de voir les messages dans un terminal.

Démonstration de Node-Red avec un bloc Inject et une publication sur un topic MQTT.

CoAP avec Copper et Californium

Pour cette démonstration, vous aurez besoin du plugin Copper pour Firefox. Nous allons également utiliser Californium, une implémentation du protocole CoAP en Java. Maven et Java seront également nécessaire. Afin de pouvoir utiliser Calofornium et créer vous-même des applications, vous aurez besoin de cloner plusieurs dépôts Git, le premier étant Californium.element-connector.

git clone https://github.com/eclipse/californium.element-connector.git
cd californium.element-connector
mvn clean install

Clonez ensuite Californium.scandium.

git clone https://github.com/eclipse/californium.scandium.git
cd californium.scandium
mvn clean install

Enfin, clonez Californium.

git clone https://github.com/eclipse/californium.git
cd californium
mvn clean install

Des exemples sont disponibles dans le dossier "run" de californium. Vous pouvez lancer un serveur avec la commande :

java -jar cf-helloworld-server-1.0.0-SNAPSHOT.jar
Démonstration de CoAP avec un serveur HelloWorld local.

Connectez vous ensuite avec Firefox à l'adresse coap://0.0.0.0/0.0.0.0:5693/. Après avoir cliquer sur "discover", vous devriez voir apparaître une ressource helloWorld, sur laquelle vous avez la possibilité d'effectuer une requête GET. La réponse renvoyé sera HelloWorld, et des informations quand à la requête seront fournies. Il est possible dans les options de demander l'acquittement (Flag CON) ou non (Flag NON).

Le fichier source du serveur est disponible dans le dossier cf-helloworld-serveur. Vous pouvez le consulter pour comprendre les méthodes de bases en java afin de faire un serveur répondant aux requêtes GET CoAP à votre manière, en récupérant l'heure locale, un compteur du nombre de cliques sur la ressource, ou même une valeur (comme la température, ou l'humidité) récupéré par l'appareil exécutant le serveur CoAP...

Un autre exemple est également disponible : cf-plugtest-server. Il s'agit de l'exemple proposé par plusieurs site (comme ETH Zürich).

Notes et Références

MQTT

CoAP

XMPP