Aws-iot-device-sdk-python-v2: AWS IOT MQTT с постоянным сеансом = True, но подписка не удалась

Созданный на 31 мая 2020  ·  4Комментарии  ·  Источник: aws/aws-iot-device-sdk-python-v2

Приветствую всех,

Во время экспериментов с AWS IOT MQTT с постоянным сеансом я обнаружил, что брокер возвращает session_present = True в ответ на запрос подключения, имеющий clean_session = False.
Что ожидается, поскольку я повторно подключился в течение 60 минут, как указано в документации AWS (практически это было менее 5 минут)

Проблема :
Согласно теории, если 'session_present = True', то брокер сохраняет информацию о предыдущем сеансе, поэтому нет необходимости снова подписываться на темы.
Но если я пропущу этап подписки на тему, то сообщений не будет.
Это очевидное поведение? мне нужно отказаться от подписки, даже если 'session_present = True'?

Я использую 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

Самый полезный комментарий

Привет @GauravPatni

Пожалуйста, попробуй:

   if not is_session_persistent:
        XXX
   else:
        mqtt_connection.on_message(on_message_received) #register your callback
        print("-----------Session is Persistent---------")

Ваше соединение установлено, но вам все равно нужно зарегистрировать обратный вызов в объекте _Connection_, чтобы получить сообщение через on_message .

Все 4 Комментарий

Здравствуй,
Спасибо, что обратились к нам. Я протестировал его, и у меня работает постоянная сессия.
В примере pubsub.py, если соединение потеряно и возвращается, mqtt_conneciton продолжает получать сообщение. Но вам нужно зарегистрировать обратный вызов для объекта _Connection_, чтобы получить сообщение.
Например, если вы создаете другой объект _Connection_ с 'session_present = True' в качестве результата подключения, вам нужно будет вызвать on_message, чтобы установить обратный вызов. Затем вы можете получать входящее сообщение через установленный вами обратный вызов.
Спасибо!

привет @TingDaoK
Спасибо за вашу помощь. Но, к сожалению, до сих пор я не могу решить проблему.
Не могли бы вы изучить следующий код, чтобы понять, в чем проблема?

мои шаги:
запустить сценарий подписки
запустить скрипт публикации
// сообщения, полученные по сценарию подписки
теперь завершите оба сценария
подождите минуту или больше
запустить сценарий подписки
// будущий результат соединения возвращает .... результат ['session_present'] = True. Следовательно, цикл подписки пропускается
запустить скрипт публикации
// Проблема: сообщения на скрипт подписки не поступали

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

Привет @GauravPatni

Пожалуйста, попробуй:

   if not is_session_persistent:
        XXX
   else:
        mqtt_connection.on_message(on_message_received) #register your callback
        print("-----------Session is Persistent---------")

Ваше соединение установлено, но вам все равно нужно зарегистрировать обратный вызов в объекте _Connection_, чтобы получить сообщение через on_message .

Спасибо

Привет @GauravPatni

Пожалуйста, попробуй:

   if not is_session_persistent:
        XXX
   else:
        mqtt_connection.on_message(on_message_received) #register your callback
        print("-----------Session is Persistent---------")

Ваше соединение установлено, но вам все равно нужно зарегистрировать обратный вызов в объекте _Connection_, чтобы получить сообщение через on_message .

Спасибо @TingDaoK

после добавления
mqtt_connection.on_message (on_message_received) # зарегистрируйте обратный вызов
проблема решена !!

Еще раз спасибо за быстрый ответ !!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги