微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将C2D消息发送到Azure IoT Edge

如何解决将C2D消息发送到Azure IoT Edge

我知道Azure IoT Edge不支持C2D,并且可以选择使用直接方法

我可以使用Module Client代码并将消息发送到Module吗?

我有一个具有output1的ModuleA,而ModuleB具有一个Handler输入1。 我的路线如下

"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吗?

解决方法

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

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

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

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

,

您需要调用InvokeMethodAsync之类的函数,该函数可以调用从moduleA到moduelB的直接方法。在显示的示例中,您似乎正在调用sendEventAsync,但这可能不起作用。示例在C#.

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

除了使用直接方法外,还可以使用两个 模块彼此直接通信,绕过Edge 枢纽。运行时通过Docker的网络功能来管理 每个模块(容器)的DNS条目。这允许一个模块 通过其名称来解析另一个模块的IP地址。

有关实际操作的示例,您可以按照SQL教程进行操作 这里: https://docs.microsoft.com/en-us/azure/iot-edge/tutorial-store-data-sql-server。 本教程使用一个模块从Edge Hub读取数据并进行写入 使用SQLServer客户端将其放入托管SQLServer的另一个模块中 SDK。与SQLServer的这种交互不将Edge Hub用于 交流

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。