如何调试 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()

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

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

  1. CURVE I: cannot open client HELLO -- wrong server key?
    要么是客户端遗漏了服务器密钥,要么是客户端使用了错误的服务器密钥,要么是服务器遗漏了密钥。

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

  3. 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))