Задержка запуска модуля до полной инициализации edgeHub

Я пытаюсь реализовать модуль Python (скажем, my-module) на модели arm32v7 Raspberry Pi-3. Модуль основан на Resin/rpi-raspbian:stretch (azure-iothub-device-client==1.4.0b0). У меня есть библиотека Python iothub_client, которая отлично работает внутри модуля. Однако, когда я пытаюсь развернуть и выполнить iotedgectl start в Pi, я получаю следующую ошибку в docker logs -f <my-module>:

Python 2.7.13 (default, Nov 24 2017, 17:33:09) 
[GCC 6.3.0 20170516]

IoT Hub Client for Python
Adding TrustedCerts from: /mnt/edgemodule/edge-device-ca.cert.pem
set_option TrustedCerts successful

Converted audio file  2643035.wav in 5.67014288902 seconds
Payload: {"translatedutctime": "2018-06-23T14:56:59.972036", "filename": "2643035.wav"}
Sending Payload for 2643035.wav ...
Error: Time:Sat Jun 23 14:56:59 2018 File:/usr/sdk/src/c/c-utility/adapters/socketio_berkeley.c Func:socketio_open Line:701 Failure: connect failure 111.
Error: Time:Sat Jun 23 14:56:59 2018 File:/usr/sdk/src/c/c-utility/src/tlsio_openssl.c Func:on_underlying_io_open_complete Line:751 Invalid tlsio_state. Expected state is TLSIO_STATE_OPENING_UNDERLYING_IO.
Error: Time:Sat Jun 23 14:56:59 2018 File:/usr/sdk/src/c/c-utility/src/tlsio_openssl.c Func:tlsio_openssl_open Line:1251 Failed opening the underlying I/O.
Error: Time:Sat Jun 23 14:56:59 2018 File:/usr/sdk/src/c/umqtt/src/mqtt_client.c Func:mqtt_client_connect Line:980 Error: io_open failed
Error: Time:Sat Jun 23 14:56:59 2018 File:/usr/sdk/src/c/iothub_client/src/iothubtransport_mqtt_common.c Func:SendMqttConnectMsg Line:1932 failure connecting to address elderberrypi.
Error: Time:Sat Jun 23 14:57:00 2018 File:/usr/sdk/src/c/c-utility/adapters/socketio_berkeley.c Func:socketio_open Line:701 Failure: connect failure 111.
Error: Time:Sat Jun 23 14:57:00 2018 File:/usr/sdk/src/c/c-utility/src/tlsio_openssl.c Func:on_underlying_io_open_complete Line:751 Invalid tlsio_state. Expected state is TLSIO_STATE_OPENING_UNDERLYING_IO.
Error: Time:Sat Jun 23 14:57:00 2018 File:/usr/sdk/src/c/c-utility/src/tlsio_openssl.c Func:tlsio_openssl_open Line:1251 Failed opening the underlying I/O.
Error: Time:Sat Jun 23 14:57:00 2018 File:/usr/sdk/src/c/umqtt/src/mqtt_client.c Func:mqtt_client_connect Line:980 Error: io_open failed
Error: Time:Sat Jun 23 14:57:00 2018 File:/usr/sdk/src/c/iothub_client/src/iothubtransport_mqtt_common.c Func:SendMqttConnectMsg Line:1932 failure connecting to address elderberrypi.
Error: Time:Sat Jun 23 14:57:02 2018 File:/usr/sdk/src/c/c-utility/adapters/socketio_berkeley.c Func:socketio_open Line:701 Failure: connect failure 111.
Error: Time:Sat Jun 23 14:57:02 2018 File:/usr/sdk/src/c/c-utility/src/tlsio_openssl.c Func:on_underlying_io_open_complete Line:751 Invalid tlsio_state. Expected state is TLSIO_STATE_OPENING_UNDERLYING_IO.
Error: Time:Sat Jun 23 14:57:02 2018 File:/usr/sdk/src/c/c-utility/src/tlsio_openssl.c Func:tlsio_openssl_open Line:1251 Failed opening the underlying I/O.
Error: Time:Sat Jun 23 14:57:02 2018 File:/usr/sdk/src/c/umqtt/src/mqtt_client.c Func:mqtt_client_connect Line:980 Error: io_open failed
Error: Time:Sat Jun 23 14:57:02 2018 File:/usr/sdk/src/c/iothub_client/src/iothubtransport_mqtt_common.c Func:SendMqttConnectMsg Line:1932 failure connecting to address elderberrypi.

Converted audio file  4417734.wav in 4.16613197327 seconds    
Payload: {"translatedutctime": "2018-06-23T14:57:04.059473", "filename": "4417734.wav"}
Sending Payload for 4417734.wav ...    
Error: Time:Sat Jun 23 14:57:06 2018 File:/usr/sdk/src/c/c-utility/adapters/socketio_berkeley.c Func:socketio_open Line:701 Failure: connect failure 111.
Error: Time:Sat Jun 23 14:57:06 2018 File:/usr/sdk/src/c/c-utility/src/tlsio_openssl.c Func:on_underlying_io_open_complete Line:751 Invalid tlsio_state. Expected state is TLSIO_STATE_OPENING_UNDERLYING_IO.
Error: Time:Sat Jun 23 14:57:06 2018 File:/usr/sdk/src/c/c-utility/src/tlsio_openssl.c Func:tlsio_openssl_open Line:1251 Failed opening the underlying I/O.
Error: Time:Sat Jun 23 14:57:06 2018 File:/usr/sdk/src/c/umqtt/src/mqtt_client.c Func:mqtt_client_connect Line:980 Error: io_open failed
Error: Time:Sat Jun 23 14:57:06 2018 File:/usr/sdk/src/c/iothub_client/src/iothubtransport_mqtt_common.c Func:SendMqttConnectMsg Line:1932 failure connecting to address elderberrypi.

Converted audio file  4486452.wav in 4.94396114349 seconds
Payload: {"translatedutctime": "2018-06-23T15:32:28.491401", "filename": "4486452.wav"}
Sending Payload for 4486452.wav ...
Confirmation[0] received for message with result = MESSAGE_TIMEOUT
    Properties: {}
    Total calls confirmed: 1

Теперь это продолжается несколько сообщений и только после старта (никогда в промежутках, один раз стабилизируется). После нескольких таких тайм-аутов сообщений и ошибок сценарий возвращается к нормальному состоянию с подтверждением обратного вызова, и я также могу получать сообщения в IoTHub. В результате я всегда пропускаю первые 5-10 сообщений и не могу увидеть эти сообщения в IoTHub.

После долгих поисков неисправностей я понял, что проблема постоянная. Кажется, что модуль edgeHub всегда полностью инициализируется через несколько секунд после того, как my-module уже начал отправлять сообщения. Поскольку edgeHub не полностью инициализирован, а аутентификация TLS и пути MQTT не установлены, первые несколько сообщений my-module теряются. Может быть, это потому, что Raspberry Pi — медленное устройство?

Я попытался запустить my-module вручную, после полной инициализации edgeHub в этом случае все сообщения доставляются без проблем.

Вопрос. Можно ли дождаться полной инициализации edgeHub, а затем начать отправлять сообщения? Что еще более важно, это реальная проблема или что-то совсем другое является причиной проблемы?

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


person Anirban Das    schedule 23.06.2018    source источник


Ответы (1)


То, что вы указали, является точным описанием текущего поведения! В текущей реализации все модули запускаются одновременно. Некоторые из них инициализируются быстрее, чем edgeHub, что и вызвало поведение, которое вы видели. Это известная проблема, и мы внедряем исправление!

person Yi Zhong - MSFT    schedule 25.06.2018
comment
большое спасибо за разъяснение! Не могли бы вы сообщить мне, как я могу отслеживать исправление? - person Anirban Das; 25.06.2018
comment
Вы можете следить за нашим прогрессом в наших примечаниях к выпуску! github.com/Azure/iot-edge/releases - person Yi Zhong - MSFT; 26.06.2018
comment
Обновление приведенной выше ссылки: github.com/Azure/azure-iotedge/releases. - person Yi Zhong - MSFT; 09.07.2018