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()
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 !!
Commentaire le plus utile
Salut @GauravPatni
S'il vous plaît essayez:
Votre connexion est connectée, mais vous devez encore enregistrer votre rappel sur l'objet _Connection_ pour recevoir le message, via on_message .