Aws-iot-device-sdk-python-v2: AWS IOT MQTT avec session persistante = True mais l'abonnement a échoué

Créé le 31 mai 2020  ·  4Commentaires  ·  Source: aws/aws-iot-device-sdk-python-v2

Chers tous,

En expérimentant avec AWS IOT MQTT avec session persistante, j'ai constaté que Broker renvoie « session_present = True » en réponse à une demande de connexion ayant « clean_session = False ».
Ce qui est attendu car je me suis reconnecté dans les 60 minutes comme spécifié par la documentation AWS (c'était pratiquement moins de 5 minutes)

Publier :
Selon la théorie, si 'session_present = True', le courtier stocke les informations de la session précédente, il n'est donc pas nécessaire de s'abonner à nouveau aux sujets.
Mais si je saute l'étape de l'abonnement au sujet, aucun message n'est reçu.
Est-ce le comportement évident ? dois-je me désinscrire même si 'session_present = True' ?

J'utilise 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

Commentaire le plus utile

Salut @GauravPatni

S'il vous plaît essayez:

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

Votre connexion est connectée, mais vous devez encore enregistrer votre rappel sur l'objet _Connection_ pour recevoir le message, via on_message .

Tous les 4 commentaires

Salut,
Merci d'avoir tendu la main. Je l'ai testé et la session persistante fonctionne pour moi.
Dans l'exemple pubsub.py, si la connexion est perdue et revient, le mqtt_conneciton continue de recevoir le message. Mais vous devez enregistrer votre rappel sur l'objet _Connection_ pour recevoir le message.
Par exemple, si vous créez un autre objet _Connection_, avec 'session_present = True' comme résultat de connexion, vous devrez appeler on_message pour définir le rappel. Ensuite, vous pouvez recevoir le message entrant via le rappel que vous avez défini.
Merci!

salut @TingDaoK
Merci de votre aide. Mais malheureusement, je n'arrive toujours pas à résoudre le problème.
pourriez-vous s'il vous plaît regarder dans le code suivant pour comprendre quel est le problème?

mes pas :
exécuter le script d'abonnement
exécuter le script de publication
// messages reçus sur le script d'abonnement
maintenant terminer les deux scripts
attendre une minute ou plus
exécuter le script d'abonnement
// le résultat futur de la connexion renvoie .... result['session_present'] = True. Par conséquent, la boucle d'abonnement est ignorée
exécuter le script de publication
// Problème : aucun message reçu sur le script d'abonnement

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))

Salut @GauravPatni

S'il vous plaît essayez:

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

Votre connexion est connectée, mais vous devez encore enregistrer votre rappel sur l'objet _Connection_ pour recevoir le message, via on_message .

Merci

Salut @GauravPatni

S'il vous plaît essayez:

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

Votre connexion est connectée, mais vous devez encore enregistrer votre rappel sur l'objet _Connection_ pour recevoir le message, via on_message .

Merci @TingDaoK

après avoir ajouté
mqtt_connection.on_message(on_message_received) #enregistrer votre rappel
problème résolu !!

Encore une fois merci pour la réponse rapide !!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

mkozjak picture mkozjak  ·  17Commentaires

satay99 picture satay99  ·  6Commentaires

shravan097 picture shravan097  ·  6Commentaires

victorct-pronto picture victorct-pronto  ·  3Commentaires

banuprathap picture banuprathap  ·  10Commentaires