没有设法调用Azure IoT Edge模块直接方法

时间:2018-08-23 12:32:27

标签: azure-iot-edge

我正在运行IoT边缘模块并已注册方法回调。

SetMethodHandlerAsync和SetMethodDefaultHandlerAsync

但从未有人称呼过...

从Azure门户发起直接消息调用

  

无法调用设备方法:{“ message”:“设备{\” Message \“:\” {\\“ errorCode \\”:404103,\\“ trackingId \\”:\\“ 126e3eef616c409385e73128aef94b21-G :17-TimeStamp:08/23/2018 12:29:35 \\“,\\”消息\\“:\\”等待设备连接超时。\\“,\\” info \\“: {\\“ timeout \\”:\\“ 00:00:10 \\”},\\“ timestampUtc \\”:\\“ 2018-08-23T12:29:35.2214374Z \\”} \“, \“ ExceptionMessage \”:\“ \”}未注册“}

来自VsCode

  

无法调用直接方法:找不到

我是否想设置任何必需的配置?
是否有命名约定或要指定的路径?

1 个答案:

答案 0 :(得分:1)

从VS代码看来,是调用设备而不是模块的方法,因为它不需要输入模块ID。

在Azure门户中,它对我有用。

enter image description here

注册方法并实现方法回调:

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

        // Open a connection to the Edge runtime
        ModuleClient ioTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(settings);
        await ioTHubModuleClient.OpenAsync();
        Console.WriteLine("IoT Hub module client initialized.");

        await ioTHubModuleClient.SetMethodHandlerAsync("Write", WriteConsole, null);
        Console.WriteLine("IoT Hub module Set Method Handler:WriteConsole.");

        // Register callback to be called when a message is received by the module
        await ioTHubModuleClient.SetInputMessageHandlerAsync("input1", PipeMessage, ioTHubModuleClient);
    }

    private static Task<MethodResponse> WriteConsole(MethodRequest methodRequest, object userContext)
    {
        return Task.Run( () => {
        Console.WriteLine($"Write direct method called!");
        return new MethodResponse(200);
                    });
    }

通过使用以下命令停止模块时,出现“等待设备连接超时”错误:

Stop-Service iotedge -NoWait

门户网站错误:

enter image description here

但是在您的错误消息中,有“未注册”信息。看来您的模块未连接到边缘设备或从未成功运行。

因此,您需要做的第一件事是检查模块日志并查看是否存在任何错误。使用以下命令(替换您的模块名称而不是“ TestDirectMethodModule”):

docker logs TestDirectMethodModule -f

使用以下命令检查所有模块的运行状态:

iotedge list

如果所有模块都成功运行,您将看到以下结果:

enter image description here