我很难将所有部分放在一起以让代理响应http请求。我见过克雷格Add a new page to 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's pip list。在某些情况下,我可能已更新到更新的库版本,如gevent 1.1.2而不是1.1.1。我还更改了hello_internet函数签名以匹配Craig的建议,并将绑定地址从https更改为http。
现在,当我启动平台和代理并尝试浏览绑定的ip时,我得到了内部服务器错误&#34;从浏览器和平台给出这个追溯:
~/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 :(得分: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)