Использование моделей IoT Plug and Play в решении IoT

В этой статье описывается, как в решении IoT можно определить идентификатор модели для устройства IoT Plug and Play, а затем получить его определение модели.

Существует две широкие категории решения Интернета вещей:

  • Специально созданное решение работает с известным набором моделей для устройств Интернета вещей самонастраивающийся, которые подключаются к решению. Эти модели используются при разработке решения.

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

Чтобы использовать модель IoT Plug and Play, решение IoT выполняет следующее:

  1. Определяет идентификатор модели, реализуемой устройством IoT Plug and Play, модулем или модулем IoT Edge, подключенным к решению.

  2. Использует идентификатор модели для получения определения модели подключенного устройства из репозитория модели или пользовательского хранилища.

Определение идентификатора модели

Когда устройство IoT Plug and Play подключается к центру Интернета вещей, оно регистрирует идентификатор модели, которую оно реализует с помощью Центра Интернета вещей.

Центр Интернета вещей уведомляет решение об идентификаторе модели устройства в рамках потока подключения устройства.

Решение может получить идентификатор модели для устройства IoT Plug and Play с помощью одного из следующих трех методов:

API получения двойника устройства

Решение может использовать API Get Device Twin для получения идентификатора модели для устройства IoT Plug and Play.

Совет

Для модулей и модулей IoT Edge используйте ModuleClient.getTwin.

В следующем фрагменте ответа от двойника устройства в modelId содержится идентификатор модели для устройства IoT Plug and Play:

{
    "deviceId": "sample-device",
    "etag": "AAAAAAAAAAc=",
    "deviceEtag": "NTk0ODUyODgx",
    "status": "enabled",
    "statusUpdateTime": "0001-01-01T00:00:00Z",
    "connectionState": "Disconnected",
    "lastActivityTime": "2020-07-17T06:12:26.8402249Z",
    "cloudToDeviceMessageCount": 0,
    "authenticationType": "sas",
    "x509Thumbprint": {
        "primaryThumbprint": null,
        "secondaryThumbprint": null
    },
    "modelId": "dtmi:com:example:TemperatureController;1",
    "version": 15,
    "properties": {...}
    }
}

API получения цифрового двойника

Решение может использовать API Get Digital Twin для получения идентификатора модели, реализованной устройством IoT Plug and Play.

В следующем фрагменте ответа от цифрового двойника в $metadata.$model содержится идентификатор модели для устройства IoT Plug and Play:

{
    "$dtId": "sample-device",
    "$metadata": {
        "$model": "dtmi:com:example:TemperatureController;1",
        "serialNumber": {
            "lastUpdateTime": "2020-07-17T06:10:31.9609233Z"
        }
    }
}

Уведомление о событии изменения цифрового двойника

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

Решение может использовать событие, показанное в следующем фрагменте кода, чтобы узнать о подключении устройства IoT Plug and Play и получить его идентификатор модели:

iothub-connection-device-id:sample-device
iothub-enqueuedtime:7/22/2020 8:02:27 PM
iothub-message-source:digitalTwinChangeEvents
correlation-id:100f322dc2c5
content-type:application/json-patch+json
content-encoding:utf-8
[
  {
    "op": "replace",
    "path": "/$metadata/$model",
    "value": "dtmi:com:example:TemperatureController;1"
  }
]

Получение определения модели

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

Решение может получить определение модели с помощью одного из следующих параметров:

Репозиторий моделей

Решения могут извлекать модели DTDL из репозитория моделей устройств (DMR). DMR — это общедоступный репозиторий, размещенная корпорацией Майкрософт, которая содержит коллекцию курируемых моделей DTDL. Модели общедоступных устройств, хранящиеся в dmR, доступны для всех пользователей, которые будут использовать и интегрировать в свои приложения из общедоступной конечной точки https://devicemodels.azure.com.

Определив идентификатор модели для подключения нового устройства, выполните следующие действия.

  1. Получите определение модели, используя идентификатор модели из репозитория моделей. Дополнительные сведения см. в разделе "Разрешение моделей".

  2. Используя определение модели подключенного устройства, можно перечислить возможности устройства.

  3. С помощью перечисленных возможностей устройства можно разрешить пользователям взаимодействовать с устройством.

Разрешение моделей

Соглашения dmR включают другие артефакты для упрощения использования размещенных моделей. Эти функции являются необязательными для пользовательских или частных репозиториев.

  • Index. Все доступные DTMIs предоставляются через индекс, состоящий из последовательности json-файлов, например:https://devicemodels.azure.com/index.page.2.json
  • Развернуто. Файл со всеми зависимостями доступен для каждого интерфейса, например: https://devicemodels.azure.com/dtmi/com/example/temperaturecontroller-1.expanded.json
  • Metadata Этот файл предоставляет ключевые атрибуты репозитория и периодически обновляется с помощью последнего опубликованного моментального снимка моделей. Он включает функции, реализующие репозиторий, такие как наличие индекса модели или расширенных файлов модели. Доступ к метаданным DMR можно получить по адресу https://devicemodels.azure.com/metadata.json

Для программного доступа к общедоступным моделям DTDL в DMR можно использовать ModelsRepositoryClient доступный в пакете NuGet Azure.IoT.ModelsRepository. Этот клиент настроен по умолчанию для запроса общедоступных репозиториев моделей устройств, доступных по адресу devicemodels.azure.com, и может быть настроен для любого пользовательского репозитория.

Клиент принимает DTMI как входные данные и возвращает словарь со всеми необходимыми интерфейсами:

using Azure.IoT.ModelsRepository;

var client = new ModelsRepositoryClient();
ModelResult models = client.GetModel("dtmi:com:example:TemperatureController;1");
models.Content.Keys.ToList().ForEach(k => Console.WriteLine(k));

Ожидаемые выходные данные отображают DTMI три интерфейса, найденные в цепочке зависимостей:

dtmi:com:example:TemperatureController;1
dtmi:com:example:Thermostat;1
dtmi:azure:DeviceManagement:DeviceInformation;1

ModelsRepositoryClient Его можно настроить для запроса настраиваемого dmR,доступного через http(s), и указать разрешение зависимостей с помощью флагаModelDependencyResolution:

  • Disabled. Возвращает только указанный интерфейс без зависимости.
  • Включен. Возвращает все интерфейсы в цепочке зависимостей

Совет

Пользовательские репозитории могут не предоставлять .expanded.json файл. Если этот файл недоступен, клиент откатится к обработке каждой зависимости локально.

В следующем примере кода показано, как инициализировать ModelsRepositoryClient его с помощью url-адреса базы пользовательского репозитория, в этом случае используя raw URL-адреса из API GitHub без использования expanded формы, так как она недоступна в конечной точке raw . AzureEventSourceListener инициализируется для проверки HTTP-запроса, выполняемого клиентом:

using AzureEventSourceListener listener = AzureEventSourceListener.CreateConsoleLogger();

var client = new ModelsRepositoryClient(
    new Uri("https://raw.githubusercontent.com/Azure/iot-plugandplay-models/main"));

ModelResult model = await client.GetModelAsync(
    "dtmi:com:example:TemperatureController;1", 
    dependencyResolution: ModelDependencyResolution.Enabled);

model.Content.Keys.ToList().ForEach(k => Console.WriteLine(k));

В репозитории GitHub пакета SDK azure доступны дополнительные примеры: Azure.Iot.ModelsRepository/samples.

Пользовательское хранилище

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

Определив идентификатор модели для подключения нового устройства, выполните следующие действия.

  1. Получите определение модели, используя идентификатор модели из пользовательского хранилища.

  2. Используя определение модели подключенного устройства, можно перечислить возможности устройства.

  3. С помощью перечисленных возможностей устройства можно разрешить пользователям взаимодействовать с устройством.

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

Теперь, когда вы узнали, как интегрировать модели IoT Plug and Play в решение IoT, ознакомьтесь с некоторыми из предлагаемых дальнейших действий: