Aws-iot-device-sdk-python-v2: AWS IOT MQTT mit Persistent Session = True, aber das Abonnement ist fehlgeschlagen

Erstellt am 31. Mai 2020  ·  4Kommentare  ·  Quelle: aws/aws-iot-device-sdk-python-v2

Verehrte Gäste,

Beim Experimentieren mit AWS IOT MQTT mit Persistent Session stellte ich fest, dass Broker 'session_present = True' als Antwort auf die Verbindungsanfrage mit 'clean_session = False' zurückgibt.
Was erwartet wird, da ich innerhalb von 60 Minuten die Verbindung wie in der AWS-Dokumentation angegeben wiederhergestellt habe (praktisch waren es weniger als 5 Minuten).

Ausgabe :
Gemäß der Theorie speichert der Broker bei 'session_present = True' die Informationen der vorherigen Sitzung, sodass Themen nicht erneut abonniert werden müssen.
Aber wenn ich den Schritt des Abonnierens des Themas überspringe, werden keine Nachrichten empfangen.
Ist es das offensichtliche Verhalten? muss ich mich abmelden, obwohl 'session_present = True' ist?

Ich verwende aws-iot-device-sdk-python-v2

def conenct_mqtt(mqtt_connection):
    connect_future = mqtt_connection.connect()

    excep_count = 0
    while True:
        print(f"[{datetime.now()}]Connecting......")
        try:
            # Future.result() waits until a result is available
            result = connect_future.result(timeout=30)
            print(f"Connected! session persistent = {result['session_present']}")
            return result['session_present']

        except Exception as exc:
            print(f"[{datetime.now()}]Error while connecting {exc}")
            time.sleep(10)
            excep_count=excep_count+1
            if excep_count > 5 :
                print(f"[{datetime.now()}]Exiting Script.....")
                quit()
bug guidance needs-triage

Hilfreichster Kommentar

Hallo @GauravPatni

Bitte versuche:

   if not is_session_persistent:
        XXX
   else:
        mqtt_connection.on_message(on_message_received) #register your callback
        print("-----------Session is Persistent---------")

Ihre Verbindung ist verbunden, aber Sie müssen Ihren Rückruf noch am _Connection_-Objekt registrieren, um die Nachricht über on_message zu empfangen .

Alle 4 Kommentare

Hallo,
Vielen Dank, dass Sie sich gemeldet haben. Ich habe es getestet und die Persistent Session funktioniert für mich.
Im pubsub.py-Beispiel empfängt mqtt_conneciton weiterhin Nachrichten, wenn die Verbindung unterbrochen wird und wiederkehrt. Sie müssen jedoch Ihren Rückruf beim _Connection_-Objekt registrieren, um die Nachricht zu empfangen.
Wenn Sie beispielsweise ein weiteres _Connection_-Objekt mit dem Verbindungsergebnis 'session_present = True' erstellen, müssen Sie on_message aufrufen , um den Rückruf zu setzen. Anschließend können Sie die eingehende Nachricht über den von Ihnen eingestellten Rückruf empfangen.
Danke!

Hallo @TingDaoK
Danke für Ihre Hilfe. Aber leider kann ich das Problem immer noch nicht lösen.
Könnten Sie bitte in den folgenden Code schauen, um herauszufinden, was das Problem ist?

meine Schritte:
Abonnieren-Skript ausführen
Veröffentlichungsskript ausführen
// Nachrichten, die über das Abonnieren-Skript empfangen wurden
Beende jetzt beide Skripte
warte eine Minute oder länger
Abonnieren-Skript ausführen
// Verbindung zukünftiges Ergebnis liefert .... result['session_present'] = True. Daher wird die Abo-Schleife übersprungen
Veröffentlichungsskript ausführen
// Problem: Keine Nachrichten beim Abonnieren-Skript erhalten

def conenct_mqtt(mqtt_connection):
    connect_future = mqtt_connection.connect()

    excep_count = 0
    while True:
        print(f"[{datetime.now()}]Connecting......")
        try:
            # Future.result() waits until a result is available
            result = connect_future.result(timeout=30)
            print(f"[{datetime.now()}]Connected! session persistent = {result['session_present']}")
            return result['session_present']

        except Exception as exc:
            print(f"[{datetime.now()}]Error while connecting {exc}")
            time.sleep(10)
            excep_count=excep_count+1
            if excep_count > 5 :
                print(f"[{datetime.now()}]Exiting Script.....")
                quit()

if __name__ == '__main__':
    # Spin up resources
    event_loop_group = io.EventLoopGroup(1)
    host_resolver = io.DefaultHostResolver(event_loop_group)
    client_bootstrap = io.ClientBootstrap(event_loop_group, host_resolver)


    mqtt_connection = mqtt_connection_builder.mtls_from_path(
        endpoint=host,
        cert_filepath=certificatePath,
        pri_key_filepath=privateKeyPath,
        client_bootstrap=client_bootstrap,
        ca_filepath=rootCAPath,
        on_connection_interrupted=on_connection_interrupted,
        on_connection_resumed=on_connection_resumed,
        client_id=clientId,
        clean_session=False, # set as persistent sessions
        keep_alive_secs=60, # 1 min as any data communication or PINGREQ . x1.5 to detect disconenct
        reconnect_min_timeout_secs=2,
        reconnect_max_timeout_secs =300,
        ping_timeout_ms = 10000, # wait for 6 secs for ping response
        )

    print(f"[{datetime.now()}]Connecting with client ID '{clientId}'...")
    is_session_persistent = conenct_mqtt(mqtt_connection)

    # subscribe to topics only if previous session was lost 
    if not is_session_persistent:
        topic_index = 0
        excep_count = 0
        while topic_index < 2:
            # Subscribe
            topic = topic_list[topic_index]
            print(f"[{datetime.now()}]Subscribing to topic '{topic}'...")
            subscribe_future, packet_id = mqtt_connection.subscribe(
                topic=topic,
                qos=mqtt.QoS.AT_LEAST_ONCE,
                callback=on_message_received)


            try:
                subscribe_result = subscribe_future.result()
                print(f"[{datetime.now()}]Subscribed with {str(subscribe_result['qos'])}")
                topic_index+=1
                excep_count = 0
            except Exception as exc:
                print(f"Error:Subscribe: {exc}")
                excep_count+=1
                if excep_count > 3 :
                    print(f"[{datetime.now()}]Exiting Script.....")
                    quit()
                time.sleep(10)
    else:
        print("-----------Session is Persistent---------")




    # Wait for all messages to be received.
    # This waits forever if count was set to 0.
    if max_count != 0 and not received_all_event.is_set():
        print("Waiting for all messages to be received...")

    received_all_event.wait()
    print("{} message(s) received.".format(received_count))

Hallo @GauravPatni

Bitte versuche:

   if not is_session_persistent:
        XXX
   else:
        mqtt_connection.on_message(on_message_received) #register your callback
        print("-----------Session is Persistent---------")

Ihre Verbindung ist verbunden, aber Sie müssen Ihren Rückruf noch am _Connection_-Objekt registrieren, um die Nachricht über on_message zu empfangen .

Vielen Dank

Hallo @GauravPatni

Bitte versuche:

   if not is_session_persistent:
        XXX
   else:
        mqtt_connection.on_message(on_message_received) #register your callback
        print("-----------Session is Persistent---------")

Ihre Verbindung ist verbunden, aber Sie müssen Ihren Rückruf noch am _Connection_-Objekt registrieren, um die Nachricht über on_message zu empfangen .

Danke @TingDaoK

nach dem Hinzufügen
mqtt_connection.on_message(on_message_received) #registrieren Sie Ihren Rückruf
Problem gelöst !!

Nochmals danke für die schnelle Antwort !!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

banuprathap picture banuprathap  ·  10Kommentare

satay99 picture satay99  ·  6Kommentare

victorct-pronto picture victorct-pronto  ·  3Kommentare

mkozjak picture mkozjak  ·  8Kommentare

Sanrro10 picture Sanrro10  ·  16Kommentare