我很难将所有代码放在一起,让代理响应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
感谢您的快速反应。 gevent版本是问题的一部分,但不是全部。我用新的问题编辑了我的问题。 –
请从网址中删除https。现在应该是http。 – Craig
对不起,我忘了提及,我也改变了https为http也错误保持不变。将编辑我的问题,以反映这一点。我也会尝试用最新的ubuntu构建一个全新的虚拟机,并且看看我使用的机器上是否有某些东西搞砸了。 –