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

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

SetMethodHandlerAsync и SetMethodDefaultHandlerAsync

но ни то, ни другое не называется ...

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

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

Из VsCode

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

Могу ли я пропустить установку какой-либо необходимой конфигурации?
Нужно ли указать соглашение об именах или путь?


person Frank Pfattheicher    schedule 23.08.2018    source источник


Ответы (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

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

введите здесь описание изображения

person Rita Han    schedule 24.08.2018
comment
Да, случайно на портале прямой метод вызвал с уровня устройства - не получилось .... - person Frank Pfattheicher; 24.08.2018
comment
@FrankPfattheicher Рад слышать, что вы нашли проблему. Итак, вы успешно вызываете прямой метод с уровня модуля? - person Rita Han; 24.08.2018
comment
Спасибо за решение. В нашем случае я думаю, что переход с MqttTransportSettings на AmqpTransportSettings решил проблему. - person peyman gilmour; 07.05.2021
comment
Вызов прямого метода с уровня устройства не работает, кроме уровня модуля. - person peyman gilmour; 07.05.2021