Как правильно зарегистрироваться для прямых методов в jot-модуле iot edge? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть модуль iot edge в Java, разработанный с использованием кода VS.До сих пор все работало (имеется в виду: я могу отправлять сообщения в концентратор iot без проблем).Теперь я хочу добавить опцию для получения сообщений от iot-хаба.Поскольку это не реализовано напрямую, я подписываюсь на прямые вызовы методов.Это, похоже, не работает правильно в моем случае.Но, как только я удаляю подписку на метод, все работает нормально.Таким образом, акт подписки, похоже, что-то нарушает.

Когда я добавляю код для подписки на прямые вызовы методов, модуль все еще может отправлять сообщения в концентратор iot, но соединение теряется и все заново устанавливается.время с 5-секундными интервалами.Через некоторое время (около 5 минут) я вижу сообщение от iotHubEventCallback (ERROR):

230162 [MQTT Rec: myEdgeDevice / JavaModule] WARN HbIIoTGateway - Состояние подключения: повторная попытка

230995 [MQTT Rec: myEdgeDevice / JavaModule] WARN HbIIoTGateway - Состояние соединения: подключено

240196 [MQTT Rec: myEdgeDevice / JavaModule] WARN HbIIoTGateway - Состояние соединения: повторная попытка

240Q MICE: [/ JavaModule] WARN HbIIoTGateway - Состояние соединения: подключено

250228 [MQTT Rec: myEdgeDevice / JavaModule] WARN HbIIoTGateway - Состояние соединения: повторная попытка

250229 [azure-iot-sdk-IotboB].- Прямой метод # IoT Hub ответил на подтверждение метода устройства со статусом: ОШИБКА

251005 [MQTT Rec: myEdgeDevice / JavaModule] WARN HbIIoTGateway - Состояние соединения: Подключено

После этогосвязь остается стабильной.Но я не могу вызывать вызовы методов (например, с портала Azure), они получают тайм-аут:

Не удалось вызвать метод устройства: {"message": "GatewayTimeout: {\ r \ n \"Сообщение \ ": \" {\\ "errorCode \\": 504101, \\ "trackingId \\": \\ "3558e6feadd54b5c9f248bdbf20bd5e0-G: 19-TimeStamp: 26.04.2009 05: 20: 00 \\",\\ "message \\": \\ "Превышено время ожидания ответа от устройства. \\", \\ "info \\": {\\ "timeout \\": \\ "00: 00: 10 \\ "}, \\" timestampUtc \\ ": \\" 2019-04-26T05: 20: 00.6977425Z \\ "} \", \ r \ n \ "ExceptionMessage \": \ "\" \ r \ n} "}

Состояние службы iotedge кажется беспроблемным:

26 апреля, 05:21:09 peers_docker_dev iotedged [52836]: 2019-04-26T05: 21: 09Z [ИНФО] - Проверка состояния времени выполнения фронта

26 апр. 05:21:09 peers_docker_dev iotedged [52836]: 2019-04-26T05: 21: 09Z [ИНФО] - Время выполнения грани работает.

26 апреля 05:21:10 peers_docker_dev отмечен [52836]: 2019-04-26T05: 21: 10Z [INFO] - [mgmt] - - - [2019-04-26 05: 21: 10.206275755 UTC] "GET/ modules? api-версия = 2018-06-28 HTTP / 1.1 "200 OK 1483" - "" - "pid (52

Это код вопроса:

            m_client = new ModuleClient(sConnString, IotHubClientProtocol.MQTT);

            // Set the callback for messages 
            m_client.setMessageCallback(INPUT_NAME, new MessageCallback()
            {
                public IotHubMessageResult execute(Message msg, Object context)
                {
                    App.m_logger.info("Received message from hub: " + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET));

                    return IotHubMessageResult.COMPLETE;
                }
            }, m_client);

            // Register the callback for connection state change
            m_client.registerConnectionStatusChangeCallback(new IotHubConnectionStatusChangeCallback ()
            {
                public void execute(IotHubConnectionStatus status, IotHubConnectionStatusChangeReason statusChangeReason, Throwable throwable, Object callbackContext) 
                {
                    String statusStr = "Connection Status: %s";
                    switch (status) 
                    {
                    case CONNECTED:
                        App.m_logger.warn(String.format(statusStr, "Connected"));
                        break;
                    case DISCONNECTED:
                        App.m_logger.error(String.format(statusStr, "Disconnected"));
                        if (throwable != null) 
                        {
                            throwable.printStackTrace();
                        }
                        break;
                    case DISCONNECTED_RETRYING:
                        App.m_logger.warn(String.format(statusStr, "Retrying"));
                        break;
                    default:
                        break;
                    }
                }
            }, null);
            // Open client
            m_client.open();

            // Register to receive direct method calls.
            m_client.subscribeToMethod(new DeviceMethodCallback() {
                @Override
                public DeviceMethodData call(String methodName, Object methodData, Object context) {
                    App.m_logger.info("Method called:" + methodName);
                    return new DeviceMethodData(METHOD_SUCCESS, "Executed direct method " + methodName);
                }
                }, null, new IotHubEventCallback()
                {
                    public void execute(IotHubStatusCode status, Object context) 
                    {
                        App.m_logger.info("Direct method # IoT Hub responded to device method acknowledgement with status: " + status.name());
                    }
                }, null);


Фактический вывод показан выше.Я хотел бы иметь стабильное соединение и получать вызовы методов.Есть идеи, что я могу делать не так?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 30 апреля 2019

Просто чтобы закрыть эту проблему: я мог бы заставить ее работать, просто добавив новое устройство и внутри нового модуля на портале Azure.С этими строками подключения это работает.

Я не знаю, что я мог сделать неправильно с первым устройством / модулем.Если у вас есть идеи, пожалуйста, дайте мне знать.

Спасибо и наилучшими пожеланиями,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...