Azure IoT 中心 AMQP 通信多路复用

Posted

技术标签:

【中文标题】Azure IoT 中心 AMQP 通信多路复用【英文标题】:Azure IoT Hub AMQP Communication Multiplexing 【发布时间】:2016-08-31 20:37:09 【问题描述】:

在一些使用 Azure IoT 中心的Microsoft documentation 中,它提到可以在单个 TLS 连接(使用 AMQP 协议)下多路复用多个设备的通信,用于多个简单设备与功能强大到可以与 IoT 中心通信的本地中心设备。是否有任何示例说明如何实现这种多路复用? DeviceClient library 似乎不支持这一点(尽管我可能是错的)。也有人提到了这个场景的 IoT Gateway SDK,但我还没有找到一个明确的例子来说明如何使用它来设置多路复用。任何建议或对其他材料的参考将不胜感激。

【问题讨论】:

【参考方案1】:

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()
              

【讨论】:

【参考方案2】:

我最近搭建了这样一个架构,或许可以作为参考对你有所帮助。 我们的玩家:

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

边缘传感器将其遥测数据发送到现场网关。 Field Gateway 保持与 IoT Hub 的连接,IoT Hub 知道的唯一设备是 Field Gateway。

在现场网关中从边缘传感器接收到的每个遥测数据在消息负载中都包含一个唯一的 ID。

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

所以我们有多个设备都“骑”在一个连接上。

希望它会有所帮助。

【讨论】:

这是一个非常有趣的方法。似乎是一个合理的解决方案。【参考方案3】:

我认为 Azure IoT 网关仍处于 Beta 阶段,这可能是缺乏示例的原因。

这里有几个页面可以提供更多见解:

Azure IoT 网关 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 上的实际测试版 SDK,但假设您已经拥有这个:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于Azure IoT 中心 AMQP 通信多路复用的主要内容,如果未能解决你的问题,请参考以下文章

多路复用技术

python中的IO多路复用

Azure IoT 中心 - 使用 IoT 中心将文件从 Azure blob 下载到 IoT 设备

多路复用技术

尝试使用 amqp 连接到 azure 事件中心时出错

IoT 中心到 Azure Edge