Как определить, когда клиент MQTT отключается от брокера AWS IoT MQTT? - PullRequest
0 голосов
/ 19 октября 2019

Я работаю над небольшим маршрутизатором, который подключается через 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 не удалось?

...