У меня есть модуль 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);
Фактический вывод показан выше.Я хотел бы иметь стабильное соединение и получать вызовы методов.Есть идеи, что я могу делать не так?
Спасибо за вашу помощь!