====== Raspberry : premier websocket client et serveur ======
===== Le websocket serveur =====
Au niveau du Raspberry, le **Websocket serveur** est créé avec le langage **Python** et nécessite une **programmation asynchrone** des échanges de messages entre le client et le serveur. Le **module asyncio** est donc **nécessaire** pour gérer un websocket en Python.
Pour installer pip3
$ sudo apt install python3-pip
==== Installation du module python websocket ====
* lancez un terminal et puis installez le module websocket en utilisant le gestionnaire de paquets Python3 pip3 :
$ pip3 install websockets
==== Programme python de base du serveur ====
Le **websocket serveur** doit être en **permanence** en attente des **connexions clientes** en précisant :
* quel **traitement** faire dès qu'il y a une connexion client en précisant la **fonction à exécuter**,
* et préciser l'**adresse IP et le port d'écoute**.
Voici l'**instruction de base** de la **création** d'un websocket serveur pour le Rapsberry :
lancement_serveur = websockets.serve(echange,'10.3.141.1', 5678)
**Explications : ** \
* le premier paramètre est la **fonction** qui sera exécutée à chaque connexion cliente. Comme cette fonction ne doit pas être exécutée maintenant, on **ne met pas de parenthèses**.
* l'adresse IP est celle du point d'accès Wifi du Raspberry ; le choix du port est libre du moment que la valeur ne soir pas celle d'un port réservé à des services réseaux existant. Ici le port 5678 est utilisé.
Liste des ports réseaux : http://www.frameip.com/liste-des-ports-tcp-udp/
* envoyer des messages
await websocket.send("Message à envoyer.")
Le mot clé **await**, en association avec le mot clé **async** permet de ne pas bloquer le reste du programme le temps du traitement de l'instruction
* recevoir des messages
messagerecu = await websocket.recv()
Voici un premier programme **serveur.py** avec l'utilisation d'une **boucle d'événemen**t. Dès q'une connexion est **établie**, ce serveur envoie le message **Bonjour** :
#!/usr/bin/env python3
import asyncio
import websockets
# Definir la fonction qui sera appelee par le serveur a la connexion d'un client
async def echange(websocket,path):
# recevoir un message ;
messagerecu = await websocket.recv()
print(messagerecu)
# envoyer un message
await websocket.send("Bonjour")
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 de base du client : la page index.html =====
Dans la page Web HTML, le script **javascript** va créer un **client WebSocket** en utilisant la bibliothèque (API) WebSocket afin de **communiquer** avec le **serveur WebSocket** du Raspberry grâce au **protocole WebSocket**.
==== Création d'un objet Websocket ====
L'instruction suivante permet d'ouvrir une connexion websocket vers le serveur :
var websockets = new WebSocket("ws://10.3.141.1:5678/");
**Explications** : \\
* la **variable websocket** va contenir la connexion vers le serveur,
* le **protocole** est **ws** suivi de l'**adresse IP et du port d'écoute** du serveur websocket.
==== Recevoir des données du serveur ====
Quand un **message arrive** du serveur, un événement (**event**) **message** est envoyé à la fonction **onmessage()**. Pour utiliser ce message voici un exemple de code :
ws.onmessage = function (event) {
//afficheEtat(event.data);
alert(event.data);
};
==== Envoyer des données au serveur ====
Les messages sont **envoyés** avec la fonction **send()**. Cependant, les connexions étant asynchrones, l'envoi du **premier message** immédiatement après la création de la connexion **peut échouer**. Il est alors préférable
ws.onopen = function (event) {
ws.send("J'envoie un premier message au serveur.");
};
==== Le code complet de ce premier exemple ====
Voici le code HTML complet de ce premier exemple. Une balise **%%%%** est utilisé pour visualiser la réponse du serveur :
En attente d'un message du serveur
Les messages **textuels** échangés lors d'une connexion Websocket sont au **format UTF-8**.
==== Les activités ... ====
[[.:accueil|Je reviens à la liste des activités.]]