<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rakotoanosy</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rakotoanosy"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Rakotoanosy"/>
	<updated>2026-05-21T09:06:25Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11837</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11837"/>
		<updated>2019-05-20T07:54:44Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Protocole Hybride */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivants :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Autonomie énergétique souvent limitée&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Faible puissance des processeurs et taille réduite de la mémoire&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Disponibilité « aléatoire » de l’accès aux réseaux de communication&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiés (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuelle d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0 : le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivée.&lt;br /&gt;
&lt;br /&gt;
Qualité 1 : le client qui publie reçoit la confirmation ou non que la donnée publiée a été reçue par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2 : le client qui publie reçoit la confirmation ou non que la donnée donnée publiée a été reçue par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne a reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiariser avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en sommes servi ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des températures). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme :&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous sommes servi ici d&#039;un broker mis en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logicielle inventée par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définie par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contrainte fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définie par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données gérée par un serveur :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sait pas si le client 2 a posté une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfert rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage automatique des messages &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action directe sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt, qui est bloqué par certains pare-feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit gérer une base de données (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ait :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfert rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage automatique des messages &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ait à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serait d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoie au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui s&#039;est abonné.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des pare-feu que l&#039;on pouvait rencontrer avec le protocole Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11836</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11836"/>
		<updated>2019-05-20T07:53:46Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Protocole Hybride */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivants :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Autonomie énergétique souvent limitée&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Faible puissance des processeurs et taille réduite de la mémoire&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Disponibilité « aléatoire » de l’accès aux réseaux de communication&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiés (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuelle d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0 : le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivée.&lt;br /&gt;
&lt;br /&gt;
Qualité 1 : le client qui publie reçoit la confirmation ou non que la donnée publiée a été reçue par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2 : le client qui publie reçoit la confirmation ou non que la donnée donnée publiée a été reçue par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne a reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiariser avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en sommes servi ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des températures). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme :&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous sommes servi ici d&#039;un broker mis en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logicielle inventée par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définie par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contrainte fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définie par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données gérée par un serveur :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sait pas si le client 2 a posté une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfert rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage automatique des messages &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action directe sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloqué par certains pare-feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit gérer une base de données (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ait :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfert rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage automatique des messages &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ait à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serait d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoie au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui s&#039;est abonné.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des pare-feu que l&#039;on pouvait rencontrer avec le protocole Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11835</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11835"/>
		<updated>2019-05-20T07:49:46Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivants :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Autonomie énergétique souvent limitée&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Faible puissance des processeurs et taille réduite de la mémoire&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Disponibilité « aléatoire » de l’accès aux réseaux de communication&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiés (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuelle d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0 : le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivée.&lt;br /&gt;
&lt;br /&gt;
Qualité 1 : le client qui publie reçoit la confirmation ou non que la donnée publiée a été reçue par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2 : le client qui publie reçoit la confirmation ou non que la donnée donnée publiée a été reçue par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne a reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiariser avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en sommes servi ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des températures). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme :&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous sommes servi ici d&#039;un broker mis en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logicielle inventée par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définie par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contrainte fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définie par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données gérée par un serveur :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sait pas si le client 2 a posté une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des par-feu que l&#039;on pouvait rencontrer avec le protocole Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11834</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11834"/>
		<updated>2019-05-20T07:47:52Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivants :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Autonomie énergétique souvent limitée&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Faible puissance des processeurs et taille réduite de la mémoire&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Disponibilité « aléatoire » de l’accès aux réseaux de communication&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiés (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuelle d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0 : le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivée.&lt;br /&gt;
&lt;br /&gt;
Qualité 1 : le client qui publie reçoit la confirmation ou non que la donnée publiée a été reçue par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2 : le client qui publie reçoit la confirmation ou non que la donnée donnée publiée a été reçue par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne a reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiariser avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en sommes servi ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des températures). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme :&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous sommes servi ici d&#039;un broker mis en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des par-feu que l&#039;on pouvait rencontrer avec le protocole Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11833</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11833"/>
		<updated>2019-05-20T07:44:01Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivants :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Autonomie énergétique souvent limitée&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Faible puissance des processeurs et taille réduite de la mémoire&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Disponibilité « aléatoire » de l’accès aux réseaux de communication&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiés (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuelle d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des par-feu que l&#039;on pouvait rencontrer avec le protocole Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11832</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11832"/>
		<updated>2019-05-20T07:43:01Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivants :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Autonomie énergétique souvent limitée&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Faible puissance des processeurs et taille réduite de la mémoire&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Disponibilité « aléatoire » de l’accès aux réseaux de communication&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuelle d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des par-feu que l&#039;on pouvait rencontrer avec le protocole Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=11826</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=11826"/>
		<updated>2019-05-20T00:06:10Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Sujets réalisés (2018-2019) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2018--2019: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2017--2018: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2016--2017: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (1 fois par mois, les jeudi après-midi). [[http://www.lama.univ-savoie.fr/index.php?use=seminaires&amp;amp;&amp;amp;lang=fr&amp;amp;equipe=cmi&amp;amp;annee=1&amp;amp;lang=fr Planning des séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] (Romain THEODET)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] (Ewan RAKOTOANOSY)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] (Yohann THEPAUT)&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* [[Dilemme du prisonnier]] (Christophe CARMAGNAC)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
== Transport optimal par coupe 1D et transfert de couleurs entre images ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération et résolution de labyrinthes II ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== REST + Pub/Sub : protocole hybride pour l’IoT ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
== Dilemme du prisonnier ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]]&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] (Nils Ruet, 2018)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] (Rémi Bouvier, 2018)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] (Robin Wagner, 2018)&lt;br /&gt;
* [[Pavages de Penrose]] (Brunelle Cordier-Pierre-Bès, 2018)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
== [[Pavages de Penrose]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Algorithmes d&#039;analyse syntaxique]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]]&lt;br /&gt;
* [[Traitement d&#039;image]]&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]]&lt;br /&gt;
* [[Calculabilité et modèles de calcul]]&lt;br /&gt;
* [[Génération et résolution de labyrinthes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
== [[Algorithme de rendu de scène 3D par Z-buffer]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
== [[Traitement d&#039;image]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Nim et la théorie des jeux impartiaux]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== Initiation à la démonstration sur ordinateur et certification de logiciel ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Calculabilité et modèles de calcul]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
== [[Génération et résolution de labyrinthes]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== Pavages par polyomino ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=11825</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=11825"/>
		<updated>2019-05-20T00:04:23Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Sujets réalisés (2018-2019) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2018--2019: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2017--2018: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2016--2017: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (1 fois par mois, les jeudi après-midi). [[http://www.lama.univ-savoie.fr/index.php?use=seminaires&amp;amp;&amp;amp;lang=fr&amp;amp;equipe=cmi&amp;amp;annee=1&amp;amp;lang=fr Planning des séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] (Romain THEODET)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT REST &amp;amp; Pub/Sub : protocole hybride pour l’IoT] (Ewan RAKOTOANOSY)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] (Yohann THEPAUT)&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* [[Dilemme du prisonnier]] (Christophe CARMAGNAC)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
== Transport optimal par coupe 1D et transfert de couleurs entre images ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération et résolution de labyrinthes II ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== REST + Pub/Sub : protocole hybride pour l’IoT ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
== Dilemme du prisonnier ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]]&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] (Nils Ruet, 2018)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] (Rémi Bouvier, 2018)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] (Robin Wagner, 2018)&lt;br /&gt;
* [[Pavages de Penrose]] (Brunelle Cordier-Pierre-Bès, 2018)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
== [[Pavages de Penrose]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Algorithmes d&#039;analyse syntaxique]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]]&lt;br /&gt;
* [[Traitement d&#039;image]]&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]]&lt;br /&gt;
* [[Calculabilité et modèles de calcul]]&lt;br /&gt;
* [[Génération et résolution de labyrinthes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
== [[Algorithme de rendu de scène 3D par Z-buffer]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
== [[Traitement d&#039;image]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Nim et la théorie des jeux impartiaux]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== Initiation à la démonstration sur ordinateur et certification de logiciel ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Calculabilité et modèles de calcul]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
== [[Génération et résolution de labyrinthes]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== Pavages par polyomino ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=11824</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=11824"/>
		<updated>2019-05-20T00:03:26Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Sujets réalisés (2018-2019) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2018--2019: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2017--2018: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2016--2017: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (1 fois par mois, les jeudi après-midi). [[http://www.lama.univ-savoie.fr/index.php?use=seminaires&amp;amp;&amp;amp;lang=fr&amp;amp;equipe=cmi&amp;amp;annee=1&amp;amp;lang=fr Planning des séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] (Romain THEODET)&lt;br /&gt;
* [[REST &amp;amp; Pub/Sub : protocole hybride pour l’IoT]] (Ewan RAKOTOANOSY)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] (Yohann THEPAUT)&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* [[Dilemme du prisonnier]] (Christophe CARMAGNAC)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
== Transport optimal par coupe 1D et transfert de couleurs entre images ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération et résolution de labyrinthes II ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== REST + Pub/Sub : protocole hybride pour l’IoT ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
== Dilemme du prisonnier ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]]&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] (Nils Ruet, 2018)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] (Rémi Bouvier, 2018)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] (Robin Wagner, 2018)&lt;br /&gt;
* [[Pavages de Penrose]] (Brunelle Cordier-Pierre-Bès, 2018)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
== [[Pavages de Penrose]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Algorithmes d&#039;analyse syntaxique]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]]&lt;br /&gt;
* [[Traitement d&#039;image]]&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]]&lt;br /&gt;
* [[Calculabilité et modèles de calcul]]&lt;br /&gt;
* [[Génération et résolution de labyrinthes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
== [[Algorithme de rendu de scène 3D par Z-buffer]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
== [[Traitement d&#039;image]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Nim et la théorie des jeux impartiaux]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== Initiation à la démonstration sur ordinateur et certification de logiciel ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Calculabilité et modèles de calcul]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
== [[Génération et résolution de labyrinthes]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== Pavages par polyomino ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11823</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11823"/>
		<updated>2019-05-19T23:51:46Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Autonomie énergétique souvent limitée&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Faible puissance des processeurs et taille réduite de la mémoire&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Disponibilité « aléatoire » de l’accès aux réseaux de communication&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des par-feu que l&#039;on pouvait rencontrer avec le protocole Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11822</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11822"/>
		<updated>2019-05-19T23:51:30Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Autonomie énergétique souvent limitée&amp;lt;li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Faible puissance des processeurs et taille réduite de la mémoire&amp;lt;li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Disponibilité « aléatoire » de l’accès aux réseaux de communication&amp;lt;li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des par-feu que l&#039;on pouvait rencontrer avec le protocole Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=G%C3%A9n%C3%A9ration_et_r%C3%A9solution_de_labyrinthes_II&amp;diff=11821</id>
		<title>Génération et résolution de labyrinthes II</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=G%C3%A9n%C3%A9ration_et_r%C3%A9solution_de_labyrinthes_II&amp;diff=11821"/>
		<updated>2019-05-19T23:49:36Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__[[Fichier:labyrinthe_photo.png|vignette|300px|Labyrinthe généré avec Kruskal et résolu avec le parcours en profondeur. En route foncé, l&#039;entrée. En vert, la sortie. En bleu, le chemin. En rouge clair, les cellules visitées lors de la résolution.|alt=&amp;quot;Labyrinthe&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Et comment trouver la sortie quand on est perdu dans le labyrinthe ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Représentation ==&lt;br /&gt;
&lt;br /&gt;
=== Propriétés ===&lt;br /&gt;
&lt;br /&gt;
Un labyrinthe est une grille de cellules reliées, ou non, entre elles.&lt;br /&gt;
&lt;br /&gt;
Deux cellules sont reliées entre elles par une &#039;&#039;&#039;porte&#039;&#039;&#039;, ou séparées par un &#039;&#039;&#039;mur&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Tout labyrinthe a &#039;&#039;&#039;une entrée&#039;&#039;&#039; et &#039;&#039;&#039;une sortie&#039;&#039;&#039;, et quelle que soit l&#039;entrée ou la sortie, le chemin entre ces deux cellules est &#039;&#039;&#039;unique&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Modélisation en graphe ===&lt;br /&gt;
&lt;br /&gt;
En théorie des graphes, un graphe est un ensemble de &#039;&#039;&#039;points&#039;&#039;&#039; (ou nœuds ou sommets) reliés ensemble par des &#039;&#039;&#039;lignes&#039;&#039;&#039; (ou liens ou arêtes).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:graphe_cyclique.png|vignette|left|300px|Exemple de graphe connexe cyclique non orienté|alt=Graphe cyclique]]&lt;br /&gt;
&lt;br /&gt;
Un graphe peut être &#039;&#039;&#039;connexe&#039;&#039;&#039; (en un seul morceau) ou &#039;&#039;&#039;non connexe&#039;&#039;&#039; (en plusieurs morceaux).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un graphe peut aussi être &#039;&#039;&#039;cyclique&#039;&#039;&#039; si les points sont reliés en formant une boucle ou &#039;&#039;&#039;acyclique&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, un graphe peut être &#039;&#039;&#039;orienté&#039;&#039;&#039; (si les arêtes sont à sens unique) ou &#039;&#039;&#039;non orienté&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arbre.PNG|vignette|left|300px|Exemple d&#039;arbre|alt=Arbre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un &#039;&#039;&#039;arbre&#039;&#039;&#039; est un graphe connexe, acyclique et non orienté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En plaçant un point sur chaque cellule de notre labyrinthe, et en reliant deux cellules séparées par une porte, on peut dessiner un arbre à partir de n&#039;importe quel labyrinthe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:labyrinthe_avec_arbre.png|vignette|centre|300px|Exemple de labyrinthe avec son arbre. Pour plus de simplicité, on attribue à chaque nœud une position.|alt=Labyrinthe avec arbre]]&lt;br /&gt;
&lt;br /&gt;
== Génération ==&lt;br /&gt;
&lt;br /&gt;
Un labyrinthe rectangulaire de largeur &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; et de hauteur &amp;lt;math&amp;gt; H &amp;lt;/math&amp;gt; contient exactement &amp;lt;math&amp;gt;L \times H - 1&amp;lt;/math&amp;gt; portes.&lt;br /&gt;
&lt;br /&gt;
Du point de vue du graphe, il y a donc &amp;lt;math&amp;gt;L \times H - 1&amp;lt;/math&amp;gt; arêtes.&lt;br /&gt;
&lt;br /&gt;
Maintenant, comment répartir toutes ces portes de façon à ce que toutes les cellules soient accessibles et qu&#039;il n&#039;existe qu&#039;un unique chemin entre l&#039;entrée et la sortie ?&lt;br /&gt;
&lt;br /&gt;
De nombreux algorithmes existent, dont le parcours en profondeur et l&#039;algorithme de Kruskal.&lt;br /&gt;
Chaque algorithme est différent et produit des labyrinthes visuellement différents.&lt;br /&gt;
&lt;br /&gt;
En effet, si nous comparons un labyrinthe généré avec l&#039;algorithme du parcours en profondeur à un labyrinthe généré avec l&#039;algorithme de Kruskal, bien qu&#039;ils aient tous les deux une solution unique, ils apparaissent néanmoins différents visuellement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recursive_backtracker_comparaison.png|vignette|left|500px|Parcours en profondeur.&amp;lt;br&amp;gt;On remarque des chemins proprement dessinés.|alt=Parcours en profondeur]]&lt;br /&gt;
[[Fichier:kruskal_comparaison.png|vignette|right|500px|Algorithme de Kruskal.&amp;lt;br&amp;gt;On remarque des murs de 1 de longueur çà et là.|alt=Kruskal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Parcours en profondeur ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recursive_backtracker.gif|vignette|left|500px|Illustration du parcours en profondeur|alt=Parcours en profondeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;algorithme du parcours en profondeur (&amp;quot;recursive backtracker&amp;quot; en anglais), on commence sur une cellule aléatoire dans le labyrinthe.&lt;br /&gt;
&lt;br /&gt;
On se dirige dans une direction aléatoire et on casse le mur en face, tout en marquant la cellule précédente comme visitée.&lt;br /&gt;
&lt;br /&gt;
Lorsque aucune direction n&#039;est disponible, on remonte à la position précédente.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pile.png|vignette|300px|Représentation d&#039;une pile de positions|alt=Pile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour sauvegarder l&#039;historique des positions, on peut utiliser une &#039;&#039;&#039;pile&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Une pile est une liste dans laquelle seul le dernier élément peut être récupéré.&lt;br /&gt;
&lt;br /&gt;
Une pile contient 2 méthodes :&lt;br /&gt;
* push(elem) : ajoute elem à la pile&lt;br /&gt;
* pop() -&amp;gt; elem : retourne le dernier élément de la pile (elem dans notre cas)&lt;br /&gt;
&lt;br /&gt;
Dans mon implémentation de la pile, une erreur est levée si l&#039;on appelle la méthode pop sur une pile vide.&lt;br /&gt;
&lt;br /&gt;
=== Kruskal ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:kruskal.gif|vignette|left|500px|Illustration de l&#039;algorithme de Kruskal.|alt=Kruskal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alors que pour le parcours en profondeur on partait des cellules, l&#039;algorithme de Kruskal s&#039;applique sur des murs.&lt;br /&gt;
&lt;br /&gt;
On attribue à chaque cellule un identifiant unique.&lt;br /&gt;
&lt;br /&gt;
On choisit un mur aléatoire. Si les cellules séparées par ce mur ont des identifiants différents, on leur associe le même identifiant et on casse le mur.&lt;br /&gt;
&lt;br /&gt;
Sinon, on passe à un autre mur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:union_find.png|vignette|300px|Représentation d&#039;une structure Union-Find avec find(a,b) et find(b,c).|alt=Union-Find]]&lt;br /&gt;
&lt;br /&gt;
Pour mettre en œuvre cet algorithme, on utilise une structure de données appelée &#039;&#039;&#039;Union-Find&#039;&#039;&#039;, qui permet de mettre en relation des éléments partageant un même représentant (ou un même identifiant).&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs variantes d&#039;Union-Find, dont notamment la compression de chemin, qui permet de n&#039;avoir qu&#039;un ou deux éléments à parcourir pour obtenir le représentant d&#039;un élément.&lt;br /&gt;
&lt;br /&gt;
Union-Find fonctionne comme un arbre. &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; a un représentant &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, etc..., qui lui même a un représentant &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, qui est son propre représentant.&lt;br /&gt;
&lt;br /&gt;
Union-Find est composé de deux méthodes :&lt;br /&gt;
* union(a, b) : associe à &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; le même représentant, par exemple &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; le représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&lt;br /&gt;
* find(a) -&amp;gt; &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; : tant que l&#039;élément n&#039;est pas son propre représentant, on applique find au représentant de l&#039;élément.&amp;lt;br&amp;gt; On commence donc par find(a), puis find(A) (si &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; est le représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;), etc... La méthode de la compression de chemin permet d&#039;éviter trop de récursivité en écrivant : représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; := &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Labyrinthes cycliques ===&lt;br /&gt;
&lt;br /&gt;
Il est possible, en retirant un certain pourcentage de murs, de créer des labyrinthes cycliques à partir des labyrinthes acycliques générés auparavant.&lt;br /&gt;
&lt;br /&gt;
Cependant, certains algorithmes de résolution n&#039;adopteront pas le même comportement.&lt;br /&gt;
&lt;br /&gt;
== Résolution ==&lt;br /&gt;
&lt;br /&gt;
Il existe là encore de nombreux algorithmes de résolution de labyrinthes, plus ou moins efficaces, et surtout ne fonctionnant pas tous dans les mêmes conditions.&lt;br /&gt;
&lt;br /&gt;
=== Parcours en profondeur ===&lt;br /&gt;
&lt;br /&gt;
Cet algorithme est quasiment identique à celui du parcours en profondeur pour la génération.&lt;br /&gt;
&lt;br /&gt;
Il est très efficace et trouvera une solution en minimisant le nombre de cases visitées.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte aux labyrinthes cycliques. En cas de boucle, il ne fera pas la boucle vu que l&#039;intersection a déjà été visitées, il reviendra sur ses pas.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte aux labyrinthes sans solution. En effet, s&#039;il n&#039;y a pas de sortie, il va revenir à sa position de départ sans position précédente (pile vide) et en ayant parcouru toutes les cases.&lt;br /&gt;
&lt;br /&gt;
=== Mur droit ===&lt;br /&gt;
&lt;br /&gt;
Cet algorithme va suivre de la main droite le mur de droite.&lt;br /&gt;
&lt;br /&gt;
Il est relativement inefficace, et va visiter un grand nombre de cases.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte assez mal aux labyrinthes cycliques. En effet, si la sortie n&#039;est pas dans la même boucle que l&#039;entrée, il ne la trouvera jamais.&lt;br /&gt;
&lt;br /&gt;
Il ne s&#039;adapte pas aux labyrinthes sans solution, et fera le tour de la grille à l&#039;infini.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:labyrinthe_exp_exhaust.png|vignette|left|500px|Labyrinthe résolu en utilisant le parcours en profondeur. &amp;lt;br&amp;gt; 660 cellules visitées, 1179 déplacements, chemin de 142 cellules.|alt=Parcours en profondeur]]&lt;br /&gt;
[[Fichier:labyrinthe_right_hand.png|vignette|right|500px|Labyrinthe résolu en utilisant le mur droit. &amp;lt;br&amp;gt; 1068 cellules visitées, 1995 déplacements, chemin de 142 cellules.|alt=Mur droit]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
&lt;br /&gt;
Mon projet total contenant plusieurs milliers de lignes de code réparties dans une dizaine de fichiers, je ne peux évidemment pas l&#039;insérer directement dans cette page.&lt;br /&gt;
&lt;br /&gt;
Le code source est disponible sur Github à [https://github.com/Rominos111/Labyrinthe_VISI201 cette adresse]&lt;br /&gt;
&lt;br /&gt;
Il suffit d&#039;avoir installé Python 3 et tkinter.&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Génération&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#Fusion_al%C3%A9atoire_de_chemins Kruskal (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_generation_algorithm#Randomized_Kruskal&#039;s_algorithm Kruskal (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#Exploration_exhaustive Parcours en profondeur (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_generation_algorithm#Randomized_Depth-First_Search Parcours en profondeur (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Résolution&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#R%C3%A9solution Résolution générale (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_solving_algorithm#Wall_follower Mur droit (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Structures de données&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Union-find Union-Find / Disjoint-Set (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Stack_(abstract_data_type) Pile / Stack (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Queue_(abstract_data_type) File / Queue (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://docs.python.org/3.6/reference/datamodel.html Classes et types de variables personnalisés (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [http://effbot.org/tkinterbook/canvas.htm Canvas Tkinter (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=G%C3%A9n%C3%A9ration_et_r%C3%A9solution_de_labyrinthes_II&amp;diff=11820</id>
		<title>Génération et résolution de labyrinthes II</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=G%C3%A9n%C3%A9ration_et_r%C3%A9solution_de_labyrinthes_II&amp;diff=11820"/>
		<updated>2019-05-19T23:48:27Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : Annulation des modifications 11819 de Rakotoanosy (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__    L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant :&lt;br /&gt;
        Autonomie énergétique souvent limitée&lt;br /&gt;
        Faible puissance des processeurs et taille réduite de la mémoire&lt;br /&gt;
        Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Représentation ==&lt;br /&gt;
&lt;br /&gt;
=== Propriétés ===&lt;br /&gt;
&lt;br /&gt;
Un labyrinthe est une grille de cellules reliées, ou non, entre elles.&lt;br /&gt;
&lt;br /&gt;
Deux cellules sont reliées entre elles par une &#039;&#039;&#039;porte&#039;&#039;&#039;, ou séparées par un &#039;&#039;&#039;mur&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Tout labyrinthe a &#039;&#039;&#039;une entrée&#039;&#039;&#039; et &#039;&#039;&#039;une sortie&#039;&#039;&#039;, et quelle que soit l&#039;entrée ou la sortie, le chemin entre ces deux cellules est &#039;&#039;&#039;unique&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Modélisation en graphe ===&lt;br /&gt;
&lt;br /&gt;
En théorie des graphes, un graphe est un ensemble de &#039;&#039;&#039;points&#039;&#039;&#039; (ou nœuds ou sommets) reliés ensemble par des &#039;&#039;&#039;lignes&#039;&#039;&#039; (ou liens ou arêtes).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:graphe_cyclique.png|vignette|left|300px|Exemple de graphe connexe cyclique non orienté|alt=Graphe cyclique]]&lt;br /&gt;
&lt;br /&gt;
Un graphe peut être &#039;&#039;&#039;connexe&#039;&#039;&#039; (en un seul morceau) ou &#039;&#039;&#039;non connexe&#039;&#039;&#039; (en plusieurs morceaux).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un graphe peut aussi être &#039;&#039;&#039;cyclique&#039;&#039;&#039; si les points sont reliés en formant une boucle ou &#039;&#039;&#039;acyclique&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, un graphe peut être &#039;&#039;&#039;orienté&#039;&#039;&#039; (si les arêtes sont à sens unique) ou &#039;&#039;&#039;non orienté&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arbre.PNG|vignette|left|300px|Exemple d&#039;arbre|alt=Arbre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un &#039;&#039;&#039;arbre&#039;&#039;&#039; est un graphe connexe, acyclique et non orienté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En plaçant un point sur chaque cellule de notre labyrinthe, et en reliant deux cellules séparées par une porte, on peut dessiner un arbre à partir de n&#039;importe quel labyrinthe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:labyrinthe_avec_arbre.png|vignette|centre|300px|Exemple de labyrinthe avec son arbre. Pour plus de simplicité, on attribue à chaque nœud une position.|alt=Labyrinthe avec arbre]]&lt;br /&gt;
&lt;br /&gt;
== Génération ==&lt;br /&gt;
&lt;br /&gt;
Un labyrinthe rectangulaire de largeur &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; et de hauteur &amp;lt;math&amp;gt; H &amp;lt;/math&amp;gt; contient exactement &amp;lt;math&amp;gt;L \times H - 1&amp;lt;/math&amp;gt; portes.&lt;br /&gt;
&lt;br /&gt;
Du point de vue du graphe, il y a donc &amp;lt;math&amp;gt;L \times H - 1&amp;lt;/math&amp;gt; arêtes.&lt;br /&gt;
&lt;br /&gt;
Maintenant, comment répartir toutes ces portes de façon à ce que toutes les cellules soient accessibles et qu&#039;il n&#039;existe qu&#039;un unique chemin entre l&#039;entrée et la sortie ?&lt;br /&gt;
&lt;br /&gt;
De nombreux algorithmes existent, dont le parcours en profondeur et l&#039;algorithme de Kruskal.&lt;br /&gt;
Chaque algorithme est différent et produit des labyrinthes visuellement différents.&lt;br /&gt;
&lt;br /&gt;
En effet, si nous comparons un labyrinthe généré avec l&#039;algorithme du parcours en profondeur à un labyrinthe généré avec l&#039;algorithme de Kruskal, bien qu&#039;ils aient tous les deux une solution unique, ils apparaissent néanmoins différents visuellement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recursive_backtracker_comparaison.png|vignette|left|500px|Parcours en profondeur.&amp;lt;br&amp;gt;On remarque des chemins proprement dessinés.|alt=Parcours en profondeur]]&lt;br /&gt;
[[Fichier:kruskal_comparaison.png|vignette|right|500px|Algorithme de Kruskal.&amp;lt;br&amp;gt;On remarque des murs de 1 de longueur çà et là.|alt=Kruskal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Parcours en profondeur ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recursive_backtracker.gif|vignette|left|500px|Illustration du parcours en profondeur|alt=Parcours en profondeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;algorithme du parcours en profondeur (&amp;quot;recursive backtracker&amp;quot; en anglais), on commence sur une cellule aléatoire dans le labyrinthe.&lt;br /&gt;
&lt;br /&gt;
On se dirige dans une direction aléatoire et on casse le mur en face, tout en marquant la cellule précédente comme visitée.&lt;br /&gt;
&lt;br /&gt;
Lorsque aucune direction n&#039;est disponible, on remonte à la position précédente.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pile.png|vignette|300px|Représentation d&#039;une pile de positions|alt=Pile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour sauvegarder l&#039;historique des positions, on peut utiliser une &#039;&#039;&#039;pile&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Une pile est une liste dans laquelle seul le dernier élément peut être récupéré.&lt;br /&gt;
&lt;br /&gt;
Une pile contient 2 méthodes :&lt;br /&gt;
* push(elem) : ajoute elem à la pile&lt;br /&gt;
* pop() -&amp;gt; elem : retourne le dernier élément de la pile (elem dans notre cas)&lt;br /&gt;
&lt;br /&gt;
Dans mon implémentation de la pile, une erreur est levée si l&#039;on appelle la méthode pop sur une pile vide.&lt;br /&gt;
&lt;br /&gt;
=== Kruskal ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:kruskal.gif|vignette|left|500px|Illustration de l&#039;algorithme de Kruskal.|alt=Kruskal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alors que pour le parcours en profondeur on partait des cellules, l&#039;algorithme de Kruskal s&#039;applique sur des murs.&lt;br /&gt;
&lt;br /&gt;
On attribue à chaque cellule un identifiant unique.&lt;br /&gt;
&lt;br /&gt;
On choisit un mur aléatoire. Si les cellules séparées par ce mur ont des identifiants différents, on leur associe le même identifiant et on casse le mur.&lt;br /&gt;
&lt;br /&gt;
Sinon, on passe à un autre mur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:union_find.png|vignette|300px|Représentation d&#039;une structure Union-Find avec find(a,b) et find(b,c).|alt=Union-Find]]&lt;br /&gt;
&lt;br /&gt;
Pour mettre en œuvre cet algorithme, on utilise une structure de données appelée &#039;&#039;&#039;Union-Find&#039;&#039;&#039;, qui permet de mettre en relation des éléments partageant un même représentant (ou un même identifiant).&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs variantes d&#039;Union-Find, dont notamment la compression de chemin, qui permet de n&#039;avoir qu&#039;un ou deux éléments à parcourir pour obtenir le représentant d&#039;un élément.&lt;br /&gt;
&lt;br /&gt;
Union-Find fonctionne comme un arbre. &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; a un représentant &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, etc..., qui lui même a un représentant &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, qui est son propre représentant.&lt;br /&gt;
&lt;br /&gt;
Union-Find est composé de deux méthodes :&lt;br /&gt;
* union(a, b) : associe à &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; le même représentant, par exemple &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; le représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&lt;br /&gt;
* find(a) -&amp;gt; &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; : tant que l&#039;élément n&#039;est pas son propre représentant, on applique find au représentant de l&#039;élément.&amp;lt;br&amp;gt; On commence donc par find(a), puis find(A) (si &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; est le représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;), etc... La méthode de la compression de chemin permet d&#039;éviter trop de récursivité en écrivant : représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; := &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Labyrinthes cycliques ===&lt;br /&gt;
&lt;br /&gt;
Il est possible, en retirant un certain pourcentage de murs, de créer des labyrinthes cycliques à partir des labyrinthes acycliques générés auparavant.&lt;br /&gt;
&lt;br /&gt;
Cependant, certains algorithmes de résolution n&#039;adopteront pas le même comportement.&lt;br /&gt;
&lt;br /&gt;
== Résolution ==&lt;br /&gt;
&lt;br /&gt;
Il existe là encore de nombreux algorithmes de résolution de labyrinthes, plus ou moins efficaces, et surtout ne fonctionnant pas tous dans les mêmes conditions.&lt;br /&gt;
&lt;br /&gt;
=== Parcours en profondeur ===&lt;br /&gt;
&lt;br /&gt;
Cet algorithme est quasiment identique à celui du parcours en profondeur pour la génération.&lt;br /&gt;
&lt;br /&gt;
Il est très efficace et trouvera une solution en minimisant le nombre de cases visitées.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte aux labyrinthes cycliques. En cas de boucle, il ne fera pas la boucle vu que l&#039;intersection a déjà été visitées, il reviendra sur ses pas.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte aux labyrinthes sans solution. En effet, s&#039;il n&#039;y a pas de sortie, il va revenir à sa position de départ sans position précédente (pile vide) et en ayant parcouru toutes les cases.&lt;br /&gt;
&lt;br /&gt;
=== Mur droit ===&lt;br /&gt;
&lt;br /&gt;
Cet algorithme va suivre de la main droite le mur de droite.&lt;br /&gt;
&lt;br /&gt;
Il est relativement inefficace, et va visiter un grand nombre de cases.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte assez mal aux labyrinthes cycliques. En effet, si la sortie n&#039;est pas dans la même boucle que l&#039;entrée, il ne la trouvera jamais.&lt;br /&gt;
&lt;br /&gt;
Il ne s&#039;adapte pas aux labyrinthes sans solution, et fera le tour de la grille à l&#039;infini.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:labyrinthe_exp_exhaust.png|vignette|left|500px|Labyrinthe résolu en utilisant le parcours en profondeur. &amp;lt;br&amp;gt; 660 cellules visitées, 1179 déplacements, chemin de 142 cellules.|alt=Parcours en profondeur]]&lt;br /&gt;
[[Fichier:labyrinthe_right_hand.png|vignette|right|500px|Labyrinthe résolu en utilisant le mur droit. &amp;lt;br&amp;gt; 1068 cellules visitées, 1995 déplacements, chemin de 142 cellules.|alt=Mur droit]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
&lt;br /&gt;
Mon projet total contenant plusieurs milliers de lignes de code réparties dans une dizaine de fichiers, je ne peux évidemment pas l&#039;insérer directement dans cette page.&lt;br /&gt;
&lt;br /&gt;
Le code source est disponible sur Github à [https://github.com/Rominos111/Labyrinthe_VISI201 cette adresse]&lt;br /&gt;
&lt;br /&gt;
Il suffit d&#039;avoir installé Python 3 et tkinter.&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Génération&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#Fusion_al%C3%A9atoire_de_chemins Kruskal (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_generation_algorithm#Randomized_Kruskal&#039;s_algorithm Kruskal (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#Exploration_exhaustive Parcours en profondeur (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_generation_algorithm#Randomized_Depth-First_Search Parcours en profondeur (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Résolution&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#R%C3%A9solution Résolution générale (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_solving_algorithm#Wall_follower Mur droit (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Structures de données&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Union-find Union-Find / Disjoint-Set (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Stack_(abstract_data_type) Pile / Stack (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Queue_(abstract_data_type) File / Queue (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://docs.python.org/3.6/reference/datamodel.html Classes et types de variables personnalisés (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [http://effbot.org/tkinterbook/canvas.htm Canvas Tkinter (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=G%C3%A9n%C3%A9ration_et_r%C3%A9solution_de_labyrinthes_II&amp;diff=11819</id>
		<title>Génération et résolution de labyrinthes II</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=G%C3%A9n%C3%A9ration_et_r%C3%A9solution_de_labyrinthes_II&amp;diff=11819"/>
		<updated>2019-05-19T23:47:40Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Autonomie énergétique souvent limitée&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Faible puissance des processeurs et taille réduite de la mémoire&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Disponibilité « aléatoire » de l’accès aux réseaux de communication&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Représentation ==&lt;br /&gt;
&lt;br /&gt;
=== Propriétés ===&lt;br /&gt;
&lt;br /&gt;
Un labyrinthe est une grille de cellules reliées, ou non, entre elles.&lt;br /&gt;
&lt;br /&gt;
Deux cellules sont reliées entre elles par une &#039;&#039;&#039;porte&#039;&#039;&#039;, ou séparées par un &#039;&#039;&#039;mur&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Tout labyrinthe a &#039;&#039;&#039;une entrée&#039;&#039;&#039; et &#039;&#039;&#039;une sortie&#039;&#039;&#039;, et quelle que soit l&#039;entrée ou la sortie, le chemin entre ces deux cellules est &#039;&#039;&#039;unique&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Modélisation en graphe ===&lt;br /&gt;
&lt;br /&gt;
En théorie des graphes, un graphe est un ensemble de &#039;&#039;&#039;points&#039;&#039;&#039; (ou nœuds ou sommets) reliés ensemble par des &#039;&#039;&#039;lignes&#039;&#039;&#039; (ou liens ou arêtes).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:graphe_cyclique.png|vignette|left|300px|Exemple de graphe connexe cyclique non orienté|alt=Graphe cyclique]]&lt;br /&gt;
&lt;br /&gt;
Un graphe peut être &#039;&#039;&#039;connexe&#039;&#039;&#039; (en un seul morceau) ou &#039;&#039;&#039;non connexe&#039;&#039;&#039; (en plusieurs morceaux).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un graphe peut aussi être &#039;&#039;&#039;cyclique&#039;&#039;&#039; si les points sont reliés en formant une boucle ou &#039;&#039;&#039;acyclique&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, un graphe peut être &#039;&#039;&#039;orienté&#039;&#039;&#039; (si les arêtes sont à sens unique) ou &#039;&#039;&#039;non orienté&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arbre.PNG|vignette|left|300px|Exemple d&#039;arbre|alt=Arbre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un &#039;&#039;&#039;arbre&#039;&#039;&#039; est un graphe connexe, acyclique et non orienté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En plaçant un point sur chaque cellule de notre labyrinthe, et en reliant deux cellules séparées par une porte, on peut dessiner un arbre à partir de n&#039;importe quel labyrinthe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:labyrinthe_avec_arbre.png|vignette|centre|300px|Exemple de labyrinthe avec son arbre. Pour plus de simplicité, on attribue à chaque nœud une position.|alt=Labyrinthe avec arbre]]&lt;br /&gt;
&lt;br /&gt;
== Génération ==&lt;br /&gt;
&lt;br /&gt;
Un labyrinthe rectangulaire de largeur &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; et de hauteur &amp;lt;math&amp;gt; H &amp;lt;/math&amp;gt; contient exactement &amp;lt;math&amp;gt;L \times H - 1&amp;lt;/math&amp;gt; portes.&lt;br /&gt;
&lt;br /&gt;
Du point de vue du graphe, il y a donc &amp;lt;math&amp;gt;L \times H - 1&amp;lt;/math&amp;gt; arêtes.&lt;br /&gt;
&lt;br /&gt;
Maintenant, comment répartir toutes ces portes de façon à ce que toutes les cellules soient accessibles et qu&#039;il n&#039;existe qu&#039;un unique chemin entre l&#039;entrée et la sortie ?&lt;br /&gt;
&lt;br /&gt;
De nombreux algorithmes existent, dont le parcours en profondeur et l&#039;algorithme de Kruskal.&lt;br /&gt;
Chaque algorithme est différent et produit des labyrinthes visuellement différents.&lt;br /&gt;
&lt;br /&gt;
En effet, si nous comparons un labyrinthe généré avec l&#039;algorithme du parcours en profondeur à un labyrinthe généré avec l&#039;algorithme de Kruskal, bien qu&#039;ils aient tous les deux une solution unique, ils apparaissent néanmoins différents visuellement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recursive_backtracker_comparaison.png|vignette|left|500px|Parcours en profondeur.&amp;lt;br&amp;gt;On remarque des chemins proprement dessinés.|alt=Parcours en profondeur]]&lt;br /&gt;
[[Fichier:kruskal_comparaison.png|vignette|right|500px|Algorithme de Kruskal.&amp;lt;br&amp;gt;On remarque des murs de 1 de longueur çà et là.|alt=Kruskal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Parcours en profondeur ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recursive_backtracker.gif|vignette|left|500px|Illustration du parcours en profondeur|alt=Parcours en profondeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;algorithme du parcours en profondeur (&amp;quot;recursive backtracker&amp;quot; en anglais), on commence sur une cellule aléatoire dans le labyrinthe.&lt;br /&gt;
&lt;br /&gt;
On se dirige dans une direction aléatoire et on casse le mur en face, tout en marquant la cellule précédente comme visitée.&lt;br /&gt;
&lt;br /&gt;
Lorsque aucune direction n&#039;est disponible, on remonte à la position précédente.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pile.png|vignette|300px|Représentation d&#039;une pile de positions|alt=Pile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour sauvegarder l&#039;historique des positions, on peut utiliser une &#039;&#039;&#039;pile&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Une pile est une liste dans laquelle seul le dernier élément peut être récupéré.&lt;br /&gt;
&lt;br /&gt;
Une pile contient 2 méthodes :&lt;br /&gt;
* push(elem) : ajoute elem à la pile&lt;br /&gt;
* pop() -&amp;gt; elem : retourne le dernier élément de la pile (elem dans notre cas)&lt;br /&gt;
&lt;br /&gt;
Dans mon implémentation de la pile, une erreur est levée si l&#039;on appelle la méthode pop sur une pile vide.&lt;br /&gt;
&lt;br /&gt;
=== Kruskal ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:kruskal.gif|vignette|left|500px|Illustration de l&#039;algorithme de Kruskal.|alt=Kruskal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alors que pour le parcours en profondeur on partait des cellules, l&#039;algorithme de Kruskal s&#039;applique sur des murs.&lt;br /&gt;
&lt;br /&gt;
On attribue à chaque cellule un identifiant unique.&lt;br /&gt;
&lt;br /&gt;
On choisit un mur aléatoire. Si les cellules séparées par ce mur ont des identifiants différents, on leur associe le même identifiant et on casse le mur.&lt;br /&gt;
&lt;br /&gt;
Sinon, on passe à un autre mur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:union_find.png|vignette|300px|Représentation d&#039;une structure Union-Find avec find(a,b) et find(b,c).|alt=Union-Find]]&lt;br /&gt;
&lt;br /&gt;
Pour mettre en œuvre cet algorithme, on utilise une structure de données appelée &#039;&#039;&#039;Union-Find&#039;&#039;&#039;, qui permet de mettre en relation des éléments partageant un même représentant (ou un même identifiant).&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs variantes d&#039;Union-Find, dont notamment la compression de chemin, qui permet de n&#039;avoir qu&#039;un ou deux éléments à parcourir pour obtenir le représentant d&#039;un élément.&lt;br /&gt;
&lt;br /&gt;
Union-Find fonctionne comme un arbre. &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; a un représentant &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, etc..., qui lui même a un représentant &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, qui est son propre représentant.&lt;br /&gt;
&lt;br /&gt;
Union-Find est composé de deux méthodes :&lt;br /&gt;
* union(a, b) : associe à &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; le même représentant, par exemple &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; le représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&lt;br /&gt;
* find(a) -&amp;gt; &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; : tant que l&#039;élément n&#039;est pas son propre représentant, on applique find au représentant de l&#039;élément.&amp;lt;br&amp;gt; On commence donc par find(a), puis find(A) (si &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; est le représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;), etc... La méthode de la compression de chemin permet d&#039;éviter trop de récursivité en écrivant : représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; := &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Labyrinthes cycliques ===&lt;br /&gt;
&lt;br /&gt;
Il est possible, en retirant un certain pourcentage de murs, de créer des labyrinthes cycliques à partir des labyrinthes acycliques générés auparavant.&lt;br /&gt;
&lt;br /&gt;
Cependant, certains algorithmes de résolution n&#039;adopteront pas le même comportement.&lt;br /&gt;
&lt;br /&gt;
== Résolution ==&lt;br /&gt;
&lt;br /&gt;
Il existe là encore de nombreux algorithmes de résolution de labyrinthes, plus ou moins efficaces, et surtout ne fonctionnant pas tous dans les mêmes conditions.&lt;br /&gt;
&lt;br /&gt;
=== Parcours en profondeur ===&lt;br /&gt;
&lt;br /&gt;
Cet algorithme est quasiment identique à celui du parcours en profondeur pour la génération.&lt;br /&gt;
&lt;br /&gt;
Il est très efficace et trouvera une solution en minimisant le nombre de cases visitées.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte aux labyrinthes cycliques. En cas de boucle, il ne fera pas la boucle vu que l&#039;intersection a déjà été visitées, il reviendra sur ses pas.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte aux labyrinthes sans solution. En effet, s&#039;il n&#039;y a pas de sortie, il va revenir à sa position de départ sans position précédente (pile vide) et en ayant parcouru toutes les cases.&lt;br /&gt;
&lt;br /&gt;
=== Mur droit ===&lt;br /&gt;
&lt;br /&gt;
Cet algorithme va suivre de la main droite le mur de droite.&lt;br /&gt;
&lt;br /&gt;
Il est relativement inefficace, et va visiter un grand nombre de cases.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte assez mal aux labyrinthes cycliques. En effet, si la sortie n&#039;est pas dans la même boucle que l&#039;entrée, il ne la trouvera jamais.&lt;br /&gt;
&lt;br /&gt;
Il ne s&#039;adapte pas aux labyrinthes sans solution, et fera le tour de la grille à l&#039;infini.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:labyrinthe_exp_exhaust.png|vignette|left|500px|Labyrinthe résolu en utilisant le parcours en profondeur. &amp;lt;br&amp;gt; 660 cellules visitées, 1179 déplacements, chemin de 142 cellules.|alt=Parcours en profondeur]]&lt;br /&gt;
[[Fichier:labyrinthe_right_hand.png|vignette|right|500px|Labyrinthe résolu en utilisant le mur droit. &amp;lt;br&amp;gt; 1068 cellules visitées, 1995 déplacements, chemin de 142 cellules.|alt=Mur droit]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
&lt;br /&gt;
Mon projet total contenant plusieurs milliers de lignes de code réparties dans une dizaine de fichiers, je ne peux évidemment pas l&#039;insérer directement dans cette page.&lt;br /&gt;
&lt;br /&gt;
Le code source est disponible sur Github à [https://github.com/Rominos111/Labyrinthe_VISI201 cette adresse]&lt;br /&gt;
&lt;br /&gt;
Il suffit d&#039;avoir installé Python 3 et tkinter.&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Génération&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#Fusion_al%C3%A9atoire_de_chemins Kruskal (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_generation_algorithm#Randomized_Kruskal&#039;s_algorithm Kruskal (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#Exploration_exhaustive Parcours en profondeur (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_generation_algorithm#Randomized_Depth-First_Search Parcours en profondeur (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Résolution&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#R%C3%A9solution Résolution générale (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_solving_algorithm#Wall_follower Mur droit (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Structures de données&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Union-find Union-Find / Disjoint-Set (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Stack_(abstract_data_type) Pile / Stack (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Queue_(abstract_data_type) File / Queue (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://docs.python.org/3.6/reference/datamodel.html Classes et types de variables personnalisés (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [http://effbot.org/tkinterbook/canvas.htm Canvas Tkinter (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=G%C3%A9n%C3%A9ration_et_r%C3%A9solution_de_labyrinthes_II&amp;diff=11818</id>
		<title>Génération et résolution de labyrinthes II</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=G%C3%A9n%C3%A9ration_et_r%C3%A9solution_de_labyrinthes_II&amp;diff=11818"/>
		<updated>2019-05-19T23:46:50Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__    L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant :&lt;br /&gt;
        Autonomie énergétique souvent limitée&lt;br /&gt;
        Faible puissance des processeurs et taille réduite de la mémoire&lt;br /&gt;
        Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment. Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Représentation ==&lt;br /&gt;
&lt;br /&gt;
=== Propriétés ===&lt;br /&gt;
&lt;br /&gt;
Un labyrinthe est une grille de cellules reliées, ou non, entre elles.&lt;br /&gt;
&lt;br /&gt;
Deux cellules sont reliées entre elles par une &#039;&#039;&#039;porte&#039;&#039;&#039;, ou séparées par un &#039;&#039;&#039;mur&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Tout labyrinthe a &#039;&#039;&#039;une entrée&#039;&#039;&#039; et &#039;&#039;&#039;une sortie&#039;&#039;&#039;, et quelle que soit l&#039;entrée ou la sortie, le chemin entre ces deux cellules est &#039;&#039;&#039;unique&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Modélisation en graphe ===&lt;br /&gt;
&lt;br /&gt;
En théorie des graphes, un graphe est un ensemble de &#039;&#039;&#039;points&#039;&#039;&#039; (ou nœuds ou sommets) reliés ensemble par des &#039;&#039;&#039;lignes&#039;&#039;&#039; (ou liens ou arêtes).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:graphe_cyclique.png|vignette|left|300px|Exemple de graphe connexe cyclique non orienté|alt=Graphe cyclique]]&lt;br /&gt;
&lt;br /&gt;
Un graphe peut être &#039;&#039;&#039;connexe&#039;&#039;&#039; (en un seul morceau) ou &#039;&#039;&#039;non connexe&#039;&#039;&#039; (en plusieurs morceaux).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un graphe peut aussi être &#039;&#039;&#039;cyclique&#039;&#039;&#039; si les points sont reliés en formant une boucle ou &#039;&#039;&#039;acyclique&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, un graphe peut être &#039;&#039;&#039;orienté&#039;&#039;&#039; (si les arêtes sont à sens unique) ou &#039;&#039;&#039;non orienté&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arbre.PNG|vignette|left|300px|Exemple d&#039;arbre|alt=Arbre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un &#039;&#039;&#039;arbre&#039;&#039;&#039; est un graphe connexe, acyclique et non orienté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En plaçant un point sur chaque cellule de notre labyrinthe, et en reliant deux cellules séparées par une porte, on peut dessiner un arbre à partir de n&#039;importe quel labyrinthe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:labyrinthe_avec_arbre.png|vignette|centre|300px|Exemple de labyrinthe avec son arbre. Pour plus de simplicité, on attribue à chaque nœud une position.|alt=Labyrinthe avec arbre]]&lt;br /&gt;
&lt;br /&gt;
== Génération ==&lt;br /&gt;
&lt;br /&gt;
Un labyrinthe rectangulaire de largeur &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; et de hauteur &amp;lt;math&amp;gt; H &amp;lt;/math&amp;gt; contient exactement &amp;lt;math&amp;gt;L \times H - 1&amp;lt;/math&amp;gt; portes.&lt;br /&gt;
&lt;br /&gt;
Du point de vue du graphe, il y a donc &amp;lt;math&amp;gt;L \times H - 1&amp;lt;/math&amp;gt; arêtes.&lt;br /&gt;
&lt;br /&gt;
Maintenant, comment répartir toutes ces portes de façon à ce que toutes les cellules soient accessibles et qu&#039;il n&#039;existe qu&#039;un unique chemin entre l&#039;entrée et la sortie ?&lt;br /&gt;
&lt;br /&gt;
De nombreux algorithmes existent, dont le parcours en profondeur et l&#039;algorithme de Kruskal.&lt;br /&gt;
Chaque algorithme est différent et produit des labyrinthes visuellement différents.&lt;br /&gt;
&lt;br /&gt;
En effet, si nous comparons un labyrinthe généré avec l&#039;algorithme du parcours en profondeur à un labyrinthe généré avec l&#039;algorithme de Kruskal, bien qu&#039;ils aient tous les deux une solution unique, ils apparaissent néanmoins différents visuellement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recursive_backtracker_comparaison.png|vignette|left|500px|Parcours en profondeur.&amp;lt;br&amp;gt;On remarque des chemins proprement dessinés.|alt=Parcours en profondeur]]&lt;br /&gt;
[[Fichier:kruskal_comparaison.png|vignette|right|500px|Algorithme de Kruskal.&amp;lt;br&amp;gt;On remarque des murs de 1 de longueur çà et là.|alt=Kruskal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Parcours en profondeur ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recursive_backtracker.gif|vignette|left|500px|Illustration du parcours en profondeur|alt=Parcours en profondeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;algorithme du parcours en profondeur (&amp;quot;recursive backtracker&amp;quot; en anglais), on commence sur une cellule aléatoire dans le labyrinthe.&lt;br /&gt;
&lt;br /&gt;
On se dirige dans une direction aléatoire et on casse le mur en face, tout en marquant la cellule précédente comme visitée.&lt;br /&gt;
&lt;br /&gt;
Lorsque aucune direction n&#039;est disponible, on remonte à la position précédente.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pile.png|vignette|300px|Représentation d&#039;une pile de positions|alt=Pile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour sauvegarder l&#039;historique des positions, on peut utiliser une &#039;&#039;&#039;pile&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Une pile est une liste dans laquelle seul le dernier élément peut être récupéré.&lt;br /&gt;
&lt;br /&gt;
Une pile contient 2 méthodes :&lt;br /&gt;
* push(elem) : ajoute elem à la pile&lt;br /&gt;
* pop() -&amp;gt; elem : retourne le dernier élément de la pile (elem dans notre cas)&lt;br /&gt;
&lt;br /&gt;
Dans mon implémentation de la pile, une erreur est levée si l&#039;on appelle la méthode pop sur une pile vide.&lt;br /&gt;
&lt;br /&gt;
=== Kruskal ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:kruskal.gif|vignette|left|500px|Illustration de l&#039;algorithme de Kruskal.|alt=Kruskal]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alors que pour le parcours en profondeur on partait des cellules, l&#039;algorithme de Kruskal s&#039;applique sur des murs.&lt;br /&gt;
&lt;br /&gt;
On attribue à chaque cellule un identifiant unique.&lt;br /&gt;
&lt;br /&gt;
On choisit un mur aléatoire. Si les cellules séparées par ce mur ont des identifiants différents, on leur associe le même identifiant et on casse le mur.&lt;br /&gt;
&lt;br /&gt;
Sinon, on passe à un autre mur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:union_find.png|vignette|300px|Représentation d&#039;une structure Union-Find avec find(a,b) et find(b,c).|alt=Union-Find]]&lt;br /&gt;
&lt;br /&gt;
Pour mettre en œuvre cet algorithme, on utilise une structure de données appelée &#039;&#039;&#039;Union-Find&#039;&#039;&#039;, qui permet de mettre en relation des éléments partageant un même représentant (ou un même identifiant).&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs variantes d&#039;Union-Find, dont notamment la compression de chemin, qui permet de n&#039;avoir qu&#039;un ou deux éléments à parcourir pour obtenir le représentant d&#039;un élément.&lt;br /&gt;
&lt;br /&gt;
Union-Find fonctionne comme un arbre. &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; a un représentant &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, etc..., qui lui même a un représentant &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;, qui est son propre représentant.&lt;br /&gt;
&lt;br /&gt;
Union-Find est composé de deux méthodes :&lt;br /&gt;
* union(a, b) : associe à &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; et &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; le même représentant, par exemple &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; le représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&lt;br /&gt;
* find(a) -&amp;gt; &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; : tant que l&#039;élément n&#039;est pas son propre représentant, on applique find au représentant de l&#039;élément.&amp;lt;br&amp;gt; On commence donc par find(a), puis find(A) (si &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; est le représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;), etc... La méthode de la compression de chemin permet d&#039;éviter trop de récursivité en écrivant : représentant de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; := &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Labyrinthes cycliques ===&lt;br /&gt;
&lt;br /&gt;
Il est possible, en retirant un certain pourcentage de murs, de créer des labyrinthes cycliques à partir des labyrinthes acycliques générés auparavant.&lt;br /&gt;
&lt;br /&gt;
Cependant, certains algorithmes de résolution n&#039;adopteront pas le même comportement.&lt;br /&gt;
&lt;br /&gt;
== Résolution ==&lt;br /&gt;
&lt;br /&gt;
Il existe là encore de nombreux algorithmes de résolution de labyrinthes, plus ou moins efficaces, et surtout ne fonctionnant pas tous dans les mêmes conditions.&lt;br /&gt;
&lt;br /&gt;
=== Parcours en profondeur ===&lt;br /&gt;
&lt;br /&gt;
Cet algorithme est quasiment identique à celui du parcours en profondeur pour la génération.&lt;br /&gt;
&lt;br /&gt;
Il est très efficace et trouvera une solution en minimisant le nombre de cases visitées.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte aux labyrinthes cycliques. En cas de boucle, il ne fera pas la boucle vu que l&#039;intersection a déjà été visitées, il reviendra sur ses pas.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte aux labyrinthes sans solution. En effet, s&#039;il n&#039;y a pas de sortie, il va revenir à sa position de départ sans position précédente (pile vide) et en ayant parcouru toutes les cases.&lt;br /&gt;
&lt;br /&gt;
=== Mur droit ===&lt;br /&gt;
&lt;br /&gt;
Cet algorithme va suivre de la main droite le mur de droite.&lt;br /&gt;
&lt;br /&gt;
Il est relativement inefficace, et va visiter un grand nombre de cases.&lt;br /&gt;
&lt;br /&gt;
Il s&#039;adapte assez mal aux labyrinthes cycliques. En effet, si la sortie n&#039;est pas dans la même boucle que l&#039;entrée, il ne la trouvera jamais.&lt;br /&gt;
&lt;br /&gt;
Il ne s&#039;adapte pas aux labyrinthes sans solution, et fera le tour de la grille à l&#039;infini.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:labyrinthe_exp_exhaust.png|vignette|left|500px|Labyrinthe résolu en utilisant le parcours en profondeur. &amp;lt;br&amp;gt; 660 cellules visitées, 1179 déplacements, chemin de 142 cellules.|alt=Parcours en profondeur]]&lt;br /&gt;
[[Fichier:labyrinthe_right_hand.png|vignette|right|500px|Labyrinthe résolu en utilisant le mur droit. &amp;lt;br&amp;gt; 1068 cellules visitées, 1995 déplacements, chemin de 142 cellules.|alt=Mur droit]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
&lt;br /&gt;
Mon projet total contenant plusieurs milliers de lignes de code réparties dans une dizaine de fichiers, je ne peux évidemment pas l&#039;insérer directement dans cette page.&lt;br /&gt;
&lt;br /&gt;
Le code source est disponible sur Github à [https://github.com/Rominos111/Labyrinthe_VISI201 cette adresse]&lt;br /&gt;
&lt;br /&gt;
Il suffit d&#039;avoir installé Python 3 et tkinter.&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
Génération&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#Fusion_al%C3%A9atoire_de_chemins Kruskal (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_generation_algorithm#Randomized_Kruskal&#039;s_algorithm Kruskal (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#Exploration_exhaustive Parcours en profondeur (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_generation_algorithm#Randomized_Depth-First_Search Parcours en profondeur (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Résolution&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_de_labyrinthe#R%C3%A9solution Résolution générale (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Maze_solving_algorithm#Wall_follower Mur droit (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Structures de données&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://fr.wikipedia.org/wiki/Union-find Union-Find / Disjoint-Set (fr)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Stack_(abstract_data_type) Pile / Stack (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://en.wikipedia.org/wiki/Queue_(abstract_data_type) File / Queue (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://docs.python.org/3.6/reference/datamodel.html Classes et types de variables personnalisés (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [http://effbot.org/tkinterbook/canvas.htm Canvas Tkinter (en)] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11817</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11817"/>
		<updated>2019-05-19T23:45:12Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des par-feu que l&#039;on pouvait rencontrer avec le protocole Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11816</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11816"/>
		<updated>2019-05-19T23:43:34Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT sur Websocket */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des par-feu que l&#039;on pouvait rencontrer avec le protocole Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11815</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11815"/>
		<updated>2019-05-19T23:43:20Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT sur Websocket */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, on conserve les avantages de la technologie pub/sub avec Mqtt tout en évitant le problème des par-feu que l&#039;on pouvait rencontrer avec Mqtt.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11814</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11814"/>
		<updated>2019-05-19T23:42:04Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Protocole Hybride */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui est bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, l&#039;on conserve les avantages de la technologie pub/sub avec Mqtt et notre protocole fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11813</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11813"/>
		<updated>2019-05-19T23:39:59Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT sur Websocket */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, l&#039;on conserve les avantages de la technologie pub/sub avec Mqtt et notre protocole fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11812</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11812"/>
		<updated>2019-05-19T23:39:34Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT sur Websocket */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:MQTT sur Websocket.png]]&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, l&#039;on conserve les avantages de la technologie pub/sub avec Mqtt et notre protocole fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:MQTT_sur_Websocket.png&amp;diff=11811</id>
		<title>Fichier:MQTT sur Websocket.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:MQTT_sur_Websocket.png&amp;diff=11811"/>
		<updated>2019-05-19T23:39:19Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11810</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11810"/>
		<updated>2019-05-19T23:34:55Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT sur Websocket */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaient notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour notre protocole hybride, l&#039;idée serai d&#039;ouvrir un canal de communication Websocket entre le broker et le client. &lt;br /&gt;
&lt;br /&gt;
Lorsque l&#039;on envoie le message mqtt au broker, on le place dans un paquet websocket puis on l&#039;envoi au broker. Lorsque le serveur reçoit le paquet, il l&#039;ouvre et traite le message Mqtt contenu comme il l&#039;aurai fait avec un message mqtt &amp;quot;normal&amp;quot;. On fait de même lorsque le broker envoie un message au client qui c&#039;est abonner.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;illustrer de la façon suivante : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ainsi puisque le protocole Websocket se sert du port 80, l&#039;on conserve les avantages de la technologie pub/sub avec Mqtt et notre protocole fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11809</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11809"/>
		<updated>2019-05-19T23:07:07Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT sur Websocket */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole étaientt notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11808</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11808"/>
		<updated>2019-05-19T23:06:35Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole était notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11807</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11807"/>
		<updated>2019-05-19T23:04:26Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole était notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11806</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11806"/>
		<updated>2019-05-19T23:04:08Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Client–serveur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Sans état&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Avec mise en cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;En couches&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Interface uniforme&#039;&#039;&#039;&lt;br /&gt;
L&#039;interface uniforme est la contraintes fondamentale d&#039;une architecture REST car c&#039;est celle-ci qui permet à chaque composant d&#039;évoluer indépendamment. Elle est définit par 4 contraintes :&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification des ressources dans les requêtes&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Manipulation des ressources par des représentations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Messages auto-descriptifs&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hypermédia comme moteur d&#039;état de l&#039;application&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole était notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11805</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11805"/>
		<updated>2019-05-19T22:50:36Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Protocole Hybride */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole était notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11804</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11804"/>
		<updated>2019-05-19T22:50:19Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Protocole Hybride */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Avantages REST:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient REST:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole était notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11803</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11803"/>
		<updated>2019-05-19T22:49:41Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Service pub/sub avec REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien dans la base de données du serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Avantages REST:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Inconvénient REST:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole était notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11802</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11802"/>
		<updated>2019-05-19T22:34:40Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT sur des Websocket */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Avantages REST:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Inconvénient REST:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur Websocket===&lt;br /&gt;
&lt;br /&gt;
Le protocole Websocket est un protocole qui vise à développer un canal de communication web sur une connexion TCP.&lt;br /&gt;
&lt;br /&gt;
Les objectifs de ce protocole était notamment de permettre au serveur l&#039;envoi de données vers le client en mode push (sans que l&#039;utilisateur n&#039;ai à faire une requête).&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11801</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11801"/>
		<updated>2019-05-19T21:37:58Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Protocole Hybride */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole mqtt,qui bloquer par certain par feu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Avantages REST:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;protocole http(port 80) passe partout dans le monde&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;on peut traiter le message directement sur le serveur&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Inconvénient REST:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un transfère rapide des informations&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;un stockage des messages automatiques&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;une gestion de la qualité de service&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur des Websocket===&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11800</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11800"/>
		<updated>2019-05-19T21:34:47Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- Transfère rapide des informations&lt;br /&gt;
 &lt;br /&gt;
- stockage des messages automatiques&lt;br /&gt;
  &lt;br /&gt;
- gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
 &lt;br /&gt;
- protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Avantages REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- protocole http(port 80) passe partout dans le monde&lt;br /&gt;
 &lt;br /&gt;
- on peut traiter le message directement sur le serveur&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Inconvénient REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&lt;br /&gt;
- un transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
- un stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
- une gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
- le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur des Websocket===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Publish-subscribe Pub/Sub]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/MQTT MQTT]&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Representational_state_transfer REST]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/WebSocket Websocket]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11799</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11799"/>
		<updated>2019-05-19T21:31:18Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT sur des Websocket */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- Transfère rapide des informations&lt;br /&gt;
 &lt;br /&gt;
- stockage des messages automatiques&lt;br /&gt;
  &lt;br /&gt;
- gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
 &lt;br /&gt;
- protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Avantages REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- protocole http(port 80) passe partout dans le monde&lt;br /&gt;
 &lt;br /&gt;
- on peut traiter le message directement sur le serveur&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Inconvénient REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&lt;br /&gt;
- un transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
- un stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
- une gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
- le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur des Websocket===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/paho-mqtt/ paho-mqtt]&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11798</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11798"/>
		<updated>2019-05-19T21:28:55Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- Transfère rapide des informations&lt;br /&gt;
 &lt;br /&gt;
- stockage des messages automatiques&lt;br /&gt;
  &lt;br /&gt;
- gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
 &lt;br /&gt;
- protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Avantages REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- protocole http(port 80) passe partout dans le monde&lt;br /&gt;
 &lt;br /&gt;
- on peut traiter le message directement sur le serveur&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Inconvénient REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&lt;br /&gt;
- un transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
- un stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
- une gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
- le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur des Websocket===&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11797</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11797"/>
		<updated>2019-05-19T21:26:51Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Mosquitto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- Transfère rapide des informations&lt;br /&gt;
 &lt;br /&gt;
- stockage des messages automatiques&lt;br /&gt;
  &lt;br /&gt;
- gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
 &lt;br /&gt;
- protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Avantages REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- protocole http(port 80) passe partout dans le monde&lt;br /&gt;
 &lt;br /&gt;
- on peut traiter le message directement sur le serveur&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Inconvénient REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&lt;br /&gt;
- un transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
- un stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
- une gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
- le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur des Websocket===&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11796</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11796"/>
		<updated>2019-05-19T21:26:34Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Mosquitto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nous nous en somme servit ici sur une MachineVirtuel Ubuntu en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- Transfère rapide des informations&lt;br /&gt;
 &lt;br /&gt;
- stockage des messages automatiques&lt;br /&gt;
  &lt;br /&gt;
- gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
 &lt;br /&gt;
- protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Avantages REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- protocole http(port 80) passe partout dans le monde&lt;br /&gt;
 &lt;br /&gt;
- on peut traiter le message directement sur le serveur&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Inconvénient REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&lt;br /&gt;
- un transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
- un stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
- une gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
- le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur des Websocket===&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11795</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11795"/>
		<updated>2019-05-19T21:25:13Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Protocole Hybride */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avantages Pub/Sub :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- Transfère rapide des informations&lt;br /&gt;
 &lt;br /&gt;
- stockage des messages automatiques&lt;br /&gt;
  &lt;br /&gt;
- gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inconvénient Pub/Sub:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
 &lt;br /&gt;
- protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Avantages REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- protocole http(port 80) passe partout dans le monde&lt;br /&gt;
 &lt;br /&gt;
- on peut traiter le message directement sur le serveur&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Inconvénient REST:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&lt;br /&gt;
- un transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
- un stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
- une gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
- le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur des Websocket===&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11794</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11794"/>
		<updated>2019-05-19T21:23:11Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Protocole Hybride */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
 - Transfère rapide des informations&lt;br /&gt;
 &lt;br /&gt;
 - stockage des messages automatiques&lt;br /&gt;
  &lt;br /&gt;
 - gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
 - On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
 &lt;br /&gt;
 - protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
 - protocole http(port 80) passe partout dans le monde&lt;br /&gt;
 &lt;br /&gt;
 - on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
 - On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&lt;br /&gt;
- un transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
- un stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
- une gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
- le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur des Websocket===&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11793</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11793"/>
		<updated>2019-05-19T21:22:11Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Protocole Hybride */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
- Transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
- stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
- gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
- On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
&lt;br /&gt;
- protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
- protocole http(port 80) passe partout dans le monde&lt;br /&gt;
&lt;br /&gt;
- on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
- On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole hybride est de réaliser un système pub/sub tel que l&#039;on ai:&lt;br /&gt;
&lt;br /&gt;
- un transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
- un stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
- une gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
- le protocole http (port 80) de sorte à ce qu&#039;il fonctionne partout dans le monde.&lt;br /&gt;
&lt;br /&gt;
Pour cela, nous allons nous servir des Websockets.&lt;br /&gt;
&lt;br /&gt;
===MQTT sur des Websocket===&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11791</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11791"/>
		<updated>2019-05-19T21:11:48Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Service pub/sub avec REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST à l&#039;aide de GET et de POST qui agissent sur une base de données géré par un serveur:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
-Transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
-stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
-gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
-On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
&lt;br /&gt;
-protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
-protocole http(port 80) passe partout dans le monde&lt;br /&gt;
&lt;br /&gt;
-on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
-On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11790</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11790"/>
		<updated>2019-05-19T21:10:43Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Service pub/sub avec REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST avec des GET et des POST:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PubSub avec REST.png]]&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
-Transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
-stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
-gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
-On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
&lt;br /&gt;
-protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
-protocole http(port 80) passe partout dans le monde&lt;br /&gt;
&lt;br /&gt;
-on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
-On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:PubSub_avec_REST.png&amp;diff=11789</id>
		<title>Fichier:PubSub avec REST.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:PubSub_avec_REST.png&amp;diff=11789"/>
		<updated>2019-05-19T21:10:20Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11788</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11788"/>
		<updated>2019-05-19T21:09:57Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* Mosquitto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
Sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST avec des GET et des POST:&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
-Transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
-stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
-gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
-On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
&lt;br /&gt;
-protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
-protocole http(port 80) passe partout dans le monde&lt;br /&gt;
&lt;br /&gt;
-on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
-On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11786</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11786"/>
		<updated>2019-05-19T21:09:18Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST avec des GET et des POST:&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
-Transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
-stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
-gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
-On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
&lt;br /&gt;
-protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
-protocole http(port 80) passe partout dans le monde&lt;br /&gt;
&lt;br /&gt;
-on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
-On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11785</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11785"/>
		<updated>2019-05-19T21:08:58Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST avec des GET et des POST:&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
-Transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
-stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
-gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
-On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
&lt;br /&gt;
-protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
-protocole http(port 80) passe partout dans le monde&lt;br /&gt;
&lt;br /&gt;
-on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
-On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11784</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11784"/>
		<updated>2019-05-19T21:08:47Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST avec des GET et des POST:&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
-Transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
-stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
-gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
-On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
&lt;br /&gt;
-protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
-protocole http(port 80) passe partout dans le monde&lt;br /&gt;
&lt;br /&gt;
-on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
-On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11783</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11783"/>
		<updated>2019-05-19T21:08:33Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : /* MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST avec des GET et des POST:&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
-Transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
-stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
-gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
-On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
&lt;br /&gt;
-protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
-protocole http(port 80) passe partout dans le monde&lt;br /&gt;
&lt;br /&gt;
-on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
-On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11782</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11782"/>
		<updated>2019-05-19T21:08:15Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|left|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST avec des GET et des POST:&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
-Transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
-stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
-gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
-On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
&lt;br /&gt;
-protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
-protocole http(port 80) passe partout dans le monde&lt;br /&gt;
&lt;br /&gt;
-on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
-On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11780</id>
		<title>Rest &amp; Pub-Sub : protocole hybride pour l&#039;IoT</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Rest_%26_Pub-Sub_:_protocole_hybride_pour_l%27IoT&amp;diff=11780"/>
		<updated>2019-05-19T21:07:34Z</updated>

		<summary type="html">&lt;p&gt;Rakotoanosy : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
MQTT, Message Queuing Telemetry Transport, est un protocole publish/subscribe se basant sur le protocole TCP/IP.&lt;br /&gt;
Il a été créé par Andy Stanford-Clark et Arlen Nipper.&lt;br /&gt;
&lt;br /&gt;
De façon concrète, MQTT permet à des appareils de publier des informations sur un sujet donné sur un broker (un serveur qui fonctionne comme un coursier) qui va les retransmettre aux appareils abonnés à ce sujet. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Fonctionnement broker mqtt.png|600px|thumb|illustration d&#039;un échange entre un client 1 &amp;quot;subscriber&amp;quot; et un client 2 &amp;quot;publisher&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MQTT gère aussi la qualité de service (d&#039;une qualité 0 à une qualité 2):&lt;br /&gt;
&lt;br /&gt;
Qualité 0: le client qui publie une donnée ne reçoit aucune information par rapport à la confirmation de son arrivé.&lt;br /&gt;
&lt;br /&gt;
Qualité 1: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker.&lt;br /&gt;
&lt;br /&gt;
Qualité 2: le client qui publie reçoit la confirmation ou non que la donnée publier à été reçu par le broker ainsi qu&#039;un message lui indiquant que le client qui s&#039;abonne à reçu la donnée.&lt;br /&gt;
===Mosquitto===&lt;br /&gt;
Mosquitto est un broker open-source qui se sert du protocole MQTT. Il permet une fois installé de se familiarisé avec MQTT et le &amp;quot;publish/subscribe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
nous nous en somme servit ici en publiant en localhost:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Mosquitto exemple.png]]&lt;br /&gt;
&lt;br /&gt;
sur un premier terminal on s&#039;abonne à un topic &amp;quot;température&amp;quot; et sur un deuxième terminal, on publie ensuite sur ce même topic des nombres (qui s&#039;apparentent à des température). Au fur et à mesure que nous publions ces informations, nous les recevons sur le premier terminal. &lt;br /&gt;
Mosquitto remplit bien ici son rôle de broker.&lt;br /&gt;
&lt;br /&gt;
===Pub/Sub avec Python===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite développer un client &#039;&#039;publisher&#039;&#039; et un client &#039;&#039;subscriber&#039;&#039; en python grâce à la librairie paho-mqtt.&lt;br /&gt;
Pour plus de simplicité et éviter des problèmes de timing, nous avons tout regrouper en un seul programme:&lt;br /&gt;
&lt;br /&gt;
    import paho.mqtt.client as mqtt&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    broker=&amp;quot;test.mosquitto.org&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def envoi_message(client, QoS, message):&lt;br /&gt;
        print(&amp;quot;message reçu :&amp;quot;, str(message.payload.decode(&amp;quot;utf-8&amp;quot;)))&lt;br /&gt;
    &lt;br /&gt;
    client= mqtt.Client(&amp;quot;client_test&amp;quot;)&lt;br /&gt;
    client.on_message=envoi_message&lt;br /&gt;
    &lt;br /&gt;
    client.connect(broker)&lt;br /&gt;
    print(&amp;quot;connection&amp;quot;)&lt;br /&gt;
    client.loop_start()&lt;br /&gt;
    client.subscribe(&amp;quot;Cafetière/temperature_cafe&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Abonnement...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    pub= input(&amp;quot;entrez une température (un nombre):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Publication...&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.publish(&amp;quot;Cafetière/temperature_cafe&amp;quot;,pub +&amp;quot;°C&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    client.disconnect()&lt;br /&gt;
    print(&amp;quot;deconnection&amp;quot;)&lt;br /&gt;
    client.loop_stop()&lt;br /&gt;
Comme broker, nous nous somme servit ici d&#039;un broker mit en libre service par mosquitto.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
REST (Representational State Transfer) aussi appeler restful est une architecture logiciel inventer par Roy Fielding qui se sert des verbes HTTP comme identifiant des opérations et des réponses HTTP comme représentation des ressources.&lt;br /&gt;
&lt;br /&gt;
Une architecture REST est définit par 5 règles/contraintes :&lt;br /&gt;
&lt;br /&gt;
- Client–serveur&lt;br /&gt;
&lt;br /&gt;
- Sans état&lt;br /&gt;
&lt;br /&gt;
- Avec mise en cache&lt;br /&gt;
&lt;br /&gt;
- En couches&lt;br /&gt;
&lt;br /&gt;
- Interface uniforme&lt;br /&gt;
&lt;br /&gt;
===Service pub/sub avec REST===&lt;br /&gt;
On peut réaliser un équivalent de service pub/sub avec REST avec des GET et des POST:&lt;br /&gt;
&lt;br /&gt;
Cette méthode comprend cependant de nombreux problèmes, notamment le fait que le client 1 ne sais pas si le client 2 à poster une donnée sur le serveur. On ne peut pas vraiment parler ici de service publish/subscribe car il n&#039;y a pas d&#039;abonnement, le client qui devrait s&#039;abonner doit aller récupérer lui-même la donnée sans savoir si elle est bien situer sur le serveur.&lt;br /&gt;
&lt;br /&gt;
==Protocole Hybride==&lt;br /&gt;
&lt;br /&gt;
La technologie Pub/Sub et la technologie REST ont toutes deux leurs avantages et leurs inconvénients:&lt;br /&gt;
&lt;br /&gt;
Avantages Pub/Sub :&lt;br /&gt;
&lt;br /&gt;
-Transfère rapide des informations&lt;br /&gt;
&lt;br /&gt;
-stockage des messages automatiques&lt;br /&gt;
 &lt;br /&gt;
-gestion de la qualité de service&lt;br /&gt;
&lt;br /&gt;
Inconvénient Pub/Sub:&lt;br /&gt;
&lt;br /&gt;
-On ne peut pas faire d’action direct sur le message, on ne fait un traitement dessus que lorsqu&#039;on l&#039;a reçu.&lt;br /&gt;
&lt;br /&gt;
-protocole mqtt,qui bloquer par certain par feu&lt;br /&gt;
&lt;br /&gt;
Avantages REST:&lt;br /&gt;
&lt;br /&gt;
-protocole http(port 80) passe partout dans le monde&lt;br /&gt;
&lt;br /&gt;
-on peut traiter le message directement sur le serveur&lt;br /&gt;
&lt;br /&gt;
Inconvénient REST:&lt;br /&gt;
&lt;br /&gt;
-On doit installer un serveur web, on doit géré une base de donnée (ou XML, Json).&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du protocole&lt;/div&gt;</summary>
		<author><name>Rakotoanosy</name></author>
	</entry>
</feed>