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()
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.
Comentario más útil
Hola @GauravPatni
Por favor, inténtalo:
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 .