Поделиться через


Начало работы с удостоверением модуля и двойником модуля в Центре Интернета вещей (Python)

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

Примечание.

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

По завершении работы с этой статьей у вас будет три приложения Python:

  • CreateModule: создает удостоверение устройства и модуля, а также соответствующие ключи безопасности для подключения к клиентам устройства и модуля;

  • UpdateModuleTwinDesiredProperties: отправляет обновленные требуемые свойства двойника модуля в Центр Интернета вещей;

  • ReceiveModuleTwinDesiredPropertiesPatch: получает обновление требуемых свойств двойника модуля на устройстве.

Примечание.

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

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

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

  • Центр Интернета вещей в подписке Azure. Если у вас еще нет центра, выполните действия, описанные в разделе Создание центра Интернета вещей.

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

Проверка подлинности модуля

Для проверки подлинности удостоверений модулей можно использовать симметричные ключи или сертификаты X.509. Для проверки подлинности сертификата X.509 сертификат модуля должен иметь общее имя (CN).CN=<deviceid>/<moduleid> Например:

openssl req -new -key d1m1.key.pem -out d1m1.csr -subj "/CN=device01\/module01"

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

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

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

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

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

  3. В меню над списком политик выберите Добавить политику общего доступа.

  4. В разделе Добавить политику общего доступа введите описательное имя политики, например, serviceAndRegistryReadWrite. В разделе Разрешения выберите Запись в реестр, Подключение служб и нажмите Добавить. (Разрешение на Чтение реестра включается автоматически при выборе параметра Запись в реестр.)

    Снимок экрана: добавление новой политики общего доступа

  5. Выберите новую политику из списка политик.

  6. В разделе Общие ключи доступа выберите значок копирования рядом с пунктом Первичная строка подключения и сохраните значение.

    Снимок экрана, показывающий получение строки подключения

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

Создание удостоверения устройства и удостоверения модуля в Центре Интернета вещей

В этом разделе объясняется, как создать приложение службы Python, которое создает удостоверение устройства и удостоверение модуля в реестре удостоверений центра Интернета вещей. Устройства и модули не могут подключаться к центру Интернета вещей, если в реестре удостоверений для них нет соответствующей записи. Дополнительные сведения см. в статье Сведения о реестре удостоверений в центре Интернета вещей. Запущенное консольное приложение создает уникальные идентификаторы и ключи одновременно для устройства и для модуля. Идентификатор и ключ чувствительны к регистру. Устройство и модуль применяют эти значения для идентификации при отправке сообщений с устройства в облако в Центр Интернета вещей.

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

    pip install azure-iot-hub
    
  2. В командной строке выполните следующую команду, чтобы установить пакет msrest. Этот пакет необходим для перехвата исключений HTTPOperationError.

    pip install msrest
    
  3. Используя текстовый редактор, создайте файл с именем CreateModule.py в рабочей папке.

  4. Добавьте следующий код в файл Python. Замените строку YourIoTHubConnectionString строкой подключения, скопированной в разделе Получение строки подключения центра Интернета вещей.

    import sys
    from msrest.exceptions import HttpOperationError
    from azure.iot.hub import IoTHubRegistryManager
    
    CONNECTION_STRING = "YourIotHubConnectionString"
    DEVICE_ID = "myFirstDevice"
    MODULE_ID = "myFirstModule"
    
    try:
        # RegistryManager
        iothub_registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
        try:
            # CreateDevice - let IoT Hub assign keys
            primary_key = ""
            secondary_key = ""
            device_state = "enabled"
            new_device = iothub_registry_manager.create_device_with_sas(
                DEVICE_ID, primary_key, secondary_key, device_state
            )
        except HttpOperationError as ex:
            if ex.response.status_code == 409:
                # 409 indicates a conflict. This happens because the device already exists.
                new_device = iothub_registry_manager.get_device(DEVICE_ID)
            else:
                raise
    
        print("device <" + DEVICE_ID +
              "> has primary key = " + new_device.authentication.symmetric_key.primary_key)
    
        try:
            # CreateModule - let IoT Hub assign keys
            primary_key = ""
            secondary_key = ""
            managed_by = ""
            new_module = iothub_registry_manager.create_module_with_sas(
                DEVICE_ID, MODULE_ID, managed_by, primary_key, secondary_key
            )
        except HttpOperationError as ex:
            if ex.response.status_code == 409:
                # 409 indicates a conflict. This happens because the module already exists.
                new_module = iothub_registry_manager.get_module(DEVICE_ID, MODULE_ID)
            else:
                raise
    
        print("device/module <" + DEVICE_ID + "/" + MODULE_ID +
              "> has primary key = " + new_module.authentication.symmetric_key.primary_key)
    
    except Exception as ex:
        print("Unexpected error {0}".format(ex))
    except KeyboardInterrupt:
        print("IoTHubRegistryManager sample stopped")
    
  5. В командной строке выполните приведенную ниже команду.

    python CreateModule.py
    

Это приложение создает удостоверение устройства с идентификатором myFirstDevice и удостоверение модуля с идентификатором myFirstModule на устройстве myFirstDevice. (Если идентификатор устройства или модуля уже есть в реестре удостоверений, код просто извлекает сведения об имеющемся устройстве или модуле.) Приложение отображает идентификатор и первичный ключ для каждого удостоверения.

Примечание.

В реестре удостоверений в Центре Интернета вещей хранятся только удостоверения устройств и модулей, необходимые для защиты доступа к Центру Интернета вещей. Реестр удостоверений хранит идентификаторы устройств и ключи, используемые в качестве учетных данных безопасности. Реестр удостоверений также хранит флаги включения и отключения для каждого устройства. Эти флаги можно использовать для отключения доступа для этого устройства. Если в приложении необходимо хранить другие метаданные для конкретного устройства, следует использовать хранилище конкретного приложения. У вас нет возможности включать и отключать удостоверения модулей. Дополнительные сведения см. в статье Сведения о реестре удостоверений в центре Интернета вещей.

Обновление двойника модуля с помощью пакета SDK для службы Python

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

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

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

  3. Добавьте следующий код в файл Python. Замените строку YourIoTHubConnectionString строкой подключения, скопированной в разделе Получение строки подключения центра Интернета вещей.

    import sys
    from azure.iot.hub import IoTHubRegistryManager
    from azure.iot.hub.models import Twin, TwinProperties
    
    CONNECTION_STRING = "YourIoTHubConnectionString"
    DEVICE_ID = "myFirstDevice"
    MODULE_ID = "myFirstModule"
    
    try:
        # RegistryManager
        iothub_registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
        module_twin = iothub_registry_manager.get_module_twin(DEVICE_ID, MODULE_ID)
        print ( "" )
        print ( "Module twin properties before update    :" )
        print ( "{0}".format(module_twin.properties) )
    
        # Update twin
        twin_patch = Twin()
        twin_patch.properties = TwinProperties(desired={"telemetryInterval": 122})
        updated_module_twin = iothub_registry_manager.update_module_twin(
            DEVICE_ID, MODULE_ID, twin_patch, module_twin.etag
        )
        print ( "" )
        print ( "Module twin properties after update     :" )
        print ( "{0}".format(updated_module_twin.properties) )
    
    except Exception as ex:
        print ( "Unexpected error {0}".format(ex) )
    except KeyboardInterrupt:
        print ( "IoTHubRegistryManager sample stopped" )
    

Получение обновлений на стороне устройства

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

  1. Получение строки подключения модуля. На портале Azure перейдите в Центр Интернета вещей и выберите Устройства в области слева. Выберите myFirstDevice в списке устройств и откройте его. На странице Удостоверения модулей выберите myFirstModule. Выберите значок копирования для Строки подключения (первичный ключ). Эта строка подключения необходима на следующем шаге.

    Снимок экрана: страница сведений об удостоверении модуля на портале Azure.

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

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

  4. Добавьте следующий код в файл Python. Замените строку YourModuleConnectionString строкой подключения модуля, скопированной на шаге 1.

    import time
    from azure.iot.device import IoTHubModuleClient
    
    CONNECTION_STRING = "YourModuleConnectionString"
    
    
    def twin_patch_handler(twin_patch):
        print("")
        print("Twin desired properties patch received:")
        print(twin_patch)
    
    
    def main():
        print ("Starting the IoT Hub Python sample...")
        client = IoTHubModuleClient.create_from_connection_string(CONNECTION_STRING)
    
        print ("Waiting for commands, press Ctrl-C to exit")
        try:
            # Attach the handler to the client
            client.on_twin_desired_properties_patch_received = twin_patch_handler
    
            while True:
                time.sleep(1000)
        except KeyboardInterrupt:
            print("IoTHubModuleClient sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
    if __name__ == '__main__':
        main()
    

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

Из этого раздела вы узнаете, как запустить приложение устройства ReceiveModuleTwinDesiredPropertiesPatch, а затем — приложение службы UpdateModuleTwinDesiredProperties, чтобы обновить требуемые свойства модуля.

  1. Откройте командную строку и запустите приложение устройства.

    python ReceiveModuleTwinDesiredPropertiesPatch.py
    

    Начальные выходные данные приложения устройства

  2. Откройте отдельную командную строку и запустите приложение службы.

    python UpdateModuleTwinDesiredProperties.py
    

    Обратите внимание, что требуемое свойство TelemetryInterval отображается в обновленном двойнике модуля в выходных данных приложения службы.

    Выходные данные приложения службы

    То же свойство отображается в исправлении требуемых свойств, полученном в выходных данных приложения устройства.

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

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

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