我很难将所有部分放在一起让代理响应 http 请求。我已经看到了 Craig 的回复向 Volttron Central 添加一个新页面,但我仍然不确定如何将所有内容放在一起。希望这个问题可以作为教程或至少一个指向文档中特定位置的地方。
为此,这是我能想到的最简单的问题陈述:
假设我通过运行 bootstrap.py 在 Ubuntu 上安装了默认版本的 VOLTTRON。我在开发分支上,因为这是对上述问题的回答所指向的,如果这不正确或其他分支也具有此功能,请指定。
并说我有以下代理代码
class Hello_Internet(Agent):
def hello_internet(self):
return “Hello Internet”
为了能够向格式为“something/hello_internet”的 url 发送请求并通过 HelloInternet 代理的方法返回“Hello Internet”响应,需要发生什么?网址中的“某物”是什么?获取请求类型和其他相关信息(查询字符串、发布请求正文)的奖励积分。
本着展示我已经尝试过的东西的精神,希望以下内容不会使水变得太多。理想情况下,您只会说我完全失去了情节,然后我们可以稍后编辑以下内容。
在启动平台本身时,我首先将标志 –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并转而去那里加上其他一些我认为只会让事情变得更加混乱的事情,但到目前为止还没有成功。
编辑
谢谢你快速的回复。我更新了我的库以匹配下面 Craig 的点子列表。在某些情况下,我可能已经更新到更新的库版本,例如 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