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()
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 !!
Hilfreichster Kommentar
Hallo @GauravPatni
Bitte versuche:
Ihre Verbindung ist verbunden, aber Sie müssen Ihren Rückruf noch am _Connection_-Objekt registrieren, um die Nachricht über on_message zu empfangen .