Сбой MQTT на одном экземпляре устройства Azure IoT Central - PullRequest
0 голосов
/ 05 марта 2020

У меня есть приложение IOT Central, к которому я подключаюсь с Raspberry Pi. Мое приложение написано в python и использует этот клиент . На ровном месте он перестал соединяться. В ходе устранения неполадок я создал новый экземпляр устройства и смог подключиться к нему и без проблем отправлять данные.

Когда я подключаюсь к экземпляру устройства, на котором происходит сбой, я получаю следующий отладочный вывод:

(1583372709.496152, '- iotc :: connect :: ')
(1583372711.196312, u'- iotc :: _loopAssign :: https://global.azure-devices-provisioning.net/[SNIP]/registrations/[SNIP]/operations/[SNIP]?api-version=2018-11-01')
(1583372711.704034, "ERROR : (_mqttConnect) DPS L => {u'status': u'failed', u'registrationState': {u'status': u'failed', u'registrationId': u'[SNIP]', u'lastUpdatedDateTimeUtc': u'2020-03-05T01:45:10.9083208Z', u'errorMessage': u'Custom allocation failed with status code: 404', u'createdDateTimeUtc': u'2020-03-05T01:45:10.7281998Z', u'errorCode': 400207, u'etag': u'IjI4MDAwZWVjLTAwMDAtMDcwMC0wMDAwLTVlNjA1OWE2MDAwMCI='}, u'operationId': u'4.9c72ae77bbf4a798.07be3168-8a06-4a14-9d3b-83be8b4cef17'}")

Вот код:

# Portions Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license.

import iotc
from iotc import IOTConnectType, IOTLogLevel

import sht31
from time import sleep

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

print bcolors.WARNING + "Version: 0.5.2" + bcolors.ENDC

deviceId = "[SNIP]"
scopeId = "[SNIP]"
deviceKey = "[SNIP]"

gardenMonitor = iotc.Device(scopeId, deviceKey, deviceId, IOTConnectType.IOTC_CONNECT_SYMM_KEY)
# gardenMonitor.setLogLevel(IOTLogLevel.IOTC_LOGGING_API_ONLY)
gardenMonitor.setLogLevel(IOTLogLevel.IOTC_LOGGING_ALL)

gCanSend = False
gCounter = 0

def onconnect(info):
  global gCanSend
  print("- [onconnect] => status:" + str(info.getStatusCode()))
  if info.getStatusCode() == 0:
     if gardenMonitor.isConnected():
       gCanSend = True
  elif info.getStatusCode() == 1:
    print bcolors.FAIL + "ERROR: Connect status code: 1. Terminating program." + bcolors.ENDC
    sys.exit("Unable to connect. Terminating program.")

def onmessagesent(info):
  print("\t- [onmessagesent] => " + str(info.getPayload()))

def oncommand(info):
  print("- [oncommand] => " + info.getTag() + " => " + str(info.getPayload()))

def onsettingsupdated(info):
  print("- [onsettingsupdated] => " + info.getTag() + " => " + info.getPayload())

gardenMonitor.on("ConnectionStatus", onconnect)
gardenMonitor.on("MessageSent", onmessagesent)
gardenMonitor.on("Command", oncommand)
gardenMonitor.on("SettingsUpdated", onsettingsupdated)

gardenMonitor.connect()

sht31 = sht31.SHT31(1) # Raspberry Pi 4 places the sht31 bus on 1; some older units place it on 0
while True:
  while gardenMonitor.isConnected():
    gardenMonitor.doNext() # do the async work needed to be done for MQTT
    if gCanSend == True:
      if gCounter % 20 == 0: # Does this seriously just count to 20 for delay??
        gCounter = 0
        temperature, humidity = sht31.get_temp_and_humidity()
        asvp = 610.78 * 2.71828 ** (temperature / (temperature + 238.3) * 17.2694) / 1000  # Calculate SVP of the air
        lsvp = 610.78 * 2.71828 ** ((temperature - 2) / (temperature + 236.3) * 17.2694) / 1000 # Calculate SVP of the leaves
        vpd = lsvp - (asvp * humidity / 100)
        print bcolors.BOLD + "Temperature:" + bcolors.OKGREEN + " %s" % temperature + bcolors.ENDC
        print bcolors.BOLD + "Humidity:" + bcolors.OKGREEN + "    %s" % humidity + bcolors.ENDC
        print bcolors.BOLD + "VPD:" + bcolors.OKGREEN +  "         %s" %vpd + bcolors.ENDC
        #print("Sending telemetry..")
        gardenMonitor.sendTelemetry("{ \
          \"temperature\": " + str(temperature) + ", \
          \"humidity\": " + str(humidity) + ", \
          \"VPD\": " + str(vpd) + "}")

      gCounter += 1
  else:
    gardenMonitor.connect()
    sleep(5)

Может кто-нибудь предложить способ исправить экземпляр устройства, чтобы мне не пришлось выбрасывать его историю и начинать заново с новым экземпляром? Я попытался заблокировать и разблокировать устройство, перенести его между группами устройств и снова одобрить устройство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...