2016-07-22 1 views
0

Я подключаюсь к внешнему экземпляру VOLTTRON. Я не получаю ответа от подключения. В чем проблема?Как отладить проблему подключения в VOLTTRON?

Я пишу простой скрипт python для подключения к внешней платформе и получения сверстников. Если я получу ключ сервера, клиентский ключ и/или публикацию неправильно, я не знаю, как определить, кто является виновником, с клиентской стороны. Я просто получаю тайм-аут 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, вы бы подумали, что CURVE I: не может открыть клиент. INITIATE vouch подпадает под, если таковая имеется, поскольку кривая настолько особенная. – Craig

+0

@Craig: ошибка «CURVE I: невозможно открыть клиент INITIATE vouch» не генерирует исключение в pyzmq. Я добавил примерный код в свой ответ, чтобы вы могли проверить некоторые сценарии, если хотите (например, прокомментировать общедоступный или секретный ключ клиента). – Zach

+0

Но нам действительно нужно, чтобы сообщение возвращалось к клиенту, а не просто печаталось на стандартной ошибке на сервере. – Craig