Azure IoT Edge 自定义模块未连接到 IoT-Hub-Container

Azure IoT Edge Custom Module doesn't connect to IoT-Hub-Container

我的问题可能和this post一样,但我不明白那些花哨的大城市Whosebug政治,所以我不想打扰任何人,只是问我自己的问题。

我想根据 Microsoft 教程 here 将我的 Windows PC 作为 "Edge Device" 连接到我的 Azure IoT 中心。当我只 运行 "temperatureSensor" 模块时,一切都工作得很好,它作为图像出现在 Microsoft 存储库中。该模块是 运行,连接到将数据发送到 azure hub 的集线器容器。

下一步是编写自定义模块。在 Microsoft 的网站上还有一个教程,它提供了一个 C# 和 Python 的模板,可以为任何目的进行修改。我尝试了两个示例(C# 和 Python),但只有 C# 版本没有任何其他问题。但由于我对C#不是很精通,只有Python,我也需要得到那个运行ning

但是 Python 版本在下载图像并启动容器后不久就失败了。 edgeAgent 和 edgeHub 以及 Mock-"temperatureSensor" 模块 运行 和以前一样没有问题。但是自定义 python 模块似乎无法连接到 hub-container。 docker 日志如下:

edgeAgent:

2018-06-22 10:28:26.062 +00:00 [INF] - Plan execution started for deployment 8
2018-06-22 10:28:26.062 +00:00 [INF] - Executing command: "Command Group: (
  [docker stop -t 10 filterModule]
  [docker start filterModule]
  [Update health stats for module filterModule]
)"
2018-06-22 10:28:26.062 +00:00 [INF] - Executing command: "docker stop -t 10 filterModule"
2018-06-22 10:28:26.063 +00:00 [INF] - Executing command: "docker start filterModule"
2018-06-22 10:28:26.567 +00:00 [INF] - Executing command: "Update health stats for module filterModule"
2018-06-22 10:28:26.567 +00:00 [INF] - Plan execution ended for deployment 8
2018-06-22 10:28:26.872 +00:00 [INF] - Updated reported properties
2018-06-22 10:28:56.975 +00:00 [INF] - HealthRestartPlanner is clearing restart stats for module 'edgeHub' as it has been running healthy for 00:10:00.
2018-06-22 10:28:56.975 +00:00 [INF] - Plan execution started for deployment 8
2018-06-22 10:28:56.975 +00:00 [INF] - Executing command: "Reset health stats for module edgeHub"
2018-06-22 10:28:56.977 +00:00 [INF] - Plan execution ended for deployment 8
2018-06-22 10:28:57.263 +00:00 [INF] - Updated reported properties
2018-06-22 10:29:02.268 +00:00 [INF] - HealthRestartPlanner is clearing restart stats for module 'tempSensor' as it has been running healthy for 00:10:00.
2018-06-22 10:29:02.268 +00:00 [INF] - Plan execution started for deployment 8
2018-06-22 10:29:02.268 +00:00 [INF] - Executing command: "Reset health stats for module tempSensor"
2018-06-22 10:29:02.268 +00:00 [INF] - Plan execution ended for deployment 8
2018-06-22 10:29:02.571 +00:00 [INF] - Updated reported properties

edgeHub:

2018-06-22 10:26:14.438 +00:00 [INF] - Attempting to connect to IoT Hub for client xxxdevice/filterModule via AMQP over WebSocket...
2018-06-22 10:26:14.439 +00:00 [INF] - New token requested by client xxxdevice/filterModule, but using existing token as it is usable.
2018-06-22 10:26:14.789 +00:00 [INF] - Connected to IoT Hub for client xxxdevice/filterModule via AMQP over WebSocket, with client operation timeout 60000.
2018-06-22 10:26:14.793 +00:00 [INF] - Closed cloud proxy for device xxxdevice/filterModule
2018-06-22 10:26:14.793 +00:00 [INF] - No session state found in store for xxxdevice/filterModule
2018-06-22 10:26:14.793 +00:00 [INF] - New cloud connection created for device xxxdevice/filterModule
2018-06-22 10:26:14.793 +00:00 [INF] - Successfully authenticated device xxxdevice/filterModule
2018-06-22 10:26:14.793 +00:00 [INF] - Successfully generated identity for clientId xxxdevice/filterModule and username xxx-iothub.azure-devices.net/xxxdevice/filterModule/api-version=2016-11-14&DeviceClientType=iothubclient%2f1.1.31%20(native%3b%20Linux%3b%20x86_64)
2018-06-22 10:26:14.793 +00:00 [INF] - ClientAuthenticated, xxxdevice/filterModule, 084e3167
2018-06-22 10:28:26.580 +00:00 [INF] - Attempting to connect to IoT Hub for client xxxdevice/filterModule via AMQP...
2018-06-22 10:29:26.583 +00:00 [INF] - Attempting to connect to IoT Hub for client xxxdevice/filterModule via AMQP over WebSocket...
2018-06-22 10:29:26.584 +00:00 [INF] - New token requested by client xxxdevice/filterModule, but using existing token as it is usable.
2018-06-22 10:29:26.918 +00:00 [INF] - Connected to IoT Hub for client xxxdevice/filterModule via AMQP over WebSocket, with client operation timeout 60000.
2018-06-22 10:29:26.919 +00:00 [INF] - Closed cloud proxy for device xxxdevice/filterModule
2018-06-22 10:29:26.923 +00:00 [INF] - No session state found in store for xxxdevice/filterModule
2018-06-22 10:29:26.923 +00:00 [INF] - New cloud connection created for device xxxdevice/filterModule
2018-06-22 10:29:26.924 +00:00 [INF] - Successfully authenticated device xxxdevice/filterModule
2018-06-22 10:29:26.924 +00:00 [INF] - Successfully generated identity for clientId xxxdevice/filterModule and username xxx-iothub.azure-devices.net/xxxdevice/filterModule/api-version=2016-11-14&DeviceClientType=iothubclient%2f1.1.31%20(native%3b%20Linux%3b%20x86_64)
2018-06-22 10:29:26.924 +00:00 [INF] - ClientAuthenticated, xxxdevice/filterModule, 126cb7eb
2018-06-22 10:31:33.659 +00:00 [ERR] - Module filterModule is not connected

过滤器:

Python 2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609]

IoT Hub Client for Python
Adding TrustedCerts from: /mnt/edgemodule/edge-device-ca.cert.pem
set_option TrustedCerts successful
Starting the IoT Hub Python sample using protocol MQTT...
The sample is now waiting for messages and will indefinitely.  Press Ctrl-C to exit.
Error: Time:Fri Jun 22 10:28:57 2018 File:/usr/sdk/src/c/iothub_client/src/iothubtransport_mqtt_common.c Func:InitializeConnection Line:2003 mqtt_client timed out waiting for CONNACK

这是无限重复的。似乎集线器确实注意到了过滤器,但是身份验证成功了,但是无论如何访问都被拒绝了。这可能是 Python SDK 中的错误,因为正如我所说,它与 C# 版本(在其他相同的情况下)一起工作得很好。或者是否有可能是防火墙问题。我真的不这么认为,因为过滤器日志表明存在 MQTT 问题。据我了解,MQTT 仅适用于内部边缘设备流量,不适用于传出流量(docker 和设备外部)。所以防火墙应该不是问题(?) 实际问题显然是等待集线器确认连接的超时。因此,要么集线器没有收到连接请求,要么没有回复,要么回复不知何故丢失了。

提前感谢所有帮助。

我假设您正尝试在 Windows Edge 设备上 运行 Windows 容器。当前不支持 Windows 容器上的 Python(和 C)自定义模块。这与我们存储和检索密钥的方式有关。这个功能肯定在路线图上,虽然我们目前没有任何 ETA。有几种方法可以解决这个问题:

  • 您可以 运行 Linux 个容器
  • 您可以 运行 在 Linux 台机器或虚拟机上
  • 将很快添加更多语言支持 - 您可以在 azure-iot-sdk-node and azure-iot-sdk-java
  • 的模块预览分支上查看我们的进度

我在 Linux 边缘设备 上使用 Linux 容器 时遇到了同样的问题。我的所有模块都是用 Python 编写的,除了一个 Azure Stream Analytics

为了解决这个问题,我不得不卸载 azure-iot-edge-runtime-ctl... 不是 "proper" 的解决方法,但它奏效了! 这是我的脚本:

sudo pip3 uninstall azure-iot-edge-runtime-ctl
sudo pip3 install azure-iot-edge-runtime-ctl
sudo iotedgectl setup --connection-string "<your connection key>" --auto-cert-gen-force-no-password
sudo iotedgectl login --address <your container registry address> --username <your container registry username> --password <your container registry password>
sudo iotedgectl start

如果有人有更好的主意,我也对解决它的正确方法感兴趣...?

自此 post 我也有机会在一次会议上与 Microsoft 人员交谈。当我们试图重现这个问题时,结果发现整个过程在前一天发生了变化。 Iotedgectl 现在是一项 Windows 服务(据我所知,它是 "just" 一个常规流程 [这有意义吗?])

总之:整个iot-edge目前似乎正在大修。所以根据我的经验,很多事情都会发生变化,我很乐观,下次我尝试这些教程时,一切都会很好。我要关闭此线程。