Я пытаюсь отправить файл через беспроводную сеть с использованием ZeroMQ и протокола NORM. Насколько я понимаю, в настоящее время я использую шаблон PUB/SUB, поскольку это единственный шаблон, поддерживаемый NORM с ZeroMQ.Использование ZEROMQ и NORM для многоадресных пакетов для большого количества устройств WiFI
У меня он настроен так, что небольшие сообщения передаются просто отлично, но иногда приемник обычно не получает сообщение. С этого момента сообщения просто отбрасываются. Иногда это может быть исправлено путем перезапуска издателя или подписчика, но не каждый раз. Я попытался настроить бит отправленных бит и время между каждым вызовом для отправки безрезультатно. Похоже, я могу получать около 20-60 сообщений многоадресной рассылки до того, как соединение станет неустойчивым. Если я использую тот же код, но настрою его с помощью TCP, соединение намного надежнее, порядка тысяч сообщений до возникновения ошибки.
Я попытался реализовать класс-оболочку, чтобы перезапустить подписчиков после определенного периода бездействия - это не сработало. Также не устанавливает параметр socket.recv (zmq.NOBLOCK) внутри цикла while.
Я знаю о Pub-Sub шаблон синхронизации, как описано здесь, http://zguide.zeromq.org/page:all#Node-Coordination, но NORM, как это реализовано в norm_engine.cpp в ZeroMQ в (https://github.com/zeromq/libzmq/blob/master/src/norm_engine.cpp) не выглядит, как он настроен, чтобы этот шаблон.
Есть ли способ повторно отправить потерянные пакеты или обеспечить здоровое многоадресное соединение?
Код - Python.
Издательство:
import zmq
import time
import os
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.connect("norm://224.0.0.1:3000")
i = 1
imgfile_path = "/home/adam/programs/zmq/tux.svg.png"
imgsize = os.stat(imgfile_path).st_size
print "attempting to send", imgsize, "bytes"
sleep_time = 1
topic = ""
packet_size = 500
left = packet_size
f = open(imgfile_path, 'rb')
fi = f.read(packet_size)
while (imgsize - left) > packet_size:
print "sent packet number:", i
print "size: ", len(topic + str(i)[-1] + fi)
i += 1
socket.send(topic + str(i)[-1] + fi)
fi = f.read(packet_size)
left += packet_size
time.sleep(sleep_time)
print imgsize, left
time.sleep(sleep_time)
fi = f.read(imgsize - left)
print fi
socket.send(topic + " " + fi)
f.close()
Subscriber:
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.bind("norm://224.0.0.2:3000")
socket.setsockopt(zmq.SUBSCRIBE, "")
imgdir = "/home/adam/programs/zmq/img/"
filename = "tux.svg.png"
destfile = imgdir + filename
packet_size = 501
print "attempting to receive"
f = open(destfile, 'wb')
while True:
msg = None
while msg is None:
try:
msg = socket.recv(zmq.NOBLOCK)
except:
pass
if msg:
print "msg = ", msg[0]
print "we got something", len(msg)
f.write(msg[1:])
if len(msg) < packet_size:
break
f.close()
print "exiting..."
Кроме того, когда я могу гарантировать, что я могу отправить файл, я хотел бы, чтобы настроить прямое исправление ошибок и NACK скорость, которая почему NORM так полезен для меня. Есть ли способ сделать это, не переписывая norm_engine.cpp?
Спасибо!
Спасибо. Я пытаюсь вытолкнуть границы многоадресной рассылки и подумал, что можно передавать данные таким образом. Надеемся использовать прямую коррекцию ошибок NORM для снижения скорости. Вы слышали об этом? – scordata
Обновлен мой ответ с более подробной информацией о FEC – Jason