Différences
Ci-dessous, les différences entre deux révisions de la page.
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] phil | reseaux: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 " | * **Source** : Mooc Fun " | ||
* **Vidéo** sur YouTube: < | * **Vidéo** sur YouTube: < | ||
+ | |||
+ | ---- | ||
=== Objectif === | === Objectif === | ||
Emuler un capteur mesurant des données météorologiques (température, | Emuler un capteur mesurant des données météorologiques (température, | ||
+ | |||
+ | ---- | ||
==== 1. Emulation en Python ==== | ==== 1. Emulation en Python ==== | ||
=== 1.1 Module d’émulation des capteurs === | === 1.1 Module d’émulation des capteurs === | ||
+ | |||
Le module // | Le module // | ||
Ligne 73: | Ligne 79: | ||
</ | </ | ||
+ | {{ : | ||
=== 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 | + | <code python |
''' | ''' | ||
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, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
while True: | while True: | ||
Ligne 98: | Ligne 105: | ||
Le programme suivant (// | Le programme suivant (// | ||
- | <code python | + | <code python |
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 | + | %python3 |
Traceback (most recent call last): | Traceback (most recent call last): | ||
File " | File " | ||
Ligne 128: | Ligne 135: | ||
<note tip>On résoud ce problème en remplaçant, | <note tip>On résoud ce problème en remplaçant, | ||
- | 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 | + | 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 |
< | < | ||
Ligne 139: | Ligne 146: | ||
* // | * // | ||
- | <code python | + | <code python |
''' | ''' | ||
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, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
samples = 0 # Numéro de l' | samples = 0 # Numéro de l' | ||
Ligne 180: | Ligne 187: | ||
On transmet la température, | On transmet la température, | ||
- | <code python | + | <code python |
from virtual_sensor import virtual_sensor | from virtual_sensor import virtual_sensor | ||
import time | import time | ||
Ligne 197: | Ligne 204: | ||
msg = "{}, {}, {}" | msg = "{}, {}, {}" | ||
- | s.sendto (msg.encode(), | + | s.sendto (msg.encode(), |
time.sleep(10) | time.sleep(10) | ||
</ | </ | ||
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' | 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' | ||
+ | {{ : | ||
=== 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 | + | <code python |
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(), | + | s.sendto (json.dumps(j).encode(), |
time.sleep(10) | time.sleep(10) | ||
</ | </ | ||
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. \\ | ||
- | < | + | < |
import socket | import socket | ||
import binascii | import binascii | ||
Ligne 248: | Ligne 256: | ||
s = socket.socket(socket.AF_INET, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
samples =0 | samples =0 |