在一些使用 Azure IoT 集线器的Microsoft 文档中,它提到在多个简单设备与本地集线器设备通信的情况下,可以在单个 TLS 连接(使用 AMQP 协议)下多路复用多个设备的通信。足够强大,可以与 IoT 中心进行通信。是否有任何示例说明如何实现这种多路复用?DeviceClient库似乎不支持这一点(尽管我可能是错的)。也有人提到了这个场景的 IoT Gateway SDK,但我还没有找到一个明确的例子来说明如何使用它来设置多路复用。任何建议或对其他材料的引用将不胜感激。
4 回答
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()
}
我最近建了一个这样的架构,也许它可以帮助你作为参考。我们的球员:
- 现场网关- 一个足够强大的本地集线器,可以处理与 IoT 集线器的通信并从边缘传感器接收数据。
- 边缘传感器- 无法直接连接到 IoT 中心但实施一些通信协议使它们能够连接到现场网关(Zwave、Zigbee ......)的设备。
- IoT 中心- 处理现场网关和中心之间的 D2C 和 C2D。
- 后端服务器- 从 IoT 中心接收数据。
边缘传感器将其遥测数据发送到现场网关。现场网关保持与 IoT 中心的连接,而 IoT 中心唯一知道的设备是现场网关。
在现场网关中从边缘传感器接收到的每个遥测数据都包含消息负载中的唯一 ID。
在 IoT 中心接收消息时,IoT 中心只知道现场网关。但是当后端处理消息时,它会从有效负载中获取唯一 ID,因此知道哪个是发送遥测数据的正确设备。
所以我们有多个设备都“骑”在一个连接上。
希望它会有所帮助。
我认为 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
我很想知道这个的输出。到目前为止,我遇到的大多数架构只是让设备直接与集线器通信,因此还不需要网关。
您可能会发现此演练很有用:https ://azure.microsoft.com/documentation/articles/iot-hub-linux-gateway-sdk-simulated-device/
它使用模拟设备来展示如何通过使用 Gateway SDK 构建的网关连接多个设备。