Skocz do zawartości

Azure IoT Hub - TLS read error :-0x004C ESP-IDF


Pomocna odpowiedź

Napisano

A zapytam, siedzę nad tym już za długo.

W Azurze jest DPS i IoT HUB. DPS służy do rejestracji urządzeń. IoT HUB do komunikacji. Oba mają opcję SDK, którego nie chcę używać bo to jakiś bałagan.

Można komunikować się po MQTT 3.1.1 i TLS/SSL lub Websocket. Z DPSem nie mam żadnych problemów. Ale z IoT HUBem cały czas.

Wyjdę od tego że mam referencyjny kod w Pythonie na Desktopa który działa zawsze.

def setup_mqtt_client(device_id, hub_name, sas_token):
    """Setup and return an MQTT client."""
    client = mqtt.Client(client_id=device_id, protocol=mqtt.MQTTv311)
    print("mqtt_client_id:", device_id)
    client.username_pw_set(username=f"{hub_name}/{device_id}/?api-version=2018-06-30",
                           password=sas_token)
    print("mqtt_username:", f"{hub_name}/{device_id}/?api-version=2018-06-30")
    print("mqtt_password:", sas_token)
    client.tls_set(cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2)
    client.tls_insecure_set(False)

    def on_connect(client, userdata, flags, rc):
        print(f"Connected with result code {rc}")

    def on_publish(client, userdata, mid):
        print(f"Message Published: {mid}")

    client.on_connect = on_connect
    client.on_publish = on_publish

    return client

mqtt_client.connect(iothub_hostname, MQTT_BROKER_PORT, 60)
mqtt_client.loop_start()
mqtt_client.publish(f"devices/{DEVICE_ID}/messages/events/", "HACK HACK HACK")
  
  

W minimalnym przykładzie C ESP-IDF biorę dane logowania: device_id, username i hasło i podkładam do przykłądu MQTT/SSL. Kod działał przez jakiś czas. Po przerwie kilku tygodni już nie działał. Kilak restartów i zaczął. Restart i już nigdy nie zaczął z powrotem.

    const esp_mqtt_client_config_t mqtt_cfg = {
        .broker = {
            .address.uri = CONFIG_BROKER_URI,
            .verification.certificate = (const char *)broker_pem_start,
        },
        .session = {
            .keepalive = 240,
            .protocol_ver = MQTT_PROTOCOL_V_3_1_1
        },
        .credentials = {
            .client_id = "theendisreal_1",
            .username = "XXXXXXXXXXX.azure-devices.net/theendisreal_1/?api-version=2018-06-30",
            .authentication.password = "SharedAccessSignature sr=XXXXXXXXXXX.azure-devices.net%2Fdevices%2Ftheendisreal_1&sig=ZZZZZZZZZZZZZZZZ&se=1709043213"
        }
    };

Tu jest log:

I (6413) MQTTS_EXAMPLE: Other event id:7
I (7293) MQTTS_EXAMPLE: MQTT_EVENT_CONNECTED
I (7293) MQTTS_EXAMPLE: sent subscribe successful, msg_id=45317
I (7293) MQTTS_EXAMPLE: sent subscribe successful, msg_id=37869
I (7293) MQTTS_EXAMPLE: sent unsubscribe successful, msg_id=20820
I (7323) MQTTS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=45317
I (7323) MQTTS_EXAMPLE: sent publish successful, msg_id=0
I (7363) MQTTS_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=37869
I (7363) MQTTS_EXAMPLE: sent publish successful, msg_id=0
I (7363) MQTTS_EXAMPLE: MQTT_EVENT_UNSUBSCRIBED, msg_id=20820
E (12513) esp-tls-mbedtls: read error :-0x004C:
E (12513) transport_base: esp_tls_conn_read error, errno=Socket is not connected
E (12513) mqtt_client: esp_mqtt_handle_transport_read_error: transport_read() error: errno=128
I (12523) MQTTS_EXAMPLE: MQTT_EVENT_ERROR
I (12523) MQTTS_EXAMPLE: Last error code reported from esp-tls: 0x0
I (12533) MQTTS_EXAMPLE: Last tls stack error number: 0x4c
I (12543) MQTTS_EXAMPLE: Last captured errno : 0 (Success)
E (12543) mqtt_client: mqtt_process_receive: mqtt_message_receive() returned -1
I (12553) MQTTS_EXAMPLE: MQTT_EVENT_DISCONNECTED

Hasło jest generowane z SAS tokenu, ten ma ograniczenie czasowe. Sprawdzałem i błąd jest inny gdy poda się przedawnione hasło. Podanie błędnego certyfikatu to też inny błąd.

/* This will show if password (sas token) is autdated */
I (6413) MQTTS_EXAMPLE: Other event id:7
W (7383) mqtt_client: Connection refused, not authorized
I (7383) MQTTS_EXAMPLE: MQTT_EVENT_ERROR
I (7383) MQTTS_EXAMPLE: Connection refused error: 0x5
E (7383) mqtt_client: MQTT connect failed
I (7393) MQTTS_EXAMPLE: MQTT_EVENT_DISCONNECTED

/* This will show if pem file is not for this hostname*/
I (6413) MQTTS_EXAMPLE: Other event id:7
E (6603) esp-tls-mbedtls: mbedtls_ssl_handshake returned -0x2700
I (6603) esp-tls-mbedtls: Failed to verify peer certificate!
E (6613) esp-tls: Failed to open new connection
E (6613) transport_base: Failed to open a new connection
E (6623) mqtt_client: Error transport connect
I (6623) MQTTS_EXAMPLE: MQTT_EVENT_ERROR

Mamy wykupionego IoT HUBa, jakiś niski tier. Ma ktoś pomysł na to?

  • Lubię! 1

@Harnas certifikat mam z takiego polecenia:

echo "" | openssl s_client -showcerts -connect XXXX.azure-devices.net:8883 | sed -n "1,/Root/d; /BEGIN/,/END/p" | openssl x509 -outform PEM >hub.pem

Próbowałem po SSL/TLS i Websocket Secure i podobne zachowanie.

Ale udało się na nowo połączyć. Pomyślałem że może być jakiś timeout i w ustawieniach clienta MQTT zmieniałem wartości:

    mqtt_cfg.network.timeout_ms = 10000;
    mqtt_cfg.network.reconnect_timeout_ms = 10000;
    mqtt_cfg.network.disable_auto_reconnect = false;
    // mqtt_cfg.network.refresh_connection_after_ms = 25000;

i zauważyłem, że problem nie pojawia się, jak mam refresh w sensowym czasie. Stąd teoria: urządzenie powinno podłączyć się, wysłać i rozłączyć.

Ciekawe że po tym jak udało się podłączyć, wróciłem do poprzedniego kodu który nie działał i znowu się naprawił. Czyli problem jest gdzieś przy serwerze. Może faktycznie serwer odrzuca urządzenia które za długo lub zbyt często coś robią.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...