Как я могу отладить проблему подключения в 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()
1 ответ
Краткий ответ: нет, клиент не может определить причину сбоя подключения к серверу. Клиент будет пытаться подключиться до истечения времени ожидания.
Журналы и сообщения отладки на стороне сервера могут помочь в устранении проблем с подключением. Есть три отдельных сообщения, связанные с ключевыми ошибками:
CURVE I: cannot open client HELLO -- wrong server key?
Либо клиент пропускает ключ сервера, клиент использовал неверный ключ сервера, либо сервер пропускает секретный ключ.CURVE I: cannot open client INITIATE vouch
Либо клиент пропускает открытый или секретный ключ, либо его открытый и секретный ключи не соответствуют друг другу.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))