エージェントが http 要求に応答するようにすべての要素をまとめるのに苦労しています。Craig 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」のレスポンスを取得できるようにするには、どうすればよいでしょうか? そして、URLの「何か」は何ですか? リクエスト タイプとその他の関連情報 (クエリ文字列、ポスト リクエスト本文) を取得するためのボーナス ポイント。
うまくいけば、私がすでに試したことを示すという精神で、以下が水をあまり濁らせないことを願っています. 理想的には、プロットを完全に失ったと言って、後で下を編集できるようにする.
プラットフォーム自体を起動するときに、フラグ –bind-web-address " http://127.0.0.1:5555 " を params に追加することから始めました。
次に、エージェントクラスを次のように更新しました
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に切り替えてみましたが、代わりにそこに移動し、さらに混乱を招くだけの他のいくつかのことを行ってみましたが、これまでのところ成功していません。
編集
早速の対応、ありがとうございました。以下のクレイグのピップリストと一致するようにライブラリを更新しました。場合によっては、1.1.1 ではなく gevent 1.1.2 などの新しいライブラリ バージョンに更新した可能性があります。また、Craig の提案に合わせて hello_internet 関数の署名を変更し、バインドされたアドレスを https から http に変更しました。
プラットフォームとエージェントを起動し、バインドされた IP を参照しようとすると、ブラウザーから「Internal Server Error」が表示され、プラットフォームから次のトレースバックが返されます。
~/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