#!/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 # Tester l'envoi d'une requete Ajax, l'envoi d'une reponse et la gestion d'une reponse Ajax from pyduino import * # importe les fonctions Arduino pour Python import numpy as np # entete declarative compt=0 # variable de comptage 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 data=None # Tableau Numpy global des donnees #--- setup --- def setup(): # -- serveur TCP -- 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 - debug # analyse de la requete #====== si requete ajax ====== if requete.startswith("GET /ajax"): # si la requete recue est une requete ajax lignesRequete=requete.splitlines() # recupere la requete est list de lignes print lignesRequete[0] # premiere ligne = la requete utile #--- reponse serveur requete formulaire --- reponse=( # ( ... ) pour permettre multiligne.. httpResponse() # entete http OK 200 automatique fournie par la librairie Pyduino # contenu reponse AJAX + reponseAJAXServeur() # voir la fonction separee - pour clarte du code +"\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 GET simple = premiere requete => envoi page HTML+JS initiale ====== elif requete.startswith("GET"): # si la requete commence par GET seul = premiere page print "Requete GET recue valide" #-- code Pyduino a executer au besoin global compt compt=0 # RAZ compt #--- reponse serveur requete initiale --- reponse=( # ( ... ) pour permettre multiligne.. httpResponse() # entete http OK 200 automatique fournie par la librairie Pyduino # contenu page HTML+ JS initiale + pageInitialeHTMLJS() # voir la fonction separee - pour clarte du code +"\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 - debug #====== 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(50) # entre 2 loop() # -- fin loop -- #========== fonction fournissant la page HTML + JS initiale incluant code javascript AJAX ====== def pageInitialeHTMLJS(): # code Python a executer avant envoyer page # code Python a executer avant envoyer page #chemin fichier myDataPath=("data/text/") path=homePath()+myDataPath # chemin du répertoire à utiliser #filename="testdata.txt" # nom du fichier filename="data"+today()+".txt" # nom du fichier filepath=path+filename # chemin du fichier #-- lecture du fichier -- myFile=open(filepath,'r') # ouverture en lecture print ("Contenu du fichier : ") myFile.seek(0) # se met au debut du fichier linesList=myFile.readlines() # lit le fichier - renvoie list myFile.close() # fermeture du fichier print linesList # donnees sous forme d'une chaine # format ligne data dans la page HTML "x,y\n" dataGraph="" for dataLine in linesList[:-1]: # defile lignes sauf la derniere dataGraph=dataGraph+"\""+dataLine.rstrip('\n')+" \\n \" +" + "\n" # dataLine.rstrip('\n') = enleve \n de la ligne dataGraph=dataGraph+"\""+linesList[-1].rstrip('\n')+" \\n \" " # derniere ligne sans le + # Note : lors envoi page initiale : donnees envoyees au sein code JS # lors envoi reponse ajax : donnees envoyees en tant que chaine texte # l'envoi initial d'un tableau de valeurs permet de fixer la largeur du graphique # options du graphique Dygraph a utiliser optionsGraph=""" labels: [ "x", "y="], // labels series //width : 800, // largeur // height: 400, // hauteur //valueRange: [0,4095], // plage valeurs Y showRangeSelector: true // affiche l'outil de selection plage voulue """ contenuPageInitialeHTMLJS=( # debut page HTML """ Test reponse Ajax

Valeur courante =
Serveur Pyduino : Affichage Dygraphs du contenu d'un fichier de donnees horodatees avec actualisation par requete Ajax
""" ) # fin page HTML+JS initiale return contenuPageInitialeHTMLJS # la fonction renvoie la page HTML #===================== Reponse AJAX ================== #--- fonction fournissant la page de reponse AJAX def reponseAJAXServeur(): # code Python a executer avant envoyer page #chemin fichier myDataPath=("data/text/") path=homePath()+myDataPath # chemin du répertoire à utiliser #filename="testdata.txt" # nom du fichier filename="data"+today()+".txt" # nom du fichier filepath=path+filename # chemin du fichier #-- lecture du fichier -- myFile=open(filepath,'r') # ouverture en lecture print ("Contenu du fichier : ") myFile.seek(0) # se met au debut du fichier #linesList=myFile.readlines() # lit le fichier - renvoie list fileContent=myFile.read() # lit le fichier entier - renvoie str myFile.close() # fermeture du fichier #print linesList print fileContent # donnees sous forme d'une chaine # format ligne data dans la page HTML "x,y\n" dataGraph="" # attention - ici le formatage est la chaîne brute, pas la chaîne au sein de code JS.. subtil.. ! # donc en fait ici, on peut envoyer le contenu du fichier as is #for dataLine in linesList[:-1]: # defile lignes sauf la derniere # dataGraph=dataGraph+dataLine.rstrip('\n')+" \\n \" +" + "\n" # dataLine.rstrip('\n') = enleve \n de la ligne #dataGraph=dataGraph+"\""+linesList[-1].rstrip('\n')+" \\n \" " # derniere ligne sans le + dataGraph=fileContent print dataGraph # la reponse reponseAjax=( # debut page reponse AJAX #"""123, 456, 789""" dataGraph ) # fin page reponse AJAX return reponseAjax# la fonction renvoie la page HTML #--- 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