Programmer le pcDuino : Pyduino : Réseau : Créer un serveur TCP / Http générant un formulaire HTML simple.Par X. HINAULT - Juillet 2013 Ce que l'on va faire ici
Ce qui est "génial" en Python (entre autres choses...), c'est qu'il est possible d'intégrer du code HTML "as is" par simple copier/coller grâce aux chaînes multilignes, encadrées par des """ """. Ainsi la mise en place d'un serveur générant une page HTML avec Pyduino va consister à mettre la page HTML au point dans un éditeur HTML (qui fournit tous les outils facilitant l'écriture du code) puis une fois le résultat voulu obtenu, la copier/coller dans le code Python. Ecrire un tel code avec Pyduino est une "ballade de santé" comparativement à la même chose réalisée avec Arduino + shield Ethernet. UN ATOUT TRES REEL : L'accès VNC permet de visualiser tout ce qui se passe sur le serveur (exécuté sur le mini-PC) de façon distante : il est facile de repérer un problème grâce aux messages d'erreur de corriger le code sur le miniPC, de relancer, etc... le tout par accès distant ! Le navigateur exécuté sur le poste fixe permet ainsi de développer le serveur et de tester le client sur un seul et même poste de travail ! Les "plus" du réseau avec Pyduino
Pré-requis
Activité préparatoire
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Titre</title> </head> <body> Mon premier formulaire HTML <form method=get action="http://192.168.1.12:8080"> <INPUT type="checkbox" value="ON" name="CaseACocher"> Case <br> <INPUT type="submit" value="Envoi" name="Envoi"> </form> </body> </html>
Schéma fonctionnel
Le réseau utilisé
Matériel nécessaireSystème
E/S
Instructions de montage
Le montage à réaliserLe fichier *.pyCopier/coller ce code dans l'éditeur Geany : #!/usr/bin/python # -*- coding: utf-8 -*- # exemple pyDuino - par X. HINAULT - www.mon-club-elec.fr # Juillet 2013 - Tous droits réservés - GPLv3 # voir : https://github.com/sensor56/pyDuino # test Ethernet Server from pyduino import * # importe les fonctions Arduino pour Python # entete declarative ipLocale=Ethernet.localIP() # auto - utilise l'ip de l'interface eth0 du systeme #ipLocale='192.168.1.25' # manuel - attention : utiliser la meme IP qu'une interface reseau du systeme # pour connaitre les interfaces reseau sur le systeme : utiliser la commande $ ifconfig print ipLocale # affiche l'adresse IP port=8080 # attention port doit etre au dessus de 1024 sinon permission refusee par securite - 8080 pour http serverHTTP=EthernetServer(ipLocale, port) # crée un objet serveur utilisant le port 8080 = port HTTP > 1024 #--- setup --- def setup(): global serverHTTP, ipLocale, port #serverHTTP.begin(10) # initialise le serveur - fixe nombre max connexion voulu serverHTTP.begin() # initialise le serveur - nombre max connexion par defaut = 5 print ("Serveur TCP actif avec ip : " + ipLocale + " sur port : " + str(port) ) #--- fin setup # -- loop -- def loop(): global serverHTTP print ("Attente nouvelle connexion entrante...") clientDistant, ipDistante = serverHTTP.clientAvailable() # attend client entrant # code bloque ici tant que pas client ! Si present, on recupere d'un coup objet client ET son ip print "Client distant connecte avec ip :"+str(ipDistante) # affiche IP du client #--- requete client --- requete=serverHTTP.readDataFrom(clientDistant) # lit les donnees en provenance client d'un coup print requete # affiche requete recue # analyse de la requete #====== si requete formulaire ====== if requete.startswith("GET /?"): # si la requete recue est une reponse de formulaire lignesRequete=requete.splitlines() # recupere la requete est list de lignes print lignesRequete[0] # premiere ligne = la requete utile #--- reponse serveur --- reponse=( # ( ... ) pour permettre multiligne.. httpResponse() # entete http OK 200 automatique fournie par la librairie Pyduino # contenu page +"Requete formulaire recue : " + lignesRequete[0] +"\n") # fin reponse serverHTTP.writeDataTo(clientDistant, reponse) # envoie donnees vers client d'un coup print "Reponse envoyee au client distant : " #print (bytes(reponse)) print (reponse) # affiche la reponse envoyee #====== si requete simple = premiere requete ====== elif requete.startswith("GET"): # si la requete commence par GET seul = premiere page print "Requete recue valide" #--- reponse serveur --- reponse=( # ( ... ) pour permettre multiligne.. httpResponse() # entete http OK 200 automatique fournie par la librairie Pyduino # contenu page + """ <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Titre</title> </head> <body> Mon premier formulaire HTML <form method=get action="http://"""+ Ethernet.localIP()+""":8080"> <INPUT type="checkbox" value="ON" name="CaseACocher"> Case <br> <INPUT type="submit" value="Envoi" name="Envoi"> </form> </body> </html> """ +"\n") # fin reponse serverHTTP.writeDataTo(clientDistant, reponse) # envoie donnees vers client d'un coup print "Reponse envoyee au client distant : " #print (bytes(reponse)) print (reponse) # affiche la reponse envoyee #====== si requete pas valide ====== else : # sinon requete pas valide print ("Requete pas valide") #====== une fois la page envoyée ====== #serverHTTP.close() # remarque : le socket = serveur doit rester ouvert # quand on quitte l'application: la connexion TCP reste active un peu donc erreur si re-execution trop rapide du code # on peut utiliser un port voisin dans ce cas... delay(10) # entre 2 loop() # -- fin loop -- #--- obligatoire pour lancement du code -- if __name__=="__main__": # pour rendre le code executable setup() # appelle la fonction setup while not noLoop: loop() # appelle fonction loop sans fin Ce code est également disponible ici : https://raw.github.com/sensor56/pyduino-exemples/master/Ethernet/EthernetServerAnalyseForm.py Utilisation
![]() ![]() ![]()
Discussion techniqueEcrire un tel code avec Pyduino est une "ballade de santé" comparativement à la même chose réalisée avec Arduino + shield Ethernet. UN ATOUT TRES REEL : L'accès VNC permet de visualiser tout ce qui se passe sur le serveur (exécuté sur le mini-PC) de façon distante : il est facile de repérer un problème grâce aux messages d'erreur de corriger le code sur le miniPC, de relancer, etc... le tout par accès distant ! Le navigateur exécuté sur le poste fixe permet ainsi de développer le serveur et de tester le client sur un seul et même poste de travail ! |