0

外部の VOLTTRON インスタンスに接続しています。接続からの応答がありません。問題は何ですか?

外部プラットフォームに接続してピアを取得するための簡単な python スクリプトを作成しています。サーバーキー、クライアントキー、および/またはパブリックキーが正しくない場合、クライアント側からどれが原因であるかを判断する方法がわかりません。私はちょうどgeventタイムアウトを取得します。知る方法はありますか?

import os

import gevent
from volttron.platform.vip.agent import Agent

secret = "secret"
public = "public"
serverkey = "server"
tcp_address = "tcp://external:22916"

agent = Agent(address=tcp_address, serverkey=serverkey, secretkey=secret,
              publickey=public)
event = gevent.event.Event()
greenlet = gevent.spawn(agent.core.run, event)
event.wait(timeout=30)
print("My id: {}".format(agent.core.identity))
peers = agent.vip.peerlist().get(timeout=5)
for p in peers:
    print(p)
gevent.sleep(3)
greenlet.kill()
4

1 に答える 1

2

簡単に言えば、いいえ、クライアントはサーバーへの接続が失敗した理由を特定できません。クライアントは、タイムアウトになるまで接続を試みます。

サーバー側のログとデバッグ メッセージは、接続の問題のトラブルシューティングに役立ちます。キー エラーに関連する 3 つの異なるメッセージがあります。

  1. CURVE I: cannot open client HELLO -- wrong server key?
    クライアントがサーバー キーを省略したか、クライアントが間違ったサーバー キーを使用したか、またはサーバーが秘密キーを省略しました。

  2. CURVE I: cannot open client INITIATE vouch
    クライアントが公開鍵または秘密鍵を省略しているか、公開鍵と秘密鍵が対応していません。

  3. authentication failure
    サーバー鍵は正しく、秘密鍵と公開鍵は有効ですが、クライアントが (クライアントの公開鍵に基づいて) 接続を許可されていなかったため、サーバーは接続を拒否しました。

最初の 2 つのメッセージはlibzmqによって出力されます。3 番目のメッセージを表示するには、詳細度volttronを上げて開始する必要があります (少なくとも-v)。


これらのシナリオのいくつかをテストするために使用できる簡単な ZMQ サーバー/クライアントの例を次に示します。

サーバ:

import zmq 

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.curve_server = 1 
socket.curve_secretkey = "mW4i2O{kmcOXs9q>UP0(no4-Sp1r(p>vK?*NFwV$"
# The corresponding public key is "krEC0>hsx+o4Jxg2yvitCOVwr2GF85akNIsUdiH5"
socket.bind("ipc://test123")

while True:
    msg = socket.recv()
    new_msg = "I got the message: {}".format(msg)
    print(new_msg)
    socket.send(new_msg)

クライアント:

import zmq 

pub, sec = zmq.curve_keypair()
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.curve_secretkey = sec 
socket.curve_publickey = pub 
socket.curve_serverkey = "krEC0>hsx+o4Jxg2yvitCOVwr2GF85akNIsUdiH5"
socket.connect("ipc://test123")

socket.send(b'Hello')
msg = socket.recv()
print("From the server: {}".format(msg))
于 2016-07-26T17:12:26.567 に答える