Main

Référence : Fonctions Pyduino

Classe EthernetServer : clientAvailable


Description

  • Cette fonction attend l'arrivée d'une connexion client entrante : le programme est bloqué à ce niveau tant qu'aucun client n'est détecté. Une fois qu'un client est détecté, l'objet représentant le client ainsi que son adresse IP sont renvoyés par la fonction d'un coup.
  • Noter que ce fonctionnement est assez différent de la fonction available() de la librairie Ethernet Arduino, mais plus puissant.
  • Une fois le client obtenu :
  • Simple et efficace !

Il est assez simple de ne pas bloquer le programme lors de l'attente d'un client en utilisant la fonction timer() pour appeler à intervalle régulier une fonction voulue pour réaliser des opérations tout en écoutant le réseau. Voir l'exemple ci-dessous.

Syntaxe

clientDistant, ipDistante = serverHTTP.clientAvailable() # attend client entrant

Paramètres

  • clienDistant : un objet représentant le client distant.
  • ipDistante' : l'adresse ip du client distant sous forme d'une chaine str au format 'xxx.xxx.xxx.yyy'

Valeur renvoyée

Aucune

Exemple :

Code *.yno à copier/coller dans l'IDE Pyduino
Voir ici si vous préférez convertir le code Pyduino en code Python pour l'utiliser avec l'éditeur Geany par exemple.


# exemple pyDuino - par X. HINAULT - www.mon-club-elec.fr
# Juin 2013 - Tous droits réservés - GPLv3

# test Ethernet Server

# 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

        #serverHTTP.begin(10) # initialise le serveur - fixe nombre max connexion voulu
        serverHTTP.begin() # initialise le serveur - nombre max connexion par defaut = 5

#--- 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

        #--- reponse serveur ---
        reponse=( # ( ... ) pour permettre multiligne..
        httpResponse() # entete http OK 200 automatique fournie par la librairie Pyduino
        +"Serveur OK : " + nowdatetime() +"\n" # contenu page - ici date / heure du serveur
        ) # 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

        #serverHTTP.close()
        # remarque : le socket = serveur doit rester ouvert

        # quand on quitte : la connexion TCP reste active un peu donc erreur si re-execution trop rapide
        # on peut utiliser un port voisin dans ce cas...

        delay(10) # entre 2 loop()

# -- fin loop --
 

Exemple avec timer

Code *.yno à copier/coller dans l'IDE Pyduino
Voir ici si vous préférez convertir le code Pyduino en code Python pour l'utiliser avec l'éditeur Geany par exemple.


# exemple pyDuino - par X. HINAULT - www.mon-club-elec.fr
# Juin 2013 - Tous droits réservés - GPLv3

# test Ethernet Server

# 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

        #serverHTTP.begin(10) # initialise le serveur - fixe nombre max connexion voulu
        serverHTTP.begin() # initialise le serveur - nombre max connexion par defaut = 5

        timer(1000, toDo) # lance timer pour  2eme fonction loop gerant autre chose que server
        # nb : utiliser timer() plutot que appel direct pour execution loop avant 1er appel loop2

#--- fin setup

# -- loop --
def loop(): # la fonction loop gere le serveur


        global serverHTTP

        print ("Attente nouvelle connexion entrante...")
        clientDistant, ipDistante = serverHTTP.clientAvailable() # attend client entrant
        # le 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

        #--- reponse serveur ---
        reponse=( # ( ... ) pour permettre multiligne..
        httpResponse() # entete http OK 200 automatique fournie par la librairie Pyduino
        +"Serveur OK : " + nowdatetime() +"\n" # contenu page - ici date / heure du serveur
        ) # 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

        #serverHTTP.close()
        # remarque : le socket = serveur doit rester ouvert

        # quand on quitte : la connexion TCP reste active un peu donc erreur si re-execution trop rapide
        # on peut utiliser un port voisin dans ce cas...

        delay(10) # entre 2 loop()

# -- fin loop --

#fonction toDo - autorappel par timer dedie
def toDo():
        print(".") # temoin passage loop2
        timer(1000, toDo) # auto appel de la fonction toDo

#-- fin toDo
 

Lien utile

Commentaires utilisateurs

Aucun commentaire.

Voir également


Page d'accueil de la référence Pyduino en français

Corrections, suggestions et nouvelle documentation peuvent être postées à l'adresse suivante : support_at_mon-club-elec_point_fr

Cette page a été réalisée par Xavier HINAULT (2013) (www.mon-club-elec.fr) et est sous licence Creative Commons Attribution-ShareAlike 3.0.