如何从.net核心应用程序内触发IotEdge模块上的计算? [英] How can computation on an IotEdge module be triggered from within a .net core app?

查看:95
本文介绍了如何从.net核心应用程序内触发IotEdge模块上的计算?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要从管理后端应用程序在IotEdge模块上触发一些计算.

I need to trigger some computation on an IotEdge module from an Administration-Backend Application.

https://docs.microsoft.com/en-us/azure/iot-edge/module-development 它表示

当前,模块无法接收云到设备的消息

Currently, a module cannot receive cloud-to-device messages

因此,调用直接方法似乎是可行的方法.如何实现直接方法并从.NET Core应用程序中触发它?

So it seems that calling direct methods seems to be the way to go. How can I implement a direct method and trigger it from within a .NET Core App?

推荐答案

在IotEdge模块的Main或Init方法中,您必须创建一个ModuleClient并将其连接到MethodHandler:

In Main or Init Method of your IotEdge module you have to create a ModuleClient and connect it to a MethodHandler:

AmqpTransportSettings amqpSetting = new AmqpTransportSettings(TransportType.Amqp_Tcp_Only);
ITransportSettings[] settings = { amqpSetting };

ModuleClient ioTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(settings);
await ioTHubModuleClient.OpenAsync();

await ioTHubModuleClient.SetMethodHandlerAsync("MyDirectMethodName", MyDirectMethodHandler, null);

然后,您必须将DirectMethodHandler添加到IotEge模块:

Then you have to add the DirectMethodHandler to your IotEge module:

static async Task<MethodResponse> MyDirectMethodHandler(MethodRequest methodRequest, object userContext)
{
    Console.WriteLine($"My direct method has been called!");
    var payload = methodRequest.DataAsJson;
    Console.WriteLine($"Payload: {payload}");

    try
    {
        // perform your computation using the payload
    }
    catch (Exception e)
    {
         Console.WriteLine($"Computation failed! Error: {e.Message}");
         return new MethodResponse(Encoding.UTF8.GetBytes("{\"errormessage\": \"" + e.Message + "\"}"), 500);
    }

    Console.WriteLine($"Computation successfull.");
    return new MethodResponse(Encoding.UTF8.GetBytes("{\"status\": \"ok\"}"), 200);
}

然后,您可以在.Net核心应用程序中触发直接方法,如下所示:

From within your .Net core Application you can then trigger the direct method like this:

var iotHubConnectionString = "MyIotHubConnectionString";
var deviceId = "MyDeviceId";
var moduleId = "MyModuleId";
var methodName = "MyDirectMethodName";
var payload = "MyJsonPayloadString";

var cloudToDeviceMethod = new CloudToDeviceMethod(methodName, TimeSpan.FromSeconds(10));
cloudToDeviceMethod.SetPayloadJson(payload);

ServiceClient serviceClient = ServiceClient.CreateFromConnectionString(iotHubConnectionString);

try
{
    var methodResult = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, cloudToDeviceMethod);

    if(methodResult.Status == 200)
    {
        // Handle Success
    }
    else if (methodResult.Status == 500)
    {
        // Handle Failure
    }
 }
 catch (Exception e)
 {
     // Device does not exist or is offline
     Console.WriteLine(e.Message);
 }

这篇关于如何从.net核心应用程序内触发IotEdge模块上的计算?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆