====== Raspberry : un websocket pour recevoir et envoyer des messages en même temps ======
Le premier programme de Websocket serveur en python :
* **écoutait** tout d'abord le message envoyé par le client (la page html) qui se connecte,
* avant **d'envoyer** le message de bienvenu (Bonjour).
Pour, **à la fois recevoir et envoyer des messages** sur la **même connexion**, on combine les deux fonctions **send()** et **recv()** en les faisant s'exécuter dans des **tâches parallèles** :
#!/usr/bin/env python3
import asyncio
import websockets
# Gestion de l'envoi des messages du serveur au client
async def gestion_envoi_message(websocket):
i = 0
# boucle infinie pour envoyer toutes les secondes un message ;
while True:
await websocket.send("Bonjour {}".format(nb))
i = i + 1
await asyncio.sleep(1)
# Gestion des messages recus du client
async def gestion_reception_message(websocket):
while True:
# reception du message d'un client
message = await websocket.recv()
print(message)
# fonction lancee à chaque connexion d'un client
async def echange(websocket,path): # définir la fonction comme asynchrone
#envoyer des messages en parallèle
envoyer = asyncio.ensure_future(gestion_envoi_message(websocket))
#recevoir message en parallèle
recevoir = asyncio.ensure_future(gestion_reception_message(websocket))
termine, attente = await asyncio.wait(
[envoyer, recevoir],
return_when = asyncio.FIRST_COMPLETED,
)
# Definir la fonction qui sera appelee par le serveur a la connexion d'un client
lancement_serveur = websockets.serve(echange,'10.3.141.1', 5678)
# Creation de la boucle d'evenement (event loop)
loop = asyncio.get_event_loop()
loop.run_until_complete(lancement_serveur)
loop.run_forever()
loop.close()
* pour lancer le serveur ouvrez le terminal et lancez l'exéuction du programme python :
$ python3 serveur.py
===== Programme javascript du client =====
Dans la page Web HTML :
* la balise **%%%%** affiche les messages envoyés toutes les secondes par le serveur,
* un bouton HTML est ajouté pour déclencher à la demande l'envoi d'un message au serveur.
En attente d'un message du serveur
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
===== Envoyer plusieurs message en même temps =====
Il peut être utile d'**envoyer en même temps plusieurs messages** et non les uns à la suite des autres. C'est le cas par exemple pour :
* faire **avancer** la voiture et,
* faire **tourner** en même temps les roues.
Dans la fonction du **programme serveur** qui traite de la **réception** des message vous pouvez lancer des **tâches parallèles** de la manière suivante :
async def gestion_reception_message(websocket):
while True:
# reception du messsage d'un client
message = await websocket.recv()
print(message)
# lancement de la tache qui gere le deplacement avant/arriere de la voiture
asyncio.get_event_loop().create_task(deplacement(message))
# lancement de la tache qui gere la direction droite ou gauche
asyncio.get_event_loop().create_task(direction(message))
Il reste à écrire les fonctions correspondantes **deplacement()** et **direction()** qui doivent **analyser le contenu du message** pour savoir **le sens du déplacement** (avant ou arrière) ainsi que **la direction à prendre** (droite ou gauche.
==== Les activités ... ====
[[.:accueil|Je reviens à la liste des activités.]]