Я работаю над небольшим маршрутизатором, который подключается через LTE / 3G к брокеру AWS IoT MQTT для регулярной публикации сообщений. Когда интернет работает и маршрутизатор AWSIoTMQTTClient может подключиться к брокеру, сообщения отправляются, и все работает нормально.
Но когда устройство теряет подключение к Интернету, я хочу сохранить сообщения, которые должны были быть отправлены, пока устройствобыл офлайн на локальном диске. Как только соединение с AWS станет возможным, продолжайте отправку в брокер и не сохраняйте на диске.
В моем тесте функции onOnline и onOffline не работали правильно, когда я отключаю Интернет.
Когда я запускаю тест с подключением к Интернету, вызывается функция "on_online" и отправляются сообщения. Пока устройство работает и отправляет сообщения, я отключаю интернет, но функции «on_offline» никогда не вызывают. Таким образом, все сообщения будут переданы брокеру, как только интернет / подключение к AWS снова заработает. (Поскольку я установил для своего клиента «Бесконечную очередь публикации в автономном режиме»).
Когда я запускаю тест без подключения к Интернету, "on_offline" function
никогда не вызывается.
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
from time import time
def on_online():
global awsClient_Online
awsClient_Online = True
def on_offline():
global awsClient_Online
global awsClient_OfflineSince
awsClient_Online = False
awsClient_OfflineSince = time()
def main():
# Init AWSIoTMQTTClient
awsClient = None
awsClient = AWSIoTMQTTClient(Aws_ClientId)
awsClient.configureEndpoint(Aws_ApiEndpoint, Aws_Port)
awsClient.configureCredentials(Aws_RootCa, Aws_PrivateKey, Aws_CertFile)
# AWSIoTMQTTClient connection configuration
awsClient.configureAutoReconnectBackoffTime(1, 32, 20)
awsClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing
awsClient.configureDrainingFrequency(2) # Draining: 2 Hz
awsClient.configureConnectDisconnectTimeout(10) # 10 sec
awsClient.configureMQTTOperationTimeout(5) # 5 sec
# Register a onOnline/onOffline callback
awsClient.onOnline = on_online
awsClient.onOffline = on_offline
global awsClient_Online
global awsClient_OfflineSince
# Connect to AWS IoT
try:
awsClient.connect()
'''
According to documentation should return True when connection OK,
False when not OK.. but I'm getting error "socket.gaierror: [Errno -3]
Temporary failure in name resolution" when no internet
https://s3.amazonaws.com/aws-iot-device-sdk-python-docs/html/index.html#AWSIoTPythonSDK.MQTTLib.AWSIoTMQTTClient.connect
'''
except:
awsClient_Online = False
awsClient_OfflineSince = time()
# Cyclic program
while True:
if not awsClient_Online:
try:
awsClient.connect()
except:
awsClient_Online = False
awsClient_OfflineSince = time()
if awsClient_Online:
# Send messages
else:
# Save on disk
Я думал, чтопеременная "awsClient._mqtt_core._client_status._status" будет обновляться всякий раз, когда соединение будет потеряно / снова, но это не так. Например, когда это «4» (подключено, как я давно видел), а затем я отключаю интернет, оно остается на «4».
Как я могу эффективно узнать, когда соединение с AWS не удалось?