Skocz do zawartości

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


Gieneq

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

@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ą.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.