EA2014ProtforIoT

= 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 
 * 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 à Machine, Internet des Objets, Open-source, MQTT, CoAP, XMPP, communication

=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.

=Key Words= Protocol, Machine to Machine, Internet of things, Open-source, MQTT, CoAP, XMPP, communication

=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…

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éressés par un ou plusieurs topics en particulier s’inscrivent sur ceux-ci auprès d’un broker. A l'émission 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.



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 fil 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.

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 : pour 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.



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 choisit 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 petit 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 petits. 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'envoi 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ées XEF (pour XMPP Extension Protocols). Une partie d'entre elles sont 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...

=Démonstration=

Afin de réaliser deux démonstrations, plusieurs outils seront nécessaires : 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 conseille de suivre le tutoriel fourni sur le site.

Publisher MQTT sur Arduino Yún

 * Démonstration de MQTT avec Arduino Yún

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 :
 * 1) !/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 là, 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 blocs à 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éés par d'autres personnes ou vous même (en Node JS), afin d'effectuer du stockage dans une base de données MongoDB par exemple.



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.



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écessaires. 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 Connectez-vous ensuite avec Firefox à l'adresse coap://0.0.0.0/0.0.0.0:5693/. Après avoir cliqué 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ée sera HelloWorld, et des informations quant à 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 base 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ée 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 sites (comme ETH Zürich).

=Notes et Références=

MQTT

 * Site officiel du protocole MQTT
 * OASIS à propos de MQTT
 * github d'un projet d'inclusion de MQTT avec Nagios
 * Page d'information pour MQTT-SN
 * Présentation de MQTT avec Mosquitto

CoAP

 * RFC 7252 à propos de CoAP
 * Description du protocole CoAP
 * Copper plugin pour Firefox
 * Github du projet Californium

XMPP

 * page wiki pour l'IoT avec XMPP