Бөлісу құралы:


Начало работы с управлением устройствами (Python)

Внутренние приложения могут использовать Центр Интернета вещей Azure примитивы, такие как двойники устройств и прямые методы, для удаленного запуска и мониторинга действий управления устройствами на устройствах. В этой статье показано, как серверное приложение и приложение для устройства взаимодействуют для запуска и отслеживания процесса удаленной перезагрузки устройства с помощью Центра Интернета вещей.

Примечание.

Функции, описанные в этой статье, доступны только на стандартном уровне Центра Интернета вещей. Дополнительные сведения о базовых и бесплатных уровнях Центр Интернета вещей см. в разделе "Выбор подходящего уровня Центр Интернета вещей" для решения.

Прямой метод используется для запуска действий по управлению устройствами (таких как перезагрузка, сброс к параметрам по умолчанию и обновление встроенного ПО) из внутреннего приложения в облаке. Устройство отвечает за следующие действия:

  • Обработка запроса метода, отправленного из Центра Интернета вещей.

  • Инициализация соответствующего действия на определенном устройстве.

  • Предоставление сведений об обновлении состояния в Центр Интернета вещей в сообщаемых свойствах.

Вы можете воспользоваться серверным приложением в облаке, чтобы выполнить запросы двойника устройства для получения сведений о ходе выполнения ваших действий по управлению устройствами.

В этой статье показано, как создать:

  • dmpatterns_getstarted_device.py: приложение имитированного устройства с прямым методом, который перезагружает устройство и сообщает время последней перезагрузки. Прямые методы вызываются из облака.

  • dmpatterns_getstarted_service.py: консольное приложение Python, вызывающее прямой метод в приложении имитированного устройства с помощью центра Интернета вещей. Он отображает ответ и обновленные сообщаемые свойства.

Примечание.

Дополнительные сведения о средствах SDK, доступных для создания приложений устройств и внутренних приложений, см. в пакетах SDK Для Интернета вещей Azure.

Необходимые компоненты

  • Активная учетная запись Azure. Если ее нет, можно создать бесплатную учетную запись всего за несколько минут.

  • Центр Интернета вещей. Создайте его с помощью CLI или портала Azure.

  • Устройство, зарегистрированное в центре Интернета вещей. Если у вас нет устройства в Центре Интернета вещей, выполните действия, описанные в разделе "Регистрация устройства".

  • Рекомендуется использовать Python 3.7 или более поздней версии. Обязательно используйте 32-разрядную или 64-разрядную версию установки согласно требованиям программы настройки. При появлении запроса во время установки обязательно добавьте Python в переменную среды соответствующей платформы.

  • Убедитесь, что в брандмауэре открыт порт 8883. Пример устройства в этой статье использует протокол MQTT, который передает данные через порт 8883. В некоторых корпоративных и академических сетях этот порт может быть заблокирован. Дополнительные сведения и способы устранения этой проблемы см. в разделе о подключении к Центру Интернета вещей по протоколу MQTT.

Регистрация нового устройства в центре Интернета вещей

В этом разделе рассматривается создание удостоверения устройства для этой статьи с помощью Azure CLI. Идентификаторы устройств чувствительны к регистру.

  1. Откройте Azure Cloud Shell.

  2. В Azure Cloud Shell выполните следующую команду, чтобы установить расширение Интернета вещей Microsoft Azure для Azure CLI:

    az extension add --name azure-iot
    
  3. Создайте удостоверение устройства с именем myDeviceId и получите строку подключения устройства с помощью следующих команд:

    az iot hub device-identity create --device-id myDeviceId --hub-name {Your IoT Hub name} --resource-group {Resource group of the Hub}
    az iot hub device-identity connection-string show --device-id myDeviceId --hub-name {Your IoT Hub name} --resource-group {Resource group of the Hub} -o table
    

    Внимание

    Идентификатор устройства может отображаться в журналах, собранных для поддержки клиентов и устранения неполадок, поэтому не используйте конфиденциальную информацию, когда присваиваете ему имя.

Запишите строку подключения устройства из результата. Строка подключения этого устройства используется приложением устройства для подключения к Центру Интернета вещей в качестве устройства.

Создание приложения устройства с помощью прямого метода

В этом разделе выполняются следующие действия:

  • Создайте консольное приложение Python, которое отвечает на прямой метод, вызываемый облаком.

  • Имитация перезагрузки устройства.

  • использование сообщаемых свойств в запросах двойника устройства для определения устройств и времени их последней перезагрузки.

В Azure Cloud Shell, используемой ранее или в любой другой среде с Python, создайте код устройства.

  1. В командной строке выполните следующую команду, чтобы установить пакет azure-iot-device:

    pip install azure-iot-device
    
  2. Используя текстовый редактор, создайте в рабочей папке файл dmpatterns_getstarted_device.py.

  3. Добавьте следующие инструкции import в начале файла dmpatterns_getstarted_device.js.

    import time
    import datetime
    from azure.iot.device import IoTHubDeviceClient, MethodResponse
    
  4. Добавьте переменную CONNECTION_STRING. Замените значение заполнителя {deviceConnectionString} строкой подключения устройства. Она была скопирована ранее в разделе Регистрация нового устройства в центре Интернета вещей.

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. Добавьте следующую функцию для создания экземпляра клиента, настроенного для прямых методов на устройстве.

    def create_client():
        # Instantiate the client
        client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        # Define the handler for method requests
        def method_request_handler(method_request):
            if method_request.name == "rebootDevice":
                # Act on the method by rebooting the device
                print("Rebooting device")
                time.sleep(20)
                print("Device rebooted")
    
                # ...and patching the reported properties
                current_time = str(datetime.datetime.now())
                reported_props = {"rebootTime": current_time}
                client.patch_twin_reported_properties(reported_props)
                print( "Device twins updated with latest rebootTime")
    
                # Create a method response indicating the method request was resolved
                resp_status = 200
                resp_payload = {"Response": "This is the response from the device"}
                method_response = MethodResponse(method_request.request_id, resp_status, resp_payload)
    
            else:
                # Create a method response indicating the method request was for an unknown method
                resp_status = 404
                resp_payload = {"Response": "Unknown method"}
                method_response = MethodResponse(method_request.request_id, resp_status, resp_payload)
    
            # Send the method response
            client.send_method_response(method_response)
    
        try:
            # Attach the handler to the client
            client.on_method_request_received = method_request_handler
        except:
            # In the event of failure, clean up
            client.shutdown()
    
        return client
    
  6. Запустите пример прямого метода и подождите.

    def main():
        print ("Starting the IoT Hub Python sample...")
        client = create_client()
    
        print ("Waiting for commands, press Ctrl-C to exit")
        try:
            # Wait for program exit
            while True:
                time.sleep(1000)
        except KeyboardInterrupt:
            print("IoTHubDeviceClient sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
    if __name__ == '__main__':
        main()
    
  7. Сохраните и закройте файл dmpatterns_getstarted_device.py.

Примечание.

Для простоты в этом руководстве не реализуются политики повтора. В рабочем коде следует реализовать политики повторных попыток (например, с экспоненциальной задержкой), как указано в статье Обработка временных сбоев.

Получение строки подключения центра Интернета вещей

В этой статье вы создадите серверную службу, которая вызывает прямой метод на устройстве. Чтобы вызвать прямой метод на устройстве через Центр Интернета вещей, службе требуется разрешение service connect. По умолчанию каждый Центр Интернета вещей создается с помощью политики общего доступа, называемой службой, которая предоставляет это разрешение.

Чтобы получить строку подключения Центра Интернета вещей для политики службы, выполните следующие действия:

  1. На портале Azure выберите Группы ресурсов. Выберите группу ресурсов, в которой находится центр, а затем выберите центр из списка ресурсов.

  2. В левой части центра Интернета вещей выберите Политики общего доступа.

  3. В списке политик выберите политику службы.

  4. Скопируйте основную строку подключения и сохраните значение.

Снимок экрана: извлечение строки подключения из Центра Интернета вещей на портале Azure.

Дополнительные сведения о политиках и разрешениях общего доступа Центра Интернета вещей см. в разделе Управления доступом и разрешения.

Создание приложения службы для активации перезагрузки

В этом разделе вы создадите консольное приложение Python, которое инициирует удаленное обновление устройства с помощью прямого метода. Приложение использует запросы двойника устройства для определения времени последней перезагрузки этого устройства.

В Azure Cloud Shell или любой другой среде с помощью Python создайте код консоли.

  1. В командной строке выполните следующую команду, чтобы установить пакет azure-iot-hub:

    pip install azure-iot-hub
    
  2. Используя текстовый редактор, создайте в рабочей папке файл dmpatterns_getstarted_service.py.

  3. Добавьте следующие инструкции import в начале файла dmpatterns_getstarted_service.py.

    import sys, time
    
    from azure.iot.hub import IoTHubRegistryManager
    from azure.iot.hub.models import CloudToDeviceMethod, CloudToDeviceMethodResult, Twin
    
  4. Добавьте следующие объявления переменных. Замените заполнитель {IoTHubConnectionString} строкой подключения центра Интернета вещей, скопированной в разделе Получение строки подключения центра Интернета вещей. Замените значение заполнителя {deviceId} идентификатором устройства, зарегистрированным в разделе Регистрация нового устройства в центре Интернета вещей.

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
    METHOD_NAME = "rebootDevice"
    METHOD_PAYLOAD = "{\"method_number\":\"42\"}"
    TIMEOUT = 60
    WAIT_COUNT = 10
    
  5. Добавьте следующую функцию для вызова метода устройства, чтобы перезагрузить целевое устройство, а затем выполнить запрос к двойникам устройства и получить сведения о времени последней перезагрузки.

    def iothub_devicemethod_sample_run():
        try:
            # Create IoTHubRegistryManager
            registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
            print ( "" )
            print ( "Invoking device to reboot..." )
    
            # Call the direct method.
            deviceMethod = CloudToDeviceMethod(method_name=METHOD_NAME, payload=METHOD_PAYLOAD)
            response = registry_manager.invoke_device_method(DEVICE_ID, deviceMethod)
    
            print ( "" )
            print ( "Successfully invoked the device to reboot." )
    
            print ( "" )
            print ( response.payload )
    
            while True:
                print ( "" )
                print ( "IoTHubClient waiting for commands, press Ctrl-C to exit" )
    
                status_counter = 0
                while status_counter <= WAIT_COUNT:
                    twin_info = registry_manager.get_twin(DEVICE_ID)
    
                    if twin_info.properties.reported.get("rebootTime") != None :
                        print ("Last reboot time: " + twin_info.properties.reported.get("rebootTime"))
                    else:
                        print ("Waiting for device to report last reboot time...")
    
                    time.sleep(5)
                    status_counter += 1
    
        except Exception as ex:
            print ( "" )
            print ( "Unexpected error {0}".format(ex) )
            return
        except KeyboardInterrupt:
            print ( "" )
            print ( "IoTHubDeviceMethod sample stopped" )
    
    if __name__ == '__main__':
        print ( "Starting the IoT Hub Service Client DeviceManagement Python sample..." )
        print ( "    Connection string = {0}".format(CONNECTION_STRING) )
        print ( "    Device ID         = {0}".format(DEVICE_ID) )
    
        iothub_devicemethod_sample_run()
    
  6. Сохраните и закройте файл dmpatterns_getstarted_service.py.

Запуск приложений

Теперь вы готовы запустить код устройства и код службы, который инициирует перезагрузку устройства.

  1. В командной строке, где вы создали устройство, выполните следующую команду, чтобы начать прослушивание прямого метода перезагрузки.

    python dmpatterns_getstarted_device.py
    
  2. В командной строке, в которой создается служба, выполните следующую команду, чтобы активировать удаленную перезагрузку и запросить двойник устройства, чтобы найти время последней перезагрузки.

    python dmpatterns_getstarted_service.py
    
  3. В консоли отобразится ответ устройства на прямой метод.

    Ниже показан ответ устройства на прямой метод перезагрузки:

    Выходные данные приложения имитированного устройства

    Ниже показана служба, которая вызывает прямой метод перезагрузки и опрашивает двойник устройства, чтобы узнать состояние:

    Выходные данные после активации перезагрузки службы

Настройка и расширенные возможности действий по управлению устройствами

Решения Интернета вещей позволяют расширить определенный набор шаблонов управления устройствами или добавить пользовательские шаблоны. Для этого используются примитивы — двойники устройств и методы передачи из облака на устройство. Примеры других действий по управлению устройствами: сброс к параметрам по умолчанию, обновление встроенного ПО, обновление программного обеспечения, управление питанием, управление сетями и подключениями и шифрование данных.

Периоды обслуживания устройств

Как правило устройства настраиваются на выполнение действий по очереди, что позволяет свести к минимуму прерывания в работе и время простоя. Периоды обслуживания устройств — это распространенный шаблон для определения времени, когда выполняется обновление конфигурации устройства. Ваши серверные решения могут использовать необходимые свойства двойника устройства для определения и активации на устройстве политики, которая задает период обслуживания. Когда устройство получает политику периода обслуживания, оно может использовать сообщаемые свойства двойника устройства для предоставления сведений о состоянии политики. Затем серверное приложение может использовать запросы двойника устройства для подтверждения соответствия устройств и каждой политики.

Следующие шаги

В этой статье для запуска удаленной перезагрузки устройства использовался прямой метод. Здесь использовались сообщаемые свойства для передачи с устройства сведений о последней перезагрузке, а также выполняли запрос к двойнику устройства для поиска значения времени последней перезагрузки устройства из облака.

Для продолжения работы с Центром Интернета вещей и шаблонами управления устройствами, такими как полное обновление на основе образа, ознакомьтесь со статьейРабота с Обновлением устройств для Центра Интернета вещей Azure: использование эталонного образа для Raspberry Pi 3 B+.

Дополнительные сведения о расширении решения Центра Интернета вещей и планировании вызовов методов на нескольких устройствах см. в разделе Планирование и трансляция заданий.