2

我很难将所有部分放在一起让代理响应 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
4

1 回答 1

0

据我所知,我看到的唯一问题是回调( MASTER_WEB 路由到的方法应该具有以下功能

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

此外,如果您安装了 gevent 1.1.1,则 error_log 应该不是问题。至少那是我正在使用的版本。

请把我的点子列表和你的比较一下

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)
于 2016-08-01T21:34:04.973 回答