2 votes

obtenir un agent VOLTTRON pour répondre aux demandes http

J'ai du mal à rassembler toutes les pièces du puzzle pour qu'un agent réponde aux demandes http. J'ai vu cette réponse de Craig Ajouter une nouvelle page à Volttron Central mais je ne suis toujours pas sûr de savoir comment tout assembler. J'espère que cette question pourra servir de tutoriel ou au moins permettre de pointer vers un endroit précis de la documentation.

À cette fin, voici la formulation la plus simple de ma question à laquelle je peux penser :

Disons que j'ai une version par défaut de VOLTTRON installée sur Ubuntu en exécutant bootstrap.py. Je suis sur la branche development puisque c'est ce que la réponse à la question ci-dessus indique, si ce n'est pas correct ou si d'autres branches ont également cette fonctionnalité, veuillez préciser.

Et disons que j'ai le code agent suivant class Hello_Internet(Agent): def hello_internet(self): return “Hello Internet”

Que doit-il se passer pour pouvoir envoyer une requête à une url de la forme "quelque chose/hello_internet" et obtenir en retour une réponse de "Hello Internet" via la méthode de l'agent HelloInternet ? Et quel est le "quelque chose" dans l'url ? Des points bonus pour l'obtention du type de requête et des autres informations associées (querystring, post request body).

Dans l'esprit de montrer ce que j'ai déjà essayé, j'espère que ce qui suit ne brouillera pas trop les pistes. L'idéal serait que vous disiez simplement que j'ai complètement perdu la tête et que nous puissions modifier ce qui suit plus tard.

J'ai commencé par ajouter le flag -bind-web-address " http://127.0.0.1:5555 " aux paramètres lors du démarrage de la plateforme elle-même.

Puis j'ai mis à jour ma classe d'agent pour

class Hello_Internet(Agent):
    @RPC.export
    def hello_internet(self):
        return "Hello Internet"

    @Core.receiver('onstart')
    def on_message_bus_start(self, sender, **kwargs):
        self.vip.rpc.call(MASTER_WEB, 'register_agent_route',
                      r'^/hello_internet',
                      self.core.identity,
                      "hello_internet").get(timeout=30)                      

À l'heure actuelle, lorsque je démarre la plateforme, elle affiche ce message au démarrage :

volttron.platform.web INFO: Starting web server binding to 127.0.0.1:5555.

Et c'est là que l'agent commence :

volttron.platform.web INFO: Registering agent route expression: ^/hello_internet peer: None function: hello_internet

Mais si je navigue réellement vers 127.0.0.1:5555, la plate-forme donne cette erreur dans le débogueur :

“~/workspace/volttron/env/local/lib/python2.7/site-packages/gevent/server.py", line 102, in wrap_socket_and_handle ssl_socket = self.wrap_socket(client_socket, **self.ssl_args) TypeError: wrap_socket() got an unexpected keyword argument 'error_log' <Greenlet at 0x7f9ea46e7e10: <bound method WSGIServer.wrap_socket_and_handle of <WSGIServer at 0x7f9ea46cba90 fileno=58 address=127.0.0.1:5555>>(<socket at 0x7f9ea46cb9d0 fileno=61 sock=127.0.0.1, ('127.0.0.1', 40583))> failed with TypeError

Pour ce que ça vaut, le self.ssl_agrs dans l'exemple ci-dessus ressemble à ceci dict: {'error_log': <open file '~/.volttron/log/web.error.log', mode 'wb' at 0x7f9ea5a2c5d0>, 'server_side': True}

Le fichier ~/.volttron/log/web.error.log existe mais est vide.

Cela se produit avant que la fonction hello_internet puisse être appelée.

J'ai essayé de mettre à jour gevent et cela n'a pas résolu le problème. J'ai essayé de passer de -bind-web-address à https://127.0.0.1:5555 et y aller à la place, plus quelques autres choses qui ne feront que rendre les choses plus confuses, je pense, mais jusqu'à présent, pas de succès.

EDIT

Merci pour votre réponse rapide. J'ai mis à jour mes bibliothèques pour correspondre à la liste de pip de Craig ci-dessous. Dans certains cas, j'ai peut-être mis à jour une version plus récente de la bibliothèque, comme gevent 1.1.2 au lieu de 1.1.1. J'ai également modifié la signature de la fonction hello_internet pour qu'elle corresponde à la suggestion de Craig et j'ai changé l'adresse liée de https à http.

Maintenant, lorsque je démarre la plate-forme et l'agent et que j'essaie de naviguer vers l'ip liée, j'obtiens "Internal Server Error" du navigateur et la plate-forme donne cette trace :

~/workspace/volttron/env/local/lib/python2.7/site-packages/zmq/sugar/socket.py", line 363, in send_multipart
    i, rmsg,
TypeError: Frame 0 (None) does not support the buffer interface.
{'GATEWAY_INTERFACE': 'CGI/1.1',
 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
 'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5',
 'HTTP_CONNECTION': 'keep-alive',
 'HTTP_HOST': '127.0.0.1:5555',
 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0',
 'PATH_INFO': '/hello_internet',
 'QUERY_STRING': '',
 'REMOTE_ADDR': '127.0.0.1',
 'REMOTE_PORT': '40704',
 'REQUEST_METHOD': 'GET',
 'SCRIPT_NAME': '',
 'SERVER_NAME': 'localhost',
 'SERVER_PORT': '5555',
 'SERVER_PROTOCOL': 'HTTP/1.1',
 'SERVER_SOFTWARE': 'gevent/1.1 Python/2.7',
 'wsgi.errors': <open file '/home/bob/.volttron/log/web.error.log', mode 'wb' at 0x7f77dc4386f0>,
 'wsgi.input': <gevent.pywsgi.Input object at 0x7f77dc341e20>,
 'wsgi.multiprocess': False,
 'wsgi.multithread': False,
 'wsgi.run_once': False,
 'wsgi.url_scheme': 'http',
 'wsgi.version': (1, 0)} failed with TypeError

0voto

Craig Points 594

D'après ce que je vois, le seul problème est que le rappel (la méthode vers laquelle MASTER_WEB se dirige) devrait avoir la fonction suivante

class Hello_Internet(Agent):
    @RPC.export
    def hello_internet(self, env, data):
        return "Hello Internet"

De plus, le truc du error_log ne devrait pas être un problème si vous avez installé gevent 1.1.1. En tout cas, c'est la version que j'utilise.

Veuillez comparer mon liste des pip avec le vôtre

avro (1.8.1)
bacpypes (0.13.2)
configobj (5.0.6)
docutils (0.12)
funcsigs (1.0.2)
gevent (1.1.1)
gprof2dot (2015.12.1)
greenlet (0.4.9)
mock (2.0.0)
monotonic (1.1)
pbr (1.10.0)
pip (8.1.2)
ply (3.8)
psutil (4.3.0)
py (1.4.31)
pymodbus (1.2.0)
pymongo (3.3.0)
pyserial (3.1)
pytest (2.9.2)
pytest-profiling (1.1.1)
python-dateutil (2.5.3)
pytz (2016.4)
pyzmq (14.7.0)
requests (2.10.0)
setuptools (22.0.5)
simplejson (3.8.2)
six (1.10.0)
Smap (2.0.24c780d)
Twisted (16.2.0)
volttron (3.5.0, /home/vdev/git/volttron)
wheel (0.29.0)
zope.interface (4.1.3)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X