Как можно запустить вычисления в модуле IotEdge из основного приложения .NET?

Мне нужно запустить некоторые вычисления в модуле IotEdge из серверного приложения администрирования.

На https://docs.microsoft.com/en-us/azure/iot-edge/module-development говорится

В настоящее время модуль не может получать сообщения из облака на устройство.

Таким образом, кажется, что вызов прямых методов - лучший способ. Как я могу реализовать прямой метод и запустить его из приложения .NET Core?


person René    schedule 11.01.2019    source источник


Ответы (1)


В Main или Init Method вашего модуля IotEdge вы должны создать ModuleClient и подключить его к 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:

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 вы можете запустить прямой метод следующим образом:

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);
 }
person René    schedule 11.01.2019