0

我创建了一个在 Docker 中运行的 Azure IoT 边缘网关,其中包含一个自定义模块,该模块只是一个传递(获取消息并将其发送到上游)。

我创建了一个简单的 .net 控制台应用程序来向网关发送消息,以便对其进行评估。

这是我在控制台应用程序中的代码。

DeviceClient client =
            DeviceClient.CreateFromConnectionString("HostName=<my iot hub in azure>.azure-devices.net;DeviceId=<the name of the device>;SharedAccessKey=<my access key>;GatewayHostName=<the name of the IoT Edge Device>");

Message message = new Message();

message.Properties.Add("testproperty", "test");

client.SendEventAsync(message).Wait();

看来,当调用 SendEventAsync 方法时,它将永远挂起。我等了 5 分钟,应用程序一直在等待。如果我从连接字符串中删除 GatewayHostName,它会立即执行,并且我的消息会直接发送到 Azure 中的 IoT 中心。

为什么它不会将消息发送到 IoT Edge 网关?

4

1 回答 1

1

client.SendEventAsync 调用隐式尝试打开与服务器(在本例中为 IoT Edge 网关)的连接,该连接无法完成,这就是您看到调用挂起的原因。

而且我觉得问题出在您的连接字符串中 - “HostName=.azure-devices.net;DeviceId=;SharedAccessKey=; GatewayHostName=

这里的 GatewayHostName 不是 Edge 设备的名称,而是运行模块的物理设备的主机名(fqdn 主机名,如果可用)。所以连接字符串应该是这样的 - “HostName=.azure-devices.net;DeviceId=;SharedAccessKey=; GatewayHostName=

如果您的代码在您的自定义模块中执行,那么您可以简单地使用环境变量 $EdgeHubConnectionString,它应该包含您可以使用的连接字符串。

如果它是下游设备,那么除了使用正确的连接字符串外,您还需要确保设备信任用于接受网关设备连接的证书。您可以在此处找到更多信息 - https://docs.microsoft.com/en-us/azure/iot-edge/how-to-create-transparent-gateway

于 2017-12-18T21:19:39.510 回答