通信仅知道一个IP的两个设备的最佳方法

时间:2018-07-19 16:49:18

标签: json python-3.x zeromq messaging pyzmq

我正在尝试创建一个包含一个交换JSON消息传递系统的程序,其中有一个A或中央设备,我们知道它的静态IP和一个或多个B设备,它们具有动态和不稳定的IP

我建议的交流不仅应该从B到A(包括从B到不从答案)可行,而且应该从A到B是可行的,并且结果相同。

我的消息传递技能仅限于ZMQ,所以我考虑了两种可能的情况:

在第一个基于PUSH-PULL套接字的基础上,A具有一个与B相同的PULL套接字和另一个PUSH套接字。作为心跳信号,B每X秒/分钟发送一次JSON,说“这是我的IP”。该信息在一个时间范围内被认为是可靠的,并且一方面,我们解决了从B到A的通信(相当容易),另一方面,B保存了一个IP,以最小的可靠性尝试与之联系。

关于第二个,我考虑过REQ-REP套接字。在此配置中,A具有一个RES套接字,该套接字能够接收和响应来自B的请求,而RES套接字又具有一个关联的REQ套接字,用于执行请求。同样,从B到A的通信很简单。相反,想法是让B发出REQ请求作为心跳信号(例如,每半秒),问“我有东西吗?我有东西吗?”在网络级别上,可靠性比前一种可靠得多,但效率却低得多(我完全忽略了此类呼叫的实际成本)。

首先有更好的建议吗?我想强调的是,我使用ZMQ是因为它是我所知道的,但是,如果有更好的工具/更适合这种情况,我将很高兴知道和/或与他们合作。我知道Google有一种适用于Android的API,但是我并不是在专门谈论智能手机。

2 个答案:

答案 0 :(得分:0)

请记住,PUSHes或REQuests或其他完全独立于绑定或连接的一端的一端。因此,具有稳定IP地址的设备可以绑定其zmq套接字,其他所有东西都将其zmq套接字连接到该IP地址,但是您可以选择将PUSH或PULL或REQ或REP的一端作为终端

答案 1 :(得分:0)

  • “ A”必须bind()个PUB插座和一个ROUTER插座。
  • 任何“ B”客户端都将有两个用于SUB和DEALER的套接字,并且应connect()到已知IP。
  • PUSH / PULL不起作用,因为PUSH仅将消息发送给一个客户端一次,并用于任务/负载平衡
  • 参考资料/示例以及更多详细信息,您可以在https://jupyter-client.readthedocs.io/en/stable/messaging.html的jupyter笔记本中找到。请注意,它们将两个ROUTER-DEALER通道用于带外命令和常规stdin。您只需要一个。