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


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

Двойники устройств — это документы JSON, хранящие сведения о состоянии устройства, в том числе метаданные, конфигурации и условия. Центр Интернета вещей сохраняет двойник устройства для каждого устройства, подключаемого к нему.

Примечание.

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

Двойники устройства используются для выполнения следующих действий:

  • хранение метаданных устройства из серверной части вашего решения;

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

  • синхронизация состояния длительных рабочих процессов между приложением устройства и серверной частью, например при обновлении встроенного ПО и конфигурации;

  • выполнение запроса метаданных, конфигурации или состояния устройства.

Двойники устройств используются для синхронизации и выполнения запроса конфигураций или условий устройства. Дополнительные сведения об двойниках устройств, включая использование двойников устройств, см. в разделе "Общие сведения о двойниках устройств".

Центры Интернета вещей хранят двойники устройств, которые содержат следующие элементы:

  • Теги. Метаданные устройства, доступные только в серверной части решения.

  • Требуемые свойства. Объекты JSON, задаваемые только в серверной части решения и наблюдаемые в приложении устройства.

  • Сообщаемые свойства. Объекты JSON, задаваемые только в приложении устройства и считываемые в серверной части решения.

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

Следующая иллюстрация показывает организацию двойника устройства:

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

Кроме того, из серверной части решения можно запросить двойники устройств на основе всех вышеизложенных данных. Дополнительные сведения о двойниках устройств см. в статье Основные сведения о двойниках устройств. Дополнительные сведения запросах см. в статье Язык запросов Центра Интернета вещей.

Из этой статьи вы узнаете, как выполнять следующие задачи:

  • С помощью приложения имитированного устройства вы можете передавать данные о своем канале подключения как передаваемое свойство двойника устройства.

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

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

  • AddTagsAndQuery.py: внутреннее приложение, которое добавляет теги и запрашивает двойники устройств.

  • ReportConnectivity.py: приложение имитированного устройства, которое подключается к вашему центру Интернета вещей и сообщает о состоянии подключения.

Примечание.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создание приложения-службы, которое обновляет требуемые свойства и двойники запросов

В этом разделе показано, как создать консольное приложение Python, которое добавляет метаданные расположения в двойник устройства, связанный с указанным {Device ID}. Приложение запрашивает центр Интернета вещей для устройств, расположенных в США, а затем запрашивает устройства, которые сообщают о подключении к сотовой сети.

  1. В рабочей папке откройте окно командной строки и установите пакет SDK службы Центра Интернета вещей Azure для Python.

    pip install azure-iot-hub
    
  2. В текстовом редакторе создайте файл AddTagsAndQuery.py.

  3. Добавьте следующий код для импорта необходимых модулей из пакета SDK службы:

    import sys
    from time import sleep
    from azure.iot.hub import IoTHubRegistryManager
    from azure.iot.hub.models import Twin, TwinProperties, QuerySpecification, QueryResult
    
  4. Добавьте следующий код. Замените [IoTHub Connection String] строкой подключения центра Интернета вещей, скопированной в разделе Получение строки подключения центра Интернета вещей. Замените [Device Id] идентификатор устройства (имя) зарегистрированного устройства в Центре Интернета вещей.

    IOTHUB_CONNECTION_STRING = "[IoTHub Connection String]"
    DEVICE_ID = "[Device Id]"
    
  5. Добавьте следующий код в файл AddTagsAndQuery.py:

    def iothub_service_sample_run():
        try:
            iothub_registry_manager = IoTHubRegistryManager(IOTHUB_CONNECTION_STRING)
    
            new_tags = {
                    'location' : {
                        'region' : 'US',
                        'plant' : 'Redmond43'
                    }
                }
    
            twin = iothub_registry_manager.get_twin(DEVICE_ID)
            twin_patch = Twin(tags=new_tags, properties= TwinProperties(desired={'power_level' : 1}))
            twin = iothub_registry_manager.update_twin(DEVICE_ID, twin_patch, twin.etag)
    
            # Add a delay to account for any latency before executing the query
            sleep(1)
    
            query_spec = QuerySpecification(query="SELECT * FROM devices WHERE tags.location.plant = 'Redmond43'")
            query_result = iothub_registry_manager.query_iot_hub(query_spec, None, 100)
            print("Devices in Redmond43 plant: {}".format(', '.join([twin.device_id for twin in query_result.items])))
    
            print()
    
            query_spec = QuerySpecification(query="SELECT * FROM devices WHERE tags.location.plant = 'Redmond43' AND properties.reported.connectivity = 'cellular'")
            query_result = iothub_registry_manager.query_iot_hub(query_spec, None, 100)
            print("Devices in Redmond43 plant using cellular network: {}".format(', '.join([twin.device_id for twin in query_result.items])))
    
        except Exception as ex:
            print("Unexpected error {0}".format(ex))
            return
        except KeyboardInterrupt:
            print("IoT Hub Device Twin service sample stopped")
    

    Объект IoTHubRegistryManager позволяет получить все методы, необходимые для взаимодействия с двойниками устройства из службы. Этот код инициализирует объект IoTHubRegistryManager, записывает идентификатор устройства DEVICE_ID в двойник устройства и выполняет два запроса. Первый запрос предназначен для выбора только двойников устройств, расположенных в фабрике Redmond43, а второй уточняет условия первого запроса и выбирает устройства, подключенные по сети мобильной связи.

  6. Добавьте следующий код в конце файла AddTagsAndQuery.py, чтобы реализовать функцию iothub_service_sample_run.

    if __name__ == '__main__':
        print("Starting the Python IoT Hub Device Twin service sample...")
        print()
    
        iothub_service_sample_run()
    
  7. Запустите приложение, выполнив следующую команду:

    python AddTagsAndQuery.py
    

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

    Снимок экрана: первый запрос, показывающий все устройства в Redmond.

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

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

  1. В командной строке в рабочем каталоге установите пакет SDK устройства Центра Интернета вещей Azure для Python:

    pip install azure-iot-device
    
  2. В текстовом редакторе создайте файл ReportConnectivity.py.

  3. Добавьте следующий код, чтобы импортировать необходимые модули из пакета SDK устройства.

    import time
    from azure.iot.device import IoTHubModuleClient
    
  4. Добавьте следующий код. Замените значение заполнителя [IoTHub Device Connection String] строкой подключения устройства, которую вы видели при регистрации устройства в Центре Интернета вещей:

    CONNECTION_STRING = "[IoTHub Device Connection String]"
    
  5. Добавьте следующий код в файл ReportConnectivity.py, чтобы создать экземпляр и реализовать функциональные возможности двойника устройства:

    def create_client():
        # Instantiate client
        client = IoTHubModuleClient.create_from_connection_string(CONNECTION_STRING)
    
        # Define behavior for receiving twin desired property patches
        def twin_patch_handler(twin_patch):
            print("Twin patch received:")
            print(twin_patch)
    
        try:
            # Set handlers on the client
            client.on_twin_desired_properties_patch_received = twin_patch_handler
        except:
            # Clean up in the event of failure
            client.shutdown()
    
        return client
    
  6. Добавьте следующий код в конце файла ReportConnectivity.py, чтобы запустить приложение:

    def main():
        print ( "Starting the Python IoT Hub Device Twin device sample..." )
        client = create_client()
        print ( "IoTHubModuleClient waiting for commands, press Ctrl-C to exit" )
    
        try:
            # Update reported properties with cellular information
            print ( "Sending data as reported property..." )
            reported_patch = {"connectivity": "cellular"}
            client.patch_twin_reported_properties(reported_patch)
            print ( "Reported properties updated" )
    
            # Wait for program exit
            while True:
                time.sleep(1000000)
        except KeyboardInterrupt:
            print ("IoT Hub Device Twin device sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
    if __name__ == '__main__':
        main()
    
  7. Запустите приложение устройства:

    python ReportConnectivity.py
    

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

    Обновление сообщаемых свойств с помощью приложения устройства

  8. Теперь, когда устройство сообщило сведения о подключении, оно должно появиться в обоих запросах. Вернитесь обратно и повторно запустите запросы:

    python AddTagsAndQuery.py
    

    На этот раз идентификатор {Device ID} должен появиться в результатах обоих запросов.

    Второй запрос в приложении службы

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

    Получение требуемых свойств в приложении устройства

Работая с этой статьей, вы выполните следующие задачи:

  • Добавлены метаданные устройства в виде тегов из внутреннего приложения
  • передача сведений о возможности подключения устройства в двойнике устройства;
  • Запросил сведения о двойниках устройства с помощью языка запросов Центр Интернета вещей

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

Ознакомьтесь со следующими материалами.