带有下游设备的 IoT Edge 网关
IoT Edge Gateway with downstream device
我在 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 网关?
client.SendEventAsync 调用隐式尝试打开与服务器(在本例中为 IoT Edge 网关)的连接,该连接无法完成,这就是您看到调用挂起的原因。
而且我觉得问题出在您的连接字符串中 -
"HostName=.azure-devices.net;DeviceId=;SharedAccessKey=;GatewayHostName="
这里的 GatewayHostName 不是 Edge 设备的 name,而是模块所在的物理设备的 hostname 运行(fqdn 主机名,如果可用)。
所以连接字符串应该是这样的 -
"HostName=.azure-devices.net;DeviceId=;SharedAccessKey=;GatewayHostName="
如果您的代码在您的自定义模块中执行,那么您只需使用环境变量 $EdgeHubConnectionString,它应该包含您可以使用的连接字符串。
如果它是下游设备,那么除了使用正确的连接字符串外,您还需要确保该设备信任用于接受网关设备连接的证书。您可以在此处找到更多信息 - https://docs.microsoft.com/en-us/azure/iot-edge/how-to-create-transparent-gateway
我在 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 网关?
client.SendEventAsync 调用隐式尝试打开与服务器(在本例中为 IoT Edge 网关)的连接,该连接无法完成,这就是您看到调用挂起的原因。
而且我觉得问题出在您的连接字符串中 - "HostName=.azure-devices.net;DeviceId=;SharedAccessKey=;GatewayHostName="
这里的 GatewayHostName 不是 Edge 设备的 name,而是模块所在的物理设备的 hostname 运行(fqdn 主机名,如果可用)。 所以连接字符串应该是这样的 - "HostName=.azure-devices.net;DeviceId=;SharedAccessKey=;GatewayHostName="
如果您的代码在您的自定义模块中执行,那么您只需使用环境变量 $EdgeHubConnectionString,它应该包含您可以使用的连接字符串。
如果它是下游设备,那么除了使用正确的连接字符串外,您还需要确保该设备信任用于接受网关设备连接的证书。您可以在此处找到更多信息 - https://docs.microsoft.com/en-us/azure/iot-edge/how-to-create-transparent-gateway