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 Prochaine révisionLes deux révisions suivantes | ||
reseaux:tp:serialisation [2021/12/20 17:57] – [1.3 JSON] phil | reseaux:tp:serialisation [2021/12/21 18:48] – [1.2 Client / Serveur] 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 86: | ||
</ | </ | ||
+ | {{ : | ||
=== 1.2 Client / Serveur === | === 1.2 Client / Serveur === | ||
* **Serveur** | * **Serveur** | ||
Ligne 87: | Ligne 101: | ||
s = socket.socket(socket.AF_INET, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
while True: | while True: | ||
Ligne 150: | Ligne 164: | ||
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 163: | Ligne 177: | ||
print (f" | print (f" | ||
print (" | print (" | ||
+ | </ | ||
+ | |||
+ | * //Exemple de résultat// | ||
+ | |||
+ | < | ||
+ | C: | ||
+ | b' | ||
+ | Valeur de l' | ||
+ | Moyenne : | ||
+ | b' | ||
+ | Valeur de l' | ||
+ | Moyenne : | ||
</ | </ | ||
Ligne 185: | Ligne 211: | ||
msg = "{}, {}, {}" | msg = "{}, {}, {}" | ||
- | s.sendto (msg.encode(), | + | s.sendto (msg.encode(), |
time.sleep(10) | time.sleep(10) | ||
</ | </ | ||
Ligne 196: | Ligne 222: | ||
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 224: | Ligne 251: | ||
Le programme ci-dessous calcul la moyenne des trois variables en effectuant les opérations suivantes : \\ | Le programme ci-dessous calcul la moyenne des trois variables en effectuant les opérations suivantes : \\ | ||
- | - désérialise la chaîne de caractères reçue grâce à la fonction loads du module json, \\ | + | - **désérialise** la chaîne de caractères reçue grâce à la fonction loads du module json, \\ |
- | - loads crée une structure Python ; dans notre cas un tableau de 3 éléments, \\ | + | - **loads** crée une structure Python ; dans notre cas un tableau de 3 éléments, \\ |
- | - fait le calcul de moyenne en additionnant pour chacun des 3 éléments reçus. \\ | + | - fait le calcul de **moyenne** en additionnant pour chacun des 3 éléments reçus. \\ |
\\ | \\ | ||
- | 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 pyton minimalserver2.py> | ||
Ligne 236: | Ligne 263: | ||
s = socket.socket(socket.AF_INET, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
samples =0 | samples =0 | ||
Ligne 248: | Ligne 275: | ||
print (data, " | print (data, " | ||
- | j = json.loads(data) | + | j = json.loads(data) |
print (j) | print (j) | ||
Ligne 259: | Ligne 286: | ||
</ | </ | ||
- | * ** Client - Envoi de valeurs multiples** | ||
- | On transmet la température, | ||
- | <code python minimal_client3.py> | ||
- | from virtual_sensor import virtual_sensor | ||
- | import time | ||
- | import socket | ||
- | |||
- | temperature = virtual_sensor(start=20, | ||
- | pressure | ||
- | humidity | ||
- | |||
- | s = socket.socket(socket.AF_INET, | ||
- | |||
- | while True: | ||
- | t = temperature.read_value() | ||
- | p = pressure.read_value() | ||
- | h = humidity.read_value() | ||
- | |||
- | msg = "{}, {}, {}" | ||
- | s.sendto (msg.encode(), | ||
- | time.sleep(10) | ||
- | </ |