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/21 18:29] – [1. Emulation en Python] 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 74: | 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 88: | Ligne 94: | ||
s = socket.socket(socket.AF_INET, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
while True: | while True: | ||
Ligne 99: | 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 120: | Ligne 126: | ||
<code bash> | <code bash> | ||
- | %python3 | + | %python3 |
Traceback (most recent call last): | Traceback (most recent call last): | ||
File " | File " | ||
Ligne 129: | 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 140: | 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 151: | 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 181: | 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 198: | Ligne 204: | ||
msg = "{}, {}, {}" | msg = "{}, {}, {}" | ||
- | s.sendto (msg.encode(), | + | s.sendto (msg.encode(), |
time.sleep(10) | time.sleep(10) | ||
</ | </ | ||
Ligne 209: | 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 214: | 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 232: | 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 243: | 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 249: | Ligne 256: | ||
s = socket.socket(socket.AF_INET, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
samples =0 | samples =0 |