Semuanya yang Saya Hormati,
Saat bereksperimen dengan AWS IOT MQTT dengan Persistent Session, saya menemukan bahwa Broker mengembalikan 'session_present = True' sebagai balasan atas permintaan koneksi yang memiliki 'clean_session = False'.
Yang diharapkan saat saya terhubung kembali dalam 60 menit seperti yang ditentukan oleh AWS Documentation (praktis kurang dari 5 menit)
Masalah :
Sesuai teori, jika 'session_present = True' maka broker menyimpan info sesi sebelumnya sehingga tidak perlu berlangganan topik lagi.
Tetapi jika saya melewatkan langkah berlangganan topik maka tidak ada pesan yang diterima.
Apakah itu perilaku yang jelas? apakah saya perlu berhenti berlangganan meskipun 'session_present = True' ?
Saya menggunakan 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()
Hai,
Terima kasih telah menghubungi kami. Saya telah mengujinya dan Sesi Persisten berfungsi untuk saya.
Dalam sampel pubsub.py, jika koneksi terputus dan kembali, mqtt_conneciton terus menerima pesan. Tetapi Anda perlu mendaftarkan panggilan balik Anda pada objek _Connection_ untuk menerima pesan.
Misalnya, jika Anda membuat objek _Connection_ lain, dengan 'session_present = True' sebagai hasil koneksi, Anda perlu memanggil on_message untuk menyetel callback. Kemudian Anda dapat menerima pesan masuk melalui panggilan balik yang Anda tetapkan.
Terima kasih!
hai @TingDaoK
Terima kasih atas bantuan Anda. Tapi sayangnya, tetap saja, saya tidak bisa menyelesaikan masalah tersebut.
bisakah Anda melihat kode berikut untuk mencari tahu apa masalahnya?
langkah saya:
jalankan skrip berlangganan
jalankan skrip publikasikan
// pesan yang diterima di skrip berlangganan
sekarang hentikan kedua skrip
tunggu sebentar atau lebih
jalankan skrip berlangganan
// koneksi hasil masa depan mengembalikan .... result['session_present'] = Benar. Oleh karena itu, loop berlangganan dilewati
jalankan skrip publikasikan
// Masalah: tidak ada pesan yang diterima di skrip berlangganan
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))
Hai @GauravPatni
Silakan coba:
if not is_session_persistent:
XXX
else:
mqtt_connection.on_message(on_message_received) #register your callback
print("-----------Session is Persistent---------")
Koneksi Anda terhubung, tetapi Anda masih perlu mendaftarkan panggilan balik Anda pada objek _Connection_ untuk menerima pesan, melalui on_message .
Terima kasih
Hai @GauravPatni
Silakan coba:
if not is_session_persistent: XXX else: mqtt_connection.on_message(on_message_received) #register your callback print("-----------Session is Persistent---------")
Koneksi Anda terhubung, tetapi Anda masih perlu mendaftarkan panggilan balik Anda pada objek _Connection_ untuk menerima pesan, melalui on_message .
Terima kasih @TingDaoK
setelah menambahkan
mqtt_connection.on_message(on_message_received) #daftarkan panggilan balik Anda
masalah terselesaikan !!
Sekali lagi terima kasih untuk balasan cepat!!
Komentar yang paling membantu
Hai @GauravPatni
Silakan coba:
Koneksi Anda terhubung, tetapi Anda masih perlu mendaftarkan panggilan balik Anda pada objek _Connection_ untuk menerima pesan, melalui on_message .