Aws-iot-device-sdk-python-v2: AWS IOT MQTT dengan Sesi Persisten = Benar tetapi langganan gagal

Dibuat pada 31 Mei 2020  ·  4Komentar  ·  Sumber: aws/aws-iot-device-sdk-python-v2

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()
bug guidance needs-triage

Komentar yang paling membantu

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 .

Semua 4 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

banuprathap picture banuprathap  ·  10Komentar

mkozjak picture mkozjak  ·  8Komentar

Sanrro10 picture Sanrro10  ·  16Komentar

mkozjak picture mkozjak  ·  17Komentar

satay99 picture satay99  ·  6Komentar