如何解决如何从另一个模块在物联网边缘代理上调用直接方法?
我正在试用1.0.10-rc2中的实验功能。
edgeAgent UploadModuleLogs上有直接方法。
我可以从Azure门户调用该方法,并且效果很好。 我正在尝试从同一设备上的模块中调用该方法,如下所示:
static async Task Init()
{
...
await ioTHubModuleClient.SetMethodHandlerAsync("UploadModuleLogs",UploadModuleLogs,ioTHubModuleClient);
}
private static async Task<MethodResponse> UploadModuleLogs(MethodRequest methodRequest,object userContext)
{
ModuleClient ioTHubModuleClient = (ModuleClient)userContext;
// Upload logs
Console.WriteLine("Invoking method On edgeAgent");
var payload = @"{
""schemaVersion"": ""1.0"",""sasUrl"": ""https://..."",""items"": [
{
""id"": "".*"",""filter"": {
""tail"": 100
}
}
],""encoding"": ""none"",""contentType"": ""text""
} ";
MethodRequest request = new MethodRequest("UploadModuleLogs",Encoding.UTF8.GetBytes(payload));
string myModuleId = Environment.GetEnvironmentvariable("IOTEDGE_MODULEID");
string mydeviceid = Environment.GetEnvironmentvariable("IOTEDGE_deviceid");
Console.WriteLine($"{mydeviceid} {myModuleId} - UploadModuleLogs method request at {DateTime.Now}");
//Console.WriteLine($"{request.DataAsJson}");
try
{
var response = await ioTHubModuleClient.InvokeMethodAsync(mydeviceid,"$edgeAgent",request).ConfigureAwait(false);
Console.WriteLine($"Received response with status: {response.Status} with message: {response.ResultAsJson}");
return response;
}
catch (Exception ex)
{
Console.WriteLine($"Error invoking method {ex}");
}
return null;
尝试运行此命令
错误调用方法Microsoft.Azure.Devices.Client.Exceptions.DeviceNotFoundException:设备{“ message”:“找不到客户端myDeviceName / $ edgeAgent”}未注册
在Microsoft.Azure.Devices.Client.Transport.HttpClientHelper.ExecuteAsync(HttpMethod httpMethod,Uri requestUri,Func 3 modifyRequestMessageAsync,Func
2成功,Func 3 processResponseMessageAsync,IDictionary
2 errorMappingOverrides,CancellationToken cancelledToken)处
在Microsoft.Azure.Devices.Client.Transport.HttpClientHelper.PostAsync [T1,T2](Uri requestUri,T1实体,IDictionary 2 errorMappingOverrides,IDictionary
2 customHeaders,CancellationToken cancelletoken)
在Microsoft.Azure.Devices.Client.ModuleClient.InvokeMethodAsync(Uri uri,MethodRequest methodRequest,CancellationToken cancelletoken)
解决方法
这是预期的行为,其他模块无法调用边缘代理的直接方法。边缘代理在设计上不会连接到edgeHub,因为该代理的直接方法具有特权,并且需要服务凭据才能访问。
, 对于模块到模块的通信,您应该创建消息并从一条路由到另一条https://docs.microsoft.com/en-us/azure/iot-edge/module-composition#declare-routes。
不支持方法:-(
设置路由可让您在连接到相同edgeHub的另一个模块上调用方法:
FROM /messages/modules/{moduleName}/* INTO BrokeredEndpoint("/modules/SimulatedTemperatureSensor/inputs/control")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。