如何调试 VOLTTRON 中的连接问题?
How can I debug a connection issue within VOLTTRON?
我正在连接到外部 VOLTTRON 实例。我没有收到连接的响应。有什么问题?
我正在编写一个简单的 python 脚本来连接到外部平台并检索对等点。如果我得到服务器密钥、客户端密钥、and/or 公钥不正确,我不知道如何从客户端确定哪个是罪魁祸首。我只是得到一个 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()
简短的回答:不,客户端无法确定它与服务器的连接失败的原因。客户端将尝试连接直到超时。
服务器端的日志和调试消息可以帮助解决连接问题。与键错误相关的三个不同消息:
CURVE I: cannot open client HELLO -- wrong server key?
要么是客户端遗漏了服务器密钥,要么是客户端使用了错误的服务器密钥,要么是服务器遗漏了密钥。
CURVE I: cannot open client INITIATE vouch
要么客户端省略了public或密钥,要么它的public和密钥不对应。
authentication failure
服务器密钥正确,秘密和 public 密钥有效,但服务器拒绝连接,因为客户端无权连接(基于客户端的 public 密钥)。
前两条消息由 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))
我正在连接到外部 VOLTTRON 实例。我没有收到连接的响应。有什么问题?
我正在编写一个简单的 python 脚本来连接到外部平台并检索对等点。如果我得到服务器密钥、客户端密钥、and/or 公钥不正确,我不知道如何从客户端确定哪个是罪魁祸首。我只是得到一个 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()
简短的回答:不,客户端无法确定它与服务器的连接失败的原因。客户端将尝试连接直到超时。
服务器端的日志和调试消息可以帮助解决连接问题。与键错误相关的三个不同消息:
CURVE I: cannot open client HELLO -- wrong server key?
要么是客户端遗漏了服务器密钥,要么是客户端使用了错误的服务器密钥,要么是服务器遗漏了密钥。CURVE I: cannot open client INITIATE vouch
要么客户端省略了public或密钥,要么它的public和密钥不对应。authentication failure
服务器密钥正确,秘密和 public 密钥有效,但服务器拒绝连接,因为客户端无权连接(基于客户端的 public 密钥)。
前两条消息由 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))