向Azure IoT Edge发送C2D消息



我知道Azure IoT Edge不支持C2D,可以选择使用Direct Method。

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

我有一个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吗?

如果你想在控制台应用程序中从你的笔记本电脑/个人电脑向你的物联网边缘设备发送任何东西,你需要使用直接的方法,就像你在问题中提到的那样。为此,您可以使用Service SDK并使用以下方法:

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

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

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

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

此外,请浏览此链接,它还建议了另一种模块间通信的方法。

除了使用直接方法外模块之间直接通信,绕过边缘中心运行时通过Docker的网络功能管理每个模块(容器(的DNS条目。这允许一个模块通过名称解析另一个模块的IP地址。

有关此操作的示例,您可以遵循SQL教程此处:https://learn.microsoft.com/en-us/azure/iot-edge/tutorial-store-data-sql-server.本教程使用一个模块从Edge Hub读取数据并写入使用SQLServer客户端将其放入另一个托管SQLServer的模块中SDK。此与SQLServer的交互不使用边缘集线器通信

最新更新