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:33] – [1.1 Module d’émulation des capteurs] phil | reseaux:tp:serialisation [2021/12/21 18:57] (Version actuelle) – phil | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
[[reseaux: | [[reseaux: | ||
- | ====== 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 7: | ||
* **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, | ||
Ligne 17: | Ligne 16: | ||
==== 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 84: | 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 98: | Ligne 94: | ||
s = socket.socket(socket.AF_INET, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
while True: | while True: | ||
Ligne 109: | 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 130: | Ligne 126: | ||
<code bash> | <code bash> | ||
- | %python3 | + | %python3 |
Traceback (most recent call last): | Traceback (most recent call last): | ||
File " | File " | ||
Ligne 139: | 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 150: | 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 161: | 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 191: | 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 208: | Ligne 204: | ||
msg = "{}, {}, {}" | msg = "{}, {}, {}" | ||
- | s.sendto (msg.encode(), | + | s.sendto (msg.encode(), |
time.sleep(10) | time.sleep(10) | ||
</ | </ | ||
Ligne 219: | 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 224: | 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 242: | 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 253: | 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 259: | Ligne 256: | ||
s = socket.socket(socket.AF_INET, | s = socket.socket(socket.AF_INET, | ||
- | s.bind((' | + | s.bind((' |
samples =0 | samples =0 |