如何调试在新的以容器为中心的范例中运行的多个IoT Edge模块?

时间:2017-12-22 20:46:58

标签: azure-iot-edge

我之前在Edge网关中运行了几个模块。该网关托管在标准的.net框架Windows服务中,模块只是实例化的对象。模块相互之间来回发送消息,只需在调试器中启动服务并执行我需要的任何操作即可。

现在,edge已转移到以容器为中心的模型,您可以将包含.net核心可执行文件的构建容器推送到azure容器存储,然后将这些容器部署到目标计算机上正在运行的docker服务。我有部署工作,我可以看到容器在我的开发机器上运行,但我不知道我应该如何在Visual Studio 2017中调试它们?我是否附加到流程?如果我想一次调试5个模块以确保所有消息传递都按照需要进行,该怎么办?

2 个答案:

答案 0 :(得分:1)

只要提供了正确的凭据,Edge Hub并不关心谁在调用它。调用者可以在Docker容器中,在主机或下游设备上的另一个进程中。因此,在开发过程中,使用Visual Studio时,您应该只需 F5 (启动调试器)模块项目,并使其与Edge Hub连接并进行通信。您只需要确保为其提供正确的上下文。例如,您可能必须设置VS调试设置,以便正确设置EdgeHubConnectionString值。

现在,不幸的是,Azure门户(或Azure CLI)不支持获取模块凭据,您需要构建连接字符串以连接到Edge Hub。对此的支持应该很快就会到来。

与此同时,您可以通过正常方式进行部署(即通过门户中的“设置模块”并让Edge Agent为您部署容器)来解决此问题,然后运行以下命令(或类似的东西)从bash终端打印连接字符串的值:

docker inspect                                                         \
     --format='{{range $e := .Config.Env}}{{printf "%s\n" $e}}{{end}}' \
     YourContainerName |                                               \
  grep EdgeHubConnectionString |                                       \
  cut -c 25-

将上面命令中的YourContainerName替换为模块/容器的名称。

除此之外,您还希望在连接到Edge Hub时跳过TLS证书验证。这是因为在PC上运行时,不会设置为信任Edge Hub使用的服务器证书。您可以使用以下代码段跳过模块中的证书验证:

var mqttSetting = new MqttTransportSettings(TransportType.Mqtt_Tcp_Only);
mqttSetting.RemoteCertificateValidationCallback =
    (sender, certificate, chain, sslPolicyErrors) => true;
ITransportSettings[] settings = { mqttSetting };

DeviceClient deviceClient =
     DeviceClient.CreateFromConnectionString(connectionString, settings);

在此之后,您应该可以从VS调试模块。

答案 1 :(得分:1)

有一篇文章讨论如何在Visual Studio Code中调试C#模块:https://blogs.msdn.microsoft.com/visualstudio/2017/12/12/easily-create-iot-edge-custom-modules-with-visual-studio-code/。请确保您在与部署目标相同的计算机上进行调试。