2016-07-22 36 views
0

我連接到外部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() 
+0

我們需要一些代碼和結果! –

回答

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)) 
+0

您認爲https://github.com/zeromq/pyzmq/blob/master/zmq/error.py中的哪個錯誤會導致我無法打開客戶端INITIATE vouch,如果有的話,因爲曲線非常特殊。 – Craig

+0

@Craig:錯誤「CURVE I:無法打開客戶端INITIATE vouch」不會在pyzmq中產生異常。我在答案中添加了示例代碼,以便您可以測試某些場景(例如,註釋掉客戶端的公鑰或密鑰)。 – Zach

+0

但是我們真正需要的是讓消息返回給客戶端,而不僅僅是打印到服務器上的標準錯誤。 – Craig