Bonjour,
Depuis la création de l'application Windows et Android on me demande comment marche l'échange notamment du coté Raspberry Pi. Pour cela rien de très compliqué je créer un serveur de socket qui en fonction de chaque demande exécuter une commande, lit un GPIO ou écrit un GPIO.
Dernièrement j'ai fait évoluer se serveur de socket en utilisant une classe Python qui gère la réception de socket de façon événementielle. J'y intègre aussi une seconde classe qui me permet de récupérer facilement des informations système.
I - Le programme principale
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import Socket_Event
import subprocess
import RPi.GPIO as GPIO
from Sys_Info import *
# Variables globale
DEBUT_TRAME = "R"
FIN_TRAME = "I"
SEPARATEUR = chr(0x02)
# Reception de la trame et renvoie d'une autre
def TraiteRecv(self, data):
# Variable
ToSend = ""
# Test si debut et fin de trame(pour vérification de trame complète)
if (data[:1] == DEBUT_TRAME and data[-1:] == FIN_TRAME):
data = data[1:len(data)-1]
# Selon contenue
if (data == "temp"):
ToSend = str(get_temperature())
if (data == "cpu"):
ToSend = str(get_cpu_speed())
if (data == "uptime"):
ToSend = get_up_stats()[0]
if (data == "ram"):
ToSend = str(get_ram()[1])+' ('+str(get_ram()[0])+')'
if (data == "nbproc"):
ToSend = str(get_process_count())
# GPIO mode
if (data[0:2] == "GM"):
try:
mode = data[2:3]
pin = int(data[3::])
if (mode == "I"):
GPIO.setup(pin,GPIO.IN)
else:
GPIO.setup(pin,GPIO.OUT)
except Exception, e:
ToSend = ("Erreur_%s" % e)
# GPIO write
if (data[0:2] == "GW"):
try:
etat = int(data[2:3])
pin = int(data[3::])
if (etat == 1):
GPIO.output(pin, GPIO.HIGH)
else:
GPIO.output(pin, GPIO.LOW)
except Exception, e:
ToSend = ("Erreur_%s" % e)
# GPIO read
if (data[0:2] == "GR"):
try:
pin = int(data[2::])
etat = GPIO.input(pin)
ToSend = str(etat)
except Exception, e:
ToSend = ("Erreur_%s" % e)
# On renvoie la donnée recu et la réponse (séparer par caract de 2)
Socket_Event.EchoHandler.handle_write(self, DEBUT_TRAME + data + SEPARATEUR + ToSend + FIN_TRAME)
# Definition de la socket
interface = "192.168.0.13"
port = 59004
# GPIO configuration
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
# Lancement de la socket
server = Socket_Event.EchoServer((interface, port), TraiteRecv)
server.serve_forever()
Je commence par définir des variables global, celle-ci me permettrons de tester le début, fin de trames reçu pour être sur que ces dernières sont complètes. Ensuite la fonction qui sera appeller lors qu'une trame se présente dans la socket. Et pour finir aprés la fonction "TraiteRecv" la programme qui permet de définir l'IP de la socket ainsi que sont port, puis configurer les GPIO et pour finir lancer le serveur avec en paramètre l'IP, port et la fonction à appeler lorsque une trame est reçu.
La fonction "TraiteRecv" dans un premier vérifie que le début et fin de trame sont présente dans la trame. On traite ensuite en fonction du message de la trame pour effectuer l'action demander, et pour finir on renvoie sur la socket la réponse que le client traitera à sont tour.
Les classes
La classe Socket_Event n'est pas de moi je l'ai juste modifier pour permettre d'avoir une fonction extérieur à la classe pour traiter les socket reçu.
La classe Sys_Infos est aussi une trouvaille du web.
Conclusions
L'avantage de cette classe est donc sa simplicité d'utilisation, de plus les déconnexion du client sont automatiquement gérer par le serveur. Vous pouvez maintenant adapter tout sa à vos besoins d'objet connecter :-)
Le lien des fichier :
https://mega.co.nz/#!A9I2DaxD!qZVL9hzDwhWb5zP2LXqKIs_5cCFV-nRSNALtohtkruQ