将设备到云的消息发送到 IoTHub 时是否可以重用 Azure Functions 上的连接?
Is it possible to reuse Connections on Azure Functions when sending Device-to-Cloud messages to IoTHub?
我有一个 Azure IoTHub,其中注册了数千台设备。这些设备通过电信提供商进行通信,电信提供商通过 Azure 存储队列发送消息。此存储队列触发需要解析消息并将事件发送到 IoTHub 的 Azure 函数,如下所示。
目前,我们使用 Azure IoTHub SDK 为每个负载创建一个 DeviceClient 并发送事件。因为 DeviceClient 代表 IoTHub 中的设备并且承载事件源的上下文,所以我们必须为每个事件重新创建一个设备客户端。这很快就超过了 Azure Functions 允许的连接数阈值。
我们已尝试使用 Azure Functions 的 IoTHub 输出绑定,但无法开始工作,我认为它不会起作用,因为我们需要确保事件以正确的上下文(消息)到达 IoTHub由正确的设备发送)。
解决这个问题的正确方法是什么?可以重复使用与 IoTHub 的连接吗?我们应该放弃 Azure Function 而改用其他东西吗?
我假设 Telco 是某种自定义设备管理解决方案(供应商锁定解决方案),它还可以与设备通信并接收设备遥测数据,并最终将其转发到指定端点,对吗?
如果我可能会问,如果我的假设是正确的,为什么你需要将事件传送到 IoT 中心,如果你不是通过 IoT 中心管理电信设备(你的图表上的箭头只有一个方向) ?
如果仅将 IoT 中心用作消息代理以进行本质上的云到云通信,那将是无益的。同样从概念上讲,您所描述的是云到云通信,而 IoT 中心旨在用于设备。
这是我会做的。 Setup API 管理(或 http 触发的 Azure 函数)作为 Telco 的前门并将消息传递到事件中心。
您可以在此处选择传递请求主体,例如您的遥测数据所在的位置 - 我再次假设。
保留 IoT 中心,并设置到之前创建的事件中心的路由。
现在,如果您的设备未被供应商锁定并且可以直接与 IoT 中心对话,消息将被重新路由到事件中心。此外,电信设备消息将路由到完全相同的事件中心。
现在您可以拥有例如 Azure 流分析,它可以分析仅来自事件中心的数据流,同时适用于 Telco 设备和可能的非 Telco 设备。
在尝试了一些事情之后,我最终放弃了使用 SDK 将消息推送到 IoT 中心。这是因为 SDK 使用 AMQP,并且为每个负载创建一个 DeviceClient 是不可行的。
我们改为使用 HTTPS 将消息推送到 IoT 中心,并使用 HttpClientFactory,我们能够进行连接池。
我想我会把它放在这里以防有人遇到同样的问题。
以下是向 IoT 中心发送消息的 Http 请求示例
Host: https://<iothubname>.azure-devices.net/devices/<deviceId>/messages/events?api-version=2018-06-30
Authorization: SharedAccessSignature sr=<iothubname>.azure-devices.net&sig=abc123;12344iweoippweruea=iothubowner&se=1570574220
Body: <normal Interval or alarms payloads> // example {"deviceid": "abc", "hello": "world"}
最后,感谢@kgalic 的回答,但您的建议行不通。这不是纯粹的 B2B 集成。我们的实施必须允许直接连接到物联网中心的设备和通过电信公司连接的设备。这就是为什么每个设备都需要有自己的身份和数字孪生。
我有一个 Azure IoTHub,其中注册了数千台设备。这些设备通过电信提供商进行通信,电信提供商通过 Azure 存储队列发送消息。此存储队列触发需要解析消息并将事件发送到 IoTHub 的 Azure 函数,如下所示。
目前,我们使用 Azure IoTHub SDK 为每个负载创建一个 DeviceClient 并发送事件。因为 DeviceClient 代表 IoTHub 中的设备并且承载事件源的上下文,所以我们必须为每个事件重新创建一个设备客户端。这很快就超过了 Azure Functions 允许的连接数阈值。
我们已尝试使用 Azure Functions 的 IoTHub 输出绑定,但无法开始工作,我认为它不会起作用,因为我们需要确保事件以正确的上下文(消息)到达 IoTHub由正确的设备发送)。
解决这个问题的正确方法是什么?可以重复使用与 IoTHub 的连接吗?我们应该放弃 Azure Function 而改用其他东西吗?
我假设 Telco 是某种自定义设备管理解决方案(供应商锁定解决方案),它还可以与设备通信并接收设备遥测数据,并最终将其转发到指定端点,对吗?
如果我可能会问,如果我的假设是正确的,为什么你需要将事件传送到 IoT 中心,如果你不是通过 IoT 中心管理电信设备(你的图表上的箭头只有一个方向) ?
如果仅将 IoT 中心用作消息代理以进行本质上的云到云通信,那将是无益的。同样从概念上讲,您所描述的是云到云通信,而 IoT 中心旨在用于设备。
这是我会做的。 Setup API 管理(或 http 触发的 Azure 函数)作为 Telco 的前门并将消息传递到事件中心。 您可以在此处选择传递请求主体,例如您的遥测数据所在的位置 - 我再次假设。
保留 IoT 中心,并设置到之前创建的事件中心的路由。
现在,如果您的设备未被供应商锁定并且可以直接与 IoT 中心对话,消息将被重新路由到事件中心。此外,电信设备消息将路由到完全相同的事件中心。
现在您可以拥有例如 Azure 流分析,它可以分析仅来自事件中心的数据流,同时适用于 Telco 设备和可能的非 Telco 设备。
在尝试了一些事情之后,我最终放弃了使用 SDK 将消息推送到 IoT 中心。这是因为 SDK 使用 AMQP,并且为每个负载创建一个 DeviceClient 是不可行的。 我们改为使用 HTTPS 将消息推送到 IoT 中心,并使用 HttpClientFactory,我们能够进行连接池。 我想我会把它放在这里以防有人遇到同样的问题。
以下是向 IoT 中心发送消息的 Http 请求示例
Host: https://<iothubname>.azure-devices.net/devices/<deviceId>/messages/events?api-version=2018-06-30
Authorization: SharedAccessSignature sr=<iothubname>.azure-devices.net&sig=abc123;12344iweoippweruea=iothubowner&se=1570574220
Body: <normal Interval or alarms payloads> // example {"deviceid": "abc", "hello": "world"}
最后,感谢@kgalic 的回答,但您的建议行不通。这不是纯粹的 B2B 集成。我们的实施必须允许直接连接到物联网中心的设备和通过电信公司连接的设备。这就是为什么每个设备都需要有自己的身份和数字孪生。