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

标签 c# sockets azure mqtt azureservicebus

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

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

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

但是有一些地方我不明白:

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

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

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

编辑:

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

最佳答案

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

简化的故事如下:

在应用程序上运行的 MQTT 客户端使用“主题”(认为是路由键)向 MQTT 代理“发布”一条 MQTT 消息。您的设备上运行的 MQTT 客户端订阅了代理上的同一“主题”。这使得代理能够将消息从应用程序路由到设备,而不要求它们彼此了解。

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

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

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

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

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

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

关于c# - 不同网络中两个应用程序之间的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34638886/

相关文章:

c# - |= 运算符是做什么的?

c++ - 如何防止多播套接字接收单播数据

azure - 权限不足,无法完成操作 - 服务主体

Azure 负载均衡器问题?

c# - 将 WPF xaml 绑定(bind)到 ViewModel 而不构建它

C# 对 WPF 应用程序进行屏幕截图

c# - 在 C++ 之后学习 C#

c++ - 在两个不同的程序之间发送/接收数据

python - 为什么这个套接字连接只允许1次发送和接收?

asp.net-mvc - Azure VM 上的安全 Solr 搜索引擎