reseaux:tp:serialisation

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
reseaux:tp:serialisation [2021/12/20 18:15] – [1.3 JSON] philreseaux:tp:serialisation [2021/12/21 18:57] (Version actuelle) phil
Ligne 2: Ligne 2:
  
 ===== TP - Envoi de données structurée (sérialisation) ===== ===== TP - Envoi de données structurée (sérialisation) =====
 +
 [Mise à jour le 20/12/2021] [Mise à jour le 20/12/2021]
  
   * **Source** : Mooc Fun "Programmer l'internet des objets"   * **Source** : Mooc Fun "Programmer l'internet des objets"
   * **Vidéo** sur YouTube: <html><a href="https://www.youtube.com/watch?time_continue=228&v=mRuEiwa7Z74&feature=emb_logo" target="_blank">La sérialisation</a></html>   * **Vidéo** sur YouTube: <html><a href="https://www.youtube.com/watch?time_continue=228&v=mRuEiwa7Z74&feature=emb_logo" target="_blank">La sérialisation</a></html>
 +
 +----
  
 === Objectif === === Objectif ===
 Emuler un capteur mesurant des données météorologiques (température, humidité, pression) et les envoyer sur un serveur pour traitement. Le but de cette manipulation est de mettre en place la chaîne complète de traitement pour étudier les différents mécanismes de représentation des données. Emuler un capteur mesurant des données météorologiques (température, humidité, pression) et les envoyer sur un serveur pour traitement. Le but de cette manipulation est de mettre en place la chaîne complète de traitement pour étudier les différents mécanismes de représentation des données.
 +
 +----
  
 ==== 1. Emulation en Python ==== ==== 1. Emulation en Python ====
  
 === 1.1 Module d’émulation des capteurs === === 1.1 Module d’émulation des capteurs ===
 +
 Le module //virtual_sensor.py// permet d’émuler des capteurs afin que chaque instance de la classe puisse envoyer des valeurs plausibles de température, pression et humidité. Le module //virtual_sensor.py// permet d’émuler des capteurs afin que chaque instance de la classe puisse envoyer des valeurs plausibles de température, pression et humidité.
  
Ligne 73: Ligne 79:
 </code> </code>
  
 +{{ :reseaux:tp:clientserveur.png?nolink&100|}}
 === 1.2 Client / Serveur === === 1.2 Client / Serveur ===
   * **Serveur**   * **Serveur**
 Le code ci-dessous permet de visualiser les données que les capteurs vont envoyer. Le code ci-dessous permet de visualiser les données que les capteurs vont envoyer.
  
-<code python minimal_serveur.py> +<code python serveur1.py> 
 ''' '''
 Ce programme utilise une socket UDP pour communiquer sur le port 33033  Ce programme utilise une socket UDP pour communiquer sur le port 33033 
Ligne 87: Ligne 94:
  
 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-s.bind(('127.0.0.1', 33033))+s.bind(('0.0.0.0', 33033))
  
 while True: while True:
Ligne 98: Ligne 105:
 Le programme suivant (//minimal_client1.py//) permet d’envoyer la température. Le programme suivant (//minimal_client1.py//) permet d’envoyer la température.
  
-<code python minimal_client1.py>+<code python client1.py>
 from virtual_sensor import virtual_sensor  from virtual_sensor import virtual_sensor 
 import time import time
Ligne 119: Ligne 126:
  
 <code bash> <code bash>
-%python3 minimal_client1.py+%python3 client1.py
 Traceback (most recent call last): Traceback (most recent call last):
 File "minimal_client1.py", line 11, in <module> File "minimal_client1.py", line 11, in <module>
Ligne 128: Ligne 135:
 <note tip>On résoud ce problème en remplaçant, dans le code précédent, l'émission de la variable t par **str(t).encode()** qui va transformer en **chaîne de caractères** le contenu de la variable t puis en **tableau d’octets** (encode()). </note> <note tip>On résoud ce problème en remplaçant, dans le code précédent, l'émission de la variable t par **str(t).encode()** qui va transformer en **chaîne de caractères** le contenu de la variable t puis en **tableau d’octets** (encode()). </note>
  
-Le programme //minimal_server.py// affiche le résultat suivant. La première colonne indique la séquence reçue et la seconde colonne donne sa valeur en hexadécimal (par exemple, le caractère ”2” est codé en hexadécimal par la valeur  0x32).+Le programme //server1.py// affiche le résultat suivant. La première colonne indique la séquence reçue et la seconde colonne donne sa valeur en hexadécimal (par exemple, le caractère ”2” est codé en hexadécimal par la valeur  0x32).
  
 <code> <code>
Ligne 139: Ligne 146:
     * //Objectif// : calculer la moyenne des températures reçues. Il s’agit de désérialiser la séquence reçue pour la transformer en un nombre flottant. La fonction float permet de transformer une chaîne de caractères en nombre flottant.     * //Objectif// : calculer la moyenne des températures reçues. Il s’agit de désérialiser la séquence reçue pour la transformer en un nombre flottant. La fonction float permet de transformer une chaîne de caractères en nombre flottant.
  
-<code python minimalserver1.py>+<code python server1a.py>
 ''' '''
 Ce programme utilise une socket UDP pour communiquer sur le port 33033  Ce programme utilise une socket UDP pour communiquer sur le port 33033 
 puis attendre des données pour les afficher en hexadécimal et en ASCII. puis attendre des données pour les afficher en hexadécimal et en ASCII.
  
-Modification de serveur.py : calcule la moyenne des températures reçues+Modification de serveur1.py : calcule la moyenne des températures reçues
 ''' '''
 import socket import socket
Ligne 150: Ligne 157:
  
 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-s.bind(('127.0.0.1', 33033))+s.bind(('0.0.0.0', 33034))
  
 samples = 0 # Numéro de l'échantillon reçu samples = 0 # Numéro de l'échantillon reçu
Ligne 180: Ligne 187:
 On transmet la température, la pression et l’humidité dans un même message.  On transmet la température, la pression et l’humidité dans un même message. 
  
-<code python minimal_client3.py>+<code python client2.py>
 from virtual_sensor import virtual_sensor  from virtual_sensor import virtual_sensor 
 import time import time
Ligne 197: Ligne 204:
  
     msg = "{}, {}, {}".format(t, p, h)     msg = "{}, {}, {}".format(t, p, h)
-    s.sendto (msg.encode(), ("127.0.0.1", 33033))+    s.sendto (msg.encode(), ("127.0.0.1", 33034))
     time.sleep(10)     time.sleep(10)
 </code> </code>
Ligne 208: Ligne 215:
 Coder la désérialisation est beaucoup plus complexe que sérialiser. Il faut prendre en compte tous les possiblités de codage d'un nombre. Par exemple, pour la valeur 10 : 10 10.0 +10 1e1, l'ajout d'espaces, de tabulation de retour à la ligne. Les modules JSON permettent de simplifier les mises en oeuvre avec du code déjà écrit et éprouvé, pour une grande variété de structures et de données. Coder la désérialisation est beaucoup plus complexe que sérialiser. Il faut prendre en compte tous les possiblités de codage d'un nombre. Par exemple, pour la valeur 10 : 10 10.0 +10 1e1, l'ajout d'espaces, de tabulation de retour à la ligne. Les modules JSON permettent de simplifier les mises en oeuvre avec du code déjà écrit et éprouvé, pour une grande variété de structures et de données.
  
 +{{ :reseaux:tp:json.png?nolink&100|}}
 === 1.3 JSON === === 1.3 JSON ===
 Le plus simple pour transmettre des données multiples est d’utiliser le codage **JSON**. En Python, le module json offre les outils de **sérialisation** (**dumps**) et de **désérialisation** (**loads**) qui facilitent grandement la programmation. Le plus simple pour transmettre des données multiples est d’utiliser le codage **JSON**. En Python, le module json offre les outils de **sérialisation** (**dumps**) et de **désérialisation** (**loads**) qui facilitent grandement la programmation.
Ligne 213: Ligne 221:
 Le programme suivant illustre la sérialisation en mettant les trois mesures dans un tableau : Le programme suivant illustre la sérialisation en mettant les trois mesures dans un tableau :
  
-<code python minimal_client4.py>+<code python client3.py>
 rom virtual_sensor import virtual_sensor  rom virtual_sensor import virtual_sensor 
 import time import time
Ligne 231: Ligne 239:
  
     j = [t, p, h]     j = [t, p, h]
-    s.sendto (json.dumps(j).encode(), ("127.0.0.1", 33033))+    s.sendto (json.dumps(j).encode(), ("127.0.0.1", 33035))
     time.sleep(10)     time.sleep(10)
 </code> </code>
Ligne 242: Ligne 250:
 Calcule également la **taille maximale** du message échangé entre le client et le serveur. \\ Calcule également la **taille maximale** du message échangé entre le client et le serveur. \\
  
-<code pyton minimalserver2.py>+<code python server2.py>
 import socket import socket
 import binascii import binascii
Ligne 248: Ligne 256:
  
 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-s.bind(('0.0.0.0', 33033))+s.bind(('0.0.0.0', 33035))
  
 samples =0 samples =0
  • reseaux/tp/serialisation.1640020508.txt.gz
  • Dernière modification : 2021/12/20 18:15
  • de phil