带有下游设备的物联网Edge Gateway

时间:2017-12-18 00:43:50

标签: azure iot azure-iot-hub azure-iot-edge

我创建了一个在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方法时,它将挂起forerver。我等了5分钟,应用程序卡住了等待。如果我从连接字符串中删除GatewayHostName,它立即执行,我的消息将直接发送到Azure中的IoT中心。

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

1 个答案:

答案 0 :(得分:1)

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

我觉得问题出在你的连接字符串中 - &#34;主机名= .azure-devices.net; DEVICEID =; SharedAccessKey =; GatewayHostName = &#34;

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

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

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