Azure IoT 中心 AMQP 通信多路复用

Azure IoT Hub AMQP Communication Multiplexing

在某些 Microsoft documentation for working with Azure IoT hubs, it mentions that it is possible to multiplex the communication of multiple devices under a single TLS connection (using the AMQP protocol) for scenarios where multiple simple devices talk to a local hub device that is powerful enough to communicate with the IoT Hub. Are there any examples of how one would implement this multiplexing? The DeviceClient library 中似乎不支持这一点(尽管我可能是错的)。也有人提到了用于此场景的 IoT Gateway SDK,但我还没有找到一个明确的示例来说明如何使用它来设置多路复用。任何对其他 material 的建议或参考将不胜感激。

我认为 Azure 物联网网关仍处于测试阶段,这可能解释了缺少示例的原因。

以下几页提供了更多见解:

Azure 物联网网关 SDK 简介 (2016 年 4 月发布)

https://azure.microsoft.com/en-gb/blog/introducing-the-azure-iot-gateway-sdk-beta/

支持 IoT 中心的附加协议 (2016 年 8 月更新)

https://azure.microsoft.com/en-gb/documentation/articles/iot-hub-protocol-gateway/

最终 GitHub 上的实际 beta SDK,但假设您已经拥有:

https://github.com/Azure/azure-iot-gateway-sdk

我很想知道它的输出结果。到目前为止,我遇到的大多数架构只是让设备直接与集线器通信,因此不需要网关

我最近搭建了这样一个架构,希望对大家有所帮助,作为参考。 我们的玩家:

  • 现场网关 - 一个足够强大的本地集线器,可以处理与 IoT 集线器的通信并从边缘传感器接收数据。
  • 边缘传感器 - 无法直接连接到 IoT 中心但实施某种通信协议的设备,使它们能够 连接到现场网关(Zwave、Zigbee...)。
  • IoT 集线器 - 处理现场网关和集线器之间的 D2C 和 C2D。
  • 后端服务器 - 从物联网中心接收数据。

Edge Sensor 将其遥测数据发送到 Field Gateway。现场网关保持与 IoT 中心的连接,IoT 中心知道的唯一设备是现场网关。

Field Gateway 从 Edge Sensors 接收到的每个遥测数据都在消息负载中包含一个唯一 ID。

当在 IoT 中心接收消息时,IoT 中心只知道现场网关。但是,当后端处理消息时,它会从有效负载中获取唯一 ID,因此知道哪个是发送遥测数据的正确设备。

所以我们有多个设备都在一个连接上 "riding"。

希望对您有所帮助。

您可能会发现此演练很有用:https://azure.microsoft.com/documentation/articles/iot-hub-linux-gateway-sdk-simulated-device/

它使用模拟设备来展示如何通过使用网关 SDK 构建的网关连接多个设备。

C# DeviceClient 支持使用单个 Amqp/TLS 连接多路复用多个设备。这是一个使用单个 Amqp 连接将三个设备连接到 IotHub 的示例:

             var devices = new Device[3];
             for(int i = 0; i < 3; i++)
             {
                devices[i] = new Device();
                devices[i].Id = Guid.NewGuid().ToString();
                devices[i] = await registryManager.RegisterDeviceAsync(device);
             }

             var deviceClients = new DeviceClient[3];
             for(int i = 0; i < 3; i++)
             {                          
                var auth = new DeviceAuthenticationWithRegistrySymmetricKey(devices[i].Id, devices[i].Authentication.SymmetricKey.PrimaryKey);
                var deviceClients[i] = DeviceClient.Create(
                    <IotHubHostName>,
                    auth,
                    new ITransportSettings[]
                    {
                        new AmqpTransportSettings(Client.TransportType.Amqp_Tcp_Only)
                        {
                            AmqpConnectionPoolSettings = new AmqpConnectionPoolSettings()
                            {
                                Pooling = true,
                                MaxPoolSize = 1
                            }
                        }
                    });
                 await deviceClients[i].OpenAsync()
              }