如何在VOLTTRON中调试连接问题?

时间:2016-07-22 20:08:08

标签: python volttron

我正在连接外部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()

1 个答案:

答案 0 :(得分:2)

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

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

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

  2. CURVE I: cannot open client INITIATE vouch
    客户端省略公钥或密钥,或者其公钥和密钥不相互对应。

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

  4. 前两条消息由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))