0

我正在连接到外部 VOLTTRON 实例。我没有从连接中得到响应。有什么问题?

我正在编写一个简单的 python 脚本来连接到外部平台并检索对等点。如果我得到的 serverkey、c​​lientkey 和/或 publickey 不正确,我不知道如何从客户端确定哪个是罪魁祸首。我只是得到一个 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

简短的回答:不,客户端无法确定其与服务器的连接失败的原因。客户端将尝试连接,直到超时。

服务器端的日志和调试消息可以帮助解决连接问题。与关键错误相关的三种不同消息:

  1. CURVE I: cannot open client HELLO -- wrong server key?
    客户端忽略了服务器密钥,客户端使用了错误的服务器密钥,或者服务器忽略了密钥。

  2. CURVE I: cannot open client INITIATE vouch
    客户端要么省略了公钥或私钥,要么它的公钥和私钥不对应。

  3. authentication failure
    服务器密钥正确,密钥和公钥有效,但服务器拒绝连接,因为客户端无权连接(基于客户端的公钥)。

前两条消息由libzmq打印。要查看第三条消息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 回答