我知道C2D在Azure IoT边缘中不受支持,一个选项是使用IoT方法。
这是我可以使用模块客户端代码并向模块发送消息吗?
我有一个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吗?
发布于 2020-10-04 07:39:13
如果您想在控制台应用程序中向您的IoT边缘设备发送任何内容,您需要使用直接的方法,就像您在问题中提到的那样。为此,您可以使用Service并使用以下方法:
InvokeDeviceMethodAsync(string deviceId, string moduleId, CloudToDeviceMethod cloudToDeviceMethod);在示例中,建议使用ModuleClient向模块发送消息。这是行不通的,ModuleClient被设计为仅在Azure IoT边缘运行时中使用,并且您使用的方法(ModuleClient.CreateFromConnectionString)是运行时使用设备上可用的环境变量来设置连接的方法。
使用Service,您可以向模块A发送一个直接的方法,没有什么可以阻止您将该方法的有效负载转发到模块B。您已经正确地设置了路由。
发布于 2020-10-04 06:52:41
您需要调用像InvokeMethodAsync这样的函数,这是从moduleA到moduelB的直接方法。在您展示的示例中,您似乎正在调用sendEventAsync,这可能不起作用。示例在C#。中
此外,请通过这个链接,这也建议了另一种方法,模块到模块的通信。
除了使用直接方法之外,两个模块还可以直接通信,绕过边缘集线器。运行时通过Docker的网络功能管理每个模块(容器)的DNS条目。这允许一个模块按其名称解析另一个模块的IP地址。 有关此操作的示例,您可以在这里遵循SQL教程:https://learn.microsoft.com/en-us/azure/iot-edge/tutorial-store-data-sql-server。本教程使用一个模块从边缘集线器读取数据,并使用SQLServer客户端SDK将其写入承载SQLServer的另一个模块。此与SQLServer的交互不使用边缘集线器进行通信
https://stackoverflow.com/questions/64177409
复制相似问题