Приветствую всех,
Во время экспериментов с 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()
Здравствуй,
Спасибо, что обратились к нам. Я протестировал его, и у меня работает постоянная сессия.
В примере 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) # зарегистрируйте обратный вызов
проблема решена !!
Еще раз спасибо за быстрый ответ !!
Самый полезный комментарий
Привет @GauravPatni
Пожалуйста, попробуй:
Ваше соединение установлено, но вам все равно нужно зарегистрировать обратный вызов в объекте _Connection_, чтобы получить сообщение через on_message .