2016-08-01 80 views
2

我很难将所有代码放在一起,让代理响应http请求。我见过Craig Add a new page to Volttron Central的这种回应,但我仍然不确定如何把所有东西放在一起。希望这个问题可以作为教程或至少一个地方指向文档中的特定位置。得到一个VOLTTRON代理来响应http请求

要在这里,到底是我能想到的,我的问题的最简单的语句:

说我有安装在Ubuntu上运行bootstrap.py VOLTTRON的默认版本。我在开发分支上,因为这是对上述问题的回应,如果这不正确或其他分支也具有此功能请指明。

并说我有以下的代理代码 class Hello_Internet(Agent): def hello_internet(self): return “Hello Internet”

需要采取什么措施,以能够发送到一个URL,它的形式是“东西/ hello_internet”的请求,并返回的响应“Hello Internet”通过HelloInternet代理的方法?什么是网址中的“东西”?用于获取请求类型和其他相关信息(查询字符串,发布请求主体)的奖励点数。

本着展示我已经尝试过的希望,以下内容不会过多地混淆水域。理想情况下,你会说我已经完全失去了情节,然后我们可以稍后编辑下面的内容。

我开始在启动平台本身时为params添加标志-bind-web-address“http://127.0.0.1:5555”。

然后我就代理类更新

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)      

在这一点上,当我开始它记录本上启动平台:

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

而这个代理启动时:

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

但是,如果我真的浏览到127.0.0.1:5555那么平台给出了调试器下此错误:

“~/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

对于什么是值得在上面看起来像self.ssl_agrs dict: {'error_log': <open file '~/.volttron/log/web.error.log', mode 'wb' at 0x7f9ea5a2c5d0>, 'server_side': True}

〜/ .volttron/log/web.error.log文件存在但是为空。

这发生在可以调用hello_internet函数之前。

我试过更新gevent,但没有解决问题。我尝试切换-bind-web-address到https://127.0.0.1:5555,然后去那里,再加上一些其他的东西,只会让事情变得更混乱,但我认为目前还没有成功。

编辑

感谢您的快速反应。我更新了我的图书馆以配合下面的克雷格的点子列表。在某些情况下,我可能已更新到更新的库版本,如gevent 1.1.2而不是1.1.1。我还更改了hello_internet函数签名以匹配Craig的建议,并将绑定的地址从https更改为http。

现在,当我启动平台和代理,并尝试浏览到绑定的IP,我得到“内部服务器错误”,从浏览器和平台给出了这样的回溯:

~/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 

回答

0

从我所看到的只是我看到的问题是,该MASTER_WEB路线回调(的方法应具备的功能

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

此外该error_log中的事情不应该是一个问题,如果你已经安装了GEVENT 1.1.1。至少,这是我正在使用的版本。

请比较我PIP列表与你

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) 
+0

感谢您的快速反应。 gevent版本是问题的一部分,但不是全部。我用新的问题编辑了我的问题。 –

+0

请从网址中删除https。现在应该是http。 – Craig

+0

对不起,我忘了提及,我也改变了https为http也错误保持不变。将编辑我的问题,以反映这一点。我也会尝试用最新的ubuntu构建一个全新的虚拟机,并且看看我使用的机器上是否有某些东西搞砸了。 –