====== Raspberry : utiliser le format JSON pour les messages ====== ===== Présentation ===== Quand les **messages** à échanger sont **simples**, une **chaîne de caractères** comme un mot ou une phrase suffisent. Dès que les **messages** doivent contenir des **données différentes**, il est préférable de les **structurer** pour faciliter leur interprétation par le destinaire du message. Le **format JSON** (JavaScript Object Notation – Notation Objet issue de JavaScript) est un **format texte léger** d'échange de données, **facile à lire ou à écrire** pour des humains et complètement **indépendant** de tout langage. JSON se base sur **deux structures** : * Une **collection de couples nom/valeur** qui s'apparente à un **objet en javascript**, un **tableau associatif**ou un **dictionnaire en python** : * on commence la collection commence par **{ (accolade gauche)** et on la termine par **} (accolade droite)**, * chaque **nom** est suivi de **: (deux-points)** puis de la **valeur**, * les **couples nom/valeur** sont **séparés par une , (virgule)**. * Une **liste de valeurs ordonnées** ce qui correspond à un **tableau**, un vecteur, une liste ou une suite : * Un **tableau** commence par **[ (crochet gauche)** et se termine par **] (crochet droit)**. Les valeurs sont séparées par une **, (virgule)**. Pour en savoir plus : https://www.json.org/json-fr.html ===== Mise en oeuvre coté serveur ===== ==== Envoi des messages au format JSON ==== Le **module json** doit être **importé** dans le programme Python : import json Exemple si le serveur doit **envoyer toutes les secondes** un message avec un numéro. On peut alors envoyer ces informations au format **JSON** en définissant : * le texte à envoyer : **Bonjour**, * le numéro associé : un **entier** qui** commence à 1** et qui est **incrémenté de 1** à chaque **seconde**. Voici le **dictionnaire** en python que le programme serveur doit créer **avant** de le **transformer** au format JSON et la **fonction** de gestion de l'envoi des messages : # initialisation du dictionnaire pour le premier envoi messageEnvoye = { 'texte': 'Bonjour ', 'numero': 1, }; # Gestion de l'envoi des messages du serveur au client async def gestion_envoi_message(websocket): # boucle infinie pour envoyer toutes les secondes un message ; while True: # formatage du dictionnaire messageEnvoye au format JSON messageEnvoyeJSON = json.dumps(messageEnvoye) # envoi du message au format JSON await websocket.send(messageEnvoyeJSON ) # incrémenter le numéro du message messageEnvoye ["numero"] = messageEnvoye ["numero"] + 1 # attendre une seconde await asyncio.sleep(1) ==== Réception des messages au format JSON ==== Le serveur va recevoir un message du client. Dans le même ordre d'idée, le message **reçu** comportera aussi un **numéro incrémenté de 1**. Ce message reçu sera au format JSON et il faudra le **transformer en dictionnaire python** pour accéder aux différentes données qu'il contient. Voici le dictionnaire python attendu : messageRecu = { 'texteDebut': 'J\'envoie message ', "numero": 1, "texteFin": " au serveur.", } Voici la **fonction** de gestion de la réception des **messages au format JSON** du client : # Gestion des messages recus du client au format JSON async def gestion_reception_message(websocket): while True: # reception des messages d'un client messageRecuJSON = await websocket.recv() # conversion du message format JSON en dictionnaire Python messageRecu=json.loads(messageRecuJSON) print(" {} {} {}".format(messageRecu["texteDebut"],messageRecu["numero"],messageRecu["texteFin"],)) ===== Mise en oeuvre coté client ===== ==== Envoi des messages au format JSON ==== Comme **l'envoi** des messages se fait en **cliquant sur le bouton** de la page, il n'est **plus nécessaire** de gérer l'événement initial **ws.onopen**. On peut supprimer la gestion de cet événement. Voici le **tableau associatif** en javascript que le programme client doit créer **avant** de le **transformer** au format JSON et la **fonction** de gestion de l'envoi des messages : // création du message initial en tableau associatif var messageEnvoye = { 'texteDebut' : 'J\'envoie message ', 'numero': 1, 'texteFin': ' au serveur.', }; // fonction qui envoie un message au format JSON au serveur function envoyerMessage() { // la methode stringify() convertit le tableau assiociatif au formart JSON messageEnvoyeJSON = JSON.stringify(messageEnvoye ); ws.send(messageEnvoyeJSON ); // incrementer le numero du message messageEnvoye["numero"] += 1; } ==== Réception des messages au format JSON ==== Le **client** va **recevoir** les messages du serveur au **format JSON**. Ces messages reçus doivent être **transformés en tableau associatif javascript** pour accéder aux différentes données qu'ils contiennent. ws.onmessage = function (event) { //affiche le message recu dans la balise //la methode parse() convertit le message recu au format JSON en tableau associatif javascript messageRecu = JSON.parse(event.data) affichemessage.innerHTML = messageRecu["texte"] + messageRecu["numero"]; Vous pouvez **à la fois** : * envoyer un message au serveur * et **recevoir** en même temps un message du serveur Pour **visualiser l'envoi et la réception simultanés** des messages, cliquez sur le bouton de la page et observez l'**affichage du print** dans le terminal du Raspberry Le **code complet** : * du programme **Python** : {{:isn:websocket3.py.pdf|}} * de la page HTML : {{:isn:page2.html.pdf|}} ==== Les activités ... ==== [[.:accueil|Je reviens à la liste des activités.]]