Не удалось вызвать прямой метод модуля Azure IoT Edge

Я использую пограничный модуль IoT и зарегистрировал обратные вызовы методов.

SetMethodHandlerAsync и SetMethodDefaultHandlerAsync

но ни один никогда не называется...

Инициирование прямых звонков с портала Azure

Не удалось вызвать метод устройства: {"message":"Device {\"Message\":\"{\\"errorCode\\":404103,\\"trackingId\\":\\"126e3eef616c409385e73128aef94b21-G:17-TimeStamp: 23.08.2008 12:29:35 \\",\\" message \\ ": \\" Истекло время ожидания подключения устройства. \\",\\" info\\":{\\"Тайм-аут \\" \\ "\\ 00:00:10"},\\"timestampUtc\\" \\"2018-08-23T12:29:35.2214374Z\\"}\"\"ExceptionMessage\":\"\"} не зарегистрирован"}

От VsCode

Не удалось вызвать прямой метод: не найдено

Я скучаю, чтобы установить любую необходимую конфигурацию?
Существует ли соглашение об именах или путь, который нужно указать?

1 ответ

Решение

Похоже, что из кода VS вызывать метод для устройства вместо модуля, потому что он не требует ввода идентификатора модуля.

С портала Azure, это работает для меня.

Зарегистрируйте метод и осуществите обратный вызов метода:

    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

Ошибка с портала:

Но в вашем сообщении об ошибке есть "незарегистрированная" информация. Кажется, ваш модуль не подключен к пограничному устройству или не работает успешно.

Поэтому первое, что вам нужно сделать, это проверить журнал модуля и посмотреть, есть ли какая-либо ошибка. Используя следующую команду (замените имя вашего модуля вместо "TestDirectMethodModule"):

docker logs TestDirectMethodModule -f

Проверьте все запущенные модули, используя следующую команду:

iotedge list

Если все модули работают успешно, вы увидите следующий результат:

Другие вопросы по тегам