Aws-iot-device-sdk-python-v2: AWS IOT MQTT con sesión persistente = Verdadero pero falló la suscripción

Creado en 31 may. 2020  ·  4Comentarios  ·  Fuente: aws/aws-iot-device-sdk-python-v2

Queridos todos,

Mientras experimentaba con AWS IOT MQTT con sesión persistente, descubrí que el agente devuelve 'session_present = True' en respuesta a la solicitud de conexión que tiene 'clean_session = False'.
Lo cual se esperaba ya que me reconecté en 60 minutos según lo especificado por la documentación de AWS (prácticamente fue menos de 5 minutos)

Asunto :
Según la teoría, si 'session_present = True', el corredor almacena la información de la sesión anterior, por lo que no es necesario suscribirse a los temas nuevamente.
Pero si me salto el paso de suscribirme al tema, entonces no recibo ningún mensaje.
¿Es el comportamiento obvio? ¿Tengo que darme de baja aunque 'session_present = True'?

Estoy usando 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

Comentario más útil

Hola @GauravPatni

Por favor, inténtalo:

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

Su conexión está conectada, pero aún necesita registrar su devolución de llamada en el objeto _Connection_ para recibir el mensaje, a través de on_message .

Todos 4 comentarios

Hola,
Gracias por comunicarte. Lo he probado y la sesión persistente me funciona.
En el ejemplo pubsub.py, si la conexión se pierde y regresa, mqtt_conneciton continúa recibiendo el mensaje. Pero debe registrar su devolución de llamada en el objeto _Connection_ para recibir el mensaje.
Por ejemplo, si crea otro objeto _Connection_, con 'session_present = True' como resultado de la conexión, deberá llamar a on_message para configurar la devolución de llamada. Luego, puede recibir el mensaje entrante a través de la devolución de llamada que configuró.
¡Gracias!

hola @TingDaoK
Gracias por tu ayuda. Pero, desafortunadamente, aún no puedo resolver el problema.
¿Podría consultar el siguiente código para averiguar cuál es el problema?

mis pasos:
ejecutar script de suscripción
ejecutar script de publicación
// mensajes recibidos en el script de suscripción
ahora termina ambos scripts
espera un minuto o más
ejecutar script de suscripción
// conexión futura resultado devuelve .... resultado ['session_present'] = Verdadero. Por lo tanto, se omite el bucle de suscripción
ejecutar script de publicación
// Problema: no se recibieron mensajes en el script de suscripción

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

Hola @GauravPatni

Por favor, inténtalo:

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

Su conexión está conectada, pero aún necesita registrar su devolución de llamada en el objeto _Connection_ para recibir el mensaje, a través de on_message .

Gracias

Hola @GauravPatni

Por favor, inténtalo:

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

Su conexión está conectada, pero aún necesita registrar su devolución de llamada en el objeto _Connection_ para recibir el mensaje, a través de on_message .

Gracias @TingDaoK

después de agregar
mqtt_connection.on_message (on_message_received) #registra tu devolución de llamada
problema resuelto !!

Una vez más, gracias por la rápida respuesta.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

mkozjak picture mkozjak  ·  17Comentarios

shravan097 picture shravan097  ·  6Comentarios

satay99 picture satay99  ·  6Comentarios

victorct-pronto picture victorct-pronto  ·  3Comentarios

supertick picture supertick  ·  7Comentarios