我正在连接外部VOLTTRON实例。我没有收到连接的回复。有什么问题?
我正在编写一个简单的python脚本来连接外部平台并检索对等体。如果我得到serverkey,clientkey和/或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()
答案 0 :(得分:2)
简短回答:不,客户端无法确定与服务器的连接失败的原因。客户端将尝试连接,直到超时为止。
服务器端上的日志和调试消息可以帮助解决连接问题。有三个与关键错误相关的不同消息:
CURVE I: cannot open client HELLO -- wrong server key?
客户端省略服务器密钥,客户端使用错误的服务器密钥,或者服务器省略密钥。
CURVE I: cannot open client INITIATE vouch
客户端省略公钥或密钥,或者其公钥和密钥不相互对应。
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))