不同网络中两个应用程序之间的命令

时间:2016-01-06 17:18:08

标签: c# sockets azure mqtt azureservicebus

我想将命令从一个应用程序(例如,在移动设备上运行)发送到位于不同网络中的另一个应用程序(例如,在嵌入式设备上运行)。

我不想使用VPN或端口转发之类的东西。因此,经过一些研究后,我发现了其他一些方法,例如通过Azure Service Bus等云消息服务。

从第一个应用程序向服务总线发送命令/消息对我来说不是问题。但我真的不明白两个如何从云服务连接到第二个设备?我知道我也可以从第二个设备向云服务发送消息,例如通过HTTPS。然后云服务可以保持该连接的活跃。只要连接处于活动状态,我就可以向第二个设备发送消息。

但有一点我无法理解:

  • 当我拥有数千台设备时,保持数千个连接存活不是一个问题吗?
  • 如果有新消息,第二个设备如何监听连接?在嵌入式设备上需要太多的资源吗?

我还读到了使用“长轮询”技术和网络套接字。我知道太少了解这些概念的优点和缺点。我应该使用哪种技术解决问题?

为了更加平台无关,我不想使用Azure IoT Hub等服务。

修改

也许我可以使用Web服务并实现MQTT Broker?

1 个答案:

答案 0 :(得分:2)

我认为上面提到的MQTT代理将帮助您,特别是因为您的用例正是MQTT及其实现(代理和客户端)的构建。

简化的故事如下:

在您的应用程序上运行的MQTT客户端发布'使用'主题的MQTT消息' (想想路由密钥)到MQTT代理。在您的设备上运行的MQTT客户端可以订阅相同的主题'在经纪人身上。这使代理能够将消息从应用程序路由到设备,而无需他们了解彼此。

据我了解您的问题,您的疑虑如下:

  1. 可以同时连接所有设备(数千个开放的TCP连接),因此可以通过实时“实时”接收第一个应用程序发布的消息。
  2. 假设设备因任何原因而断开连接,例如由于网络问题或降低能耗,将如何确保设备最终将接收消息。
  3. 设备如何连接到代理。
  4. 关于1.构建MQTT代理以处理(并保持)大量TCP连接。例如VerneMQ,我可以谈论的MQTT代理,因为我是核心开发人员之一,能够在一个节点上处理超过一百万个连接(通过适当的服务器配置,它实际上主要是一个问题)可用的RAM)。但是,如果设备主要处于休眠状态,我们只推荐这样的设置。使用VerneMQ,您还可以向群集添加更多节点,并平衡所有群集节点之间的连接。

    关于2. MQTT代理通常为尚未发送给客户端或未被客户端确认的消息实现离线存储。这允许您的设备离线数小时并在重新连接时接收消息。

    关于3.这是特定于您的用例。在最简单的情况下,您在每个设备上配置固定IP:端口,并且在设备上运行的MQTT客户端使用它来连接到代理。根据重新配置设备的能力,使用DNS查找是有意义的,甚至可以提供反向信道'用于重新配置。

    对于符合标准的MQTT客户端软件,请查看Eclipse Paho。有关可用MQTT代理的最新列表,请参阅the list of MQTT brokers