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:30] – [Objectif] 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] | ||
Ligne 7: | Ligne 8: | ||
* **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 75: | 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 89: | Ligne 94: | ||
s = socket.socket(socket.AF_INET, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
while True: | while True: | ||
Ligne 100: | 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 121: | Ligne 126: | ||
<code bash> | <code bash> | ||
- | %python3 | + | %python3 |
Traceback (most recent call last): | Traceback (most recent call last): | ||
File " | File " | ||
Ligne 130: | 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 141: | 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 152: | 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 182: | 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 199: | Ligne 204: | ||
msg = "{}, {}, {}" | msg = "{}, {}, {}" | ||
- | s.sendto (msg.encode(), | + | s.sendto (msg.encode(), |
time.sleep(10) | time.sleep(10) | ||
</ | </ | ||
Ligne 210: | 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 215: | 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 233: | 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 244: | 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 250: | Ligne 256: | ||
s = socket.socket(socket.AF_INET, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
samples =0 | samples =0 |