【问题标题】:Commands between two applications in different networks不同网络中两个应用程序之间的命令
【发布时间】:2026-02-18 06:35:01
【问题描述】:

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

我不想使用 VPN 或端口转发之类的东西。因此,经过一些研究,我找到了其他一些方法来做到这一点,例如通过像 Azure 服务总线这样的云消息传递服务。

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

但是有些地方我看不懂:

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

我还阅读了有关使用“长轮询”技术和 Web 套接字的信息。我知道得太少,无法理解这些概念的优点和缺点。我应该使用哪种技术来解决我的问题?

为了更加独立于平台,我不想使用 Azure IoT Hub 之类的服务。

编辑:

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

【问题讨论】:

  • 您是否考虑过网络服务...?意思是创建一个将设备类型作为参数的单一服务..或类似的东西..?
  • @MethodMan 我可以创建一个服务,但是如何通过该服务连接到设备?
  • 您在创建网络服务时是否熟悉连接字符串等?我相信网上有很多关于你想要做什么的例子。。也没有看到任何现有的代码,我无法以一种或另一种方式指导你。对不起
  • @MethodMan 我可以使用连接字符串等来获得从设备到云服务或服务总线的连接。但我的问题是,使用消息服务来获得从云/服务器到设备的连接有哪些权衡。
  • 如果您的数据存储在云上,假设每个设备都有一个不同的连接..那么您可以向配置文件 dbconn 和 dbconn2 添加两个连接字符串,例如点击一个位置但例如,指向 2 个不同的数据库我不确定这有什么令人困惑的地方..

标签: c# sockets azure mqtt azureservicebus


【解决方案1】:

我认为上面提到的 MQTT 代理可以帮助您实现目标,尤其是因为您的用例正是 MQTT 及其实现(代理和客户端)的目的所在。

简单的故事如下:

在您的应用程序上运行的 MQTT 客户端使用“主题”(想想路由密钥)向 MQTT 代理“发布”一条 MQTT 消息。在您的设备上运行的 MQTT 客户端在代理上订阅了相同的“主题”。这使代理能够将消息从应用程序路由到设备,而无需它们彼此了解。

据我了解您的问题,您的担忧如下:

  1. 是否可以同时连接所有设备(数千个打开的 TCP 连接),从而通过代理“实时”接收从您的第一个应用程序发布的消息。
  2. 假设设备将因任何原因断开连接,例如由于网络问题或为了降低能耗,如何确保设备最终接收到消息。
  3. 设备将如何连接到代理。

关于 1. MQTT 代理用于处理(并保持)大量 TCP 连接。例如VerneMQ,我可以谈论一个 MQTT 代理,因为我是核心开发人员之一,能够在一个节点上处理超过一百万个连接(通过适当的服务器配置,它实际上主要是可用 RAM 的问题)。但是,如果设备主要处于睡眠状态,我们只会推荐这样的设置。使用 VerneMQ,您还可以向集群添加更多节点并平衡所有集群节点之间的连接。

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

关于 3。这是特定于您的用例的。在最简单的情况下,您在每台设备上配置一个固定的 IP:Port,然后在设备上运行的 MQTT 客户端使用它连接到代理。根据重新配置设备的能力,使用 DNS 查找甚至为重新配置提供“反向通道”是有意义的。

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

【讨论】:

  • 如果设备向代理发送第一条 MQTT 消息,则设备和代理之间存在开放连接。但是代理如何保持连接打开?
  • 如果双方都没有主动关闭连接,则连接保持打开状态。
最近更新 更多