[PYTHON] Configurez votre propre serveur Web dans votre projet d'application Pepper

Je veux envoyer une requête HTTP à Pepper de l'extérieur et l'utiliser comme déclencheur pour créer quelque chose de Pepper. Je vais vous expliquer comment réaliser une telle chose.

Cible

Cet article est destiné à ceux qui connaissent l'environnement de développement de Pepper, Choregraphe, et qui ont une certaine compréhension des programmes Python.

Aperçu

Pepper a une fonction de serveur Web en standard, et vous pouvez accéder aux ressources du dossier html de l'application à partir d'un PC, etc. à l'adresse http: // / apps / app ID /. Cependant, cela a les restrictions suivantes:

Je souhaite recevoir une requête HTTP du côté Pepper et prendre des mesures. Dans un tel cas, vous devez préparer votre propre serveur Web. Que faire, Python a un module standard pour configurer un serveur Web simple, alors utilisons-le.

(La méthode présentée ici est simplement de savoir comment recevoir des requêtes HTTP au sein du réseau local. Pour que Pepper reçoive des requêtes HTTP directement via Internet, un mécanisme spécial est nécessaire à cette fin.)

Exemple de code

J'ai fait un exemple de code. Apportez la boîte de script Python et modifiez le code à l'intérieur.

スクリプトエディタ_と_MyWebServer_-_Choregraphe__バーチャルロボットに接続_.jpg

Vous trouverez ci-dessous le code de l'exemple de boîte de script Python.

python


import BaseHTTPServer

class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        self.httpd = None

    def onUnload(self):
        if self.httpd is not None:
            self.httpd.shutdown()
            self.httpd.server_close()

    def onInput_onStart(self):

        #Numéro de port pour recevoir la requête HTTP http://IP du robot:numéro de port/Recevez la demande à
        PORT = 8000

        MyHandler.setParent(self)
        self.httpd = BaseHTTPServer.HTTPServer(('', PORT), MyHandler)
        self.httpd.allow_reuse_address = True
        self.httpd.serve_forever()

    def onInput_onStop(self):
        self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
        self.onStopped(p) #activate the output of the box

    # BaseHTTPServer.Appelé lorsqu'il y a une requête HTTP GET via BaseHTTPRequestHandler
    #Le document suivant contient le contenu affiché dans l'objet http
    # http://docs.python.jp/2/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler
    def do_GET(self, http):
    
        #Pour les demandes du navigateur, le favicon est distinct de la demande réelle.La demande à ico arrive, ignorez ceci
        if http.path.endswith('favicon.ico'):
            return;
        
        self.logger.info("request url:" + http.path)
        
        http.send_response(200)
        http.send_header("Content-type", "text/plain")
        http.end_headers()
        http.wfile.write("This is a test response")

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    _parent = None

    def do_GET(self):
        MyHandler._parent.do_GET(self)
        
    @staticmethod
    def setParent(parent):
        MyHandler._parent = parent
        

Après avoir exécuté l'application, essayez d'y accéder à partir d'un navigateur tel qu'un PC sur le même réseau local à l'adresse http: // : 8000 /. Votre navigateur devrait dire "Ceci est une réponse de test".

Explication de l'exemple de code

La fonction de serveur HTTP est réalisée à l'aide du module BaseHTTPServer. Dans cet exemple, nous attendons une requête sur le port 8000. Lorsque l'entrée onStart est appelée, elle déclenche le processus du serveur HTTP et attend la requête jusqu'à ce que la boîte soit déchargée. (Le déchargement se produit lorsque l'application est fermée, ou lorsque la boîte est à l'intérieur de la boîte de diagramme ou à l'intérieur de la boîte de chronologie, lorsque la boîte est supprimée.)

La requête est faite par l'instance de la classe MyHandler donnée au moment de l'instanciation de BaseHTTPServer.HTTPServer, mais je voulais la lier avec le traitement de la boîte

python


        MyHandler.setParent(self)

À ce stade, je passe de force une instance de la boîte à la classe afin qu'elle puisse être traitée du côté de l'instance de la boîte. Méthode de la boîte

python


    def do_GET(self, http):

Reçoit et traite les requêtes HTTP GET. Où self est l'instance de la boîte et http est l'instance de la classe BaseHTTPRequestHandler qui a reçu la demande.

python


        self.logger.info("request url:" + http.path)

Pour le moment, affichez la partie chemin de l'URL de la requête dans le journal, puis

python


        http.send_response(200)
        http.send_header("Content-type", "text/plain")
        http.end_headers()
        http.wfile.write("This is a test response")

Génère une réponse HTTP.

Reportez-vous à l'URL suivante pour plus de détails sur le type d'informations contenues dans l'instance BaseHTTPRequestHandler.

http://docs.python.jp/2/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler

Cet exemple prend la forme de la génération par programme d'une réponse HTTP. Si vous souhaitez essentiellement renvoyer les fichiers dans le projet, l'implémentation est ajoutée en fonction de BaseHTTPRequestHandler classe SimpleHTTPRequestHandler du module SimpleHTTPServer Je pense que vous devriez utiliser .html). J'espère que vous pourrez essayer différentes choses ici en fonction de l'application.

finalement

Si Pepper peut recevoir des requêtes HTTP de manière dynamique, il sera plus facile de se lier à divers appareils dotés d'une interface du point de vue d'un client API Web. J'espère que cela vous aidera de nouvelles façons d'utiliser Pepper.

Recommended Posts

Configurez votre propre serveur Web dans votre projet d'application Pepper
Configurer un serveur local simple sur votre Mac
Configurer un serveur Web avec CentOS7 + Anaconda + Django + Apache
Essayez docker: créez votre propre image de conteneur pour une application Web Python
Configurez un serveur Web local en 30 secondes en utilisant http.server en python 3
Configurer un serveur Samba avec Docker
Redirection de port d'un serveur Web à l'aide d'iptables
Créez votre propre serveur DNS avec Twisted
Configurer un serveur de messagerie avec Twisted
Configurons un serveur WEB avec Chromebook
Votre pile réseau est-elle correctement configurée?