将 C2D 消息发送到 Azure IoT Edge

Sending C2D message to Azure IoT Edge

我知道 Azure IoT Edge 不支持 C2D,一个选项是使用直接方法。

我可以使用模块客户端代码并向模块发送消息吗?

我有一个 ModuleA,它有 output1,而 ModuleB 有一个 Handler input1。 我有如下路线

"ModuleAToModuleB": "FROM /messages/modules/ModuleA/outputs/output1 INTO BrokeredEndpoint(\"/modules/ModuleB/inputs/input1\")",

然后我使用控制台应用程序中的以下代码,并根据特定模块的连接字符串(ModuleA 连接字符串)向特定模块发送消息

string dataString = JsonConvert.SerializeObject(jData);
byte[] dataBytes = Encoding.UTF8.GetBytes(dataString);
var pipeMessage = new Message(dataBytes);
var moduleClient = ModuleClient.CreateFromConnectionString("HostName=xxx.azure-devices.net;DeviceId=xxx-01;ModuleId=ModuleA;SharedAccessKey=XXXXXXX", TransportType.Mqtt);
await moduleClient.SendEventAsync("output1", pipeMessage);

此代码是否有效,它会将消息从 ModuleA 发送到 ModuleB 吗?

你需要调用像InvokeMethodAsync这样的函数,它是可以调用从模块A到模块B的直接方法。在您展示的示例中,您似乎正在调用 sendEventAsync,这可能不起作用。 C#.

中的示例

另请仔细阅读此 link,其中还建议了另一种模块间通信方法。

In addition to using direct methods, it's also possible for two modules to communicate directly with each other, bypassing the Edge Hub. The runtime, via Docker's networking capabilities, manages the DNS entries for each module (container). This allows one module to resolve the IP address of another module by its name.

For an example of this in action, you can follow the SQL tutorial here: https://docs.microsoft.com/en-us/azure/iot-edge/tutorial-store-data-sql-server. This tutorial uses a module to read data out of the Edge Hub and write it into another module hosting SQLServer using the SQLServer client SDK. This interaction with SQLServer does not use the Edge Hub for communicating

如果您想将控制台应用程序中 laptop/pc 的任何内容发送到您的 IoT Edge 设备,您将需要使用直接方法,就像您在问题中提到的那样。为此,您可以使用服务 SDK 并使用以下方法:

InvokeDeviceMethodAsync(string deviceId, string moduleId, CloudToDeviceMethod cloudToDeviceMethod);

在您的示例中,您建议使用 ModuleClient 向您的模块发送消息。这将不起作用,ModuleClient 设计为仅在 Azure IoT Edge 运行时中使用,而您使用的方法 (ModuleClient.CreateFromConnectionString) 是运行时将用于建立连接的方法,使用设备上可用的环境变量。

使用服务 SDK,您可以将一个直接方法发送到您的模块 A,没有什么可以阻止您将该方法的有效负载转发到模块 B。您已经正确设置了路由。