Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Устройство IoT Plug and Play реализует модель, описанную схемой языка определения Цифровых двойников (DTDL ). Модель описывает набор компонентов, свойств, команд и сообщений телеметрии, которые может иметь конкретное устройство.
Замечание
DTDL не является эксклюзивным для IoT Plug and Play. Другие службы Интернета вещей, такие как Azure Digital Twins, используют его для представления целых сред, таких как здания и энергетические сети.
Пакеты SDK службы Интернета вещей Azure включают API- интерфейсы, позволяющие службе взаимодействовать с цифровым двойником устройства. Например, служба может считывать свойства устройства из цифрового двойника или использовать цифровой двойник для вызова команды на устройстве. Дополнительные сведения см. в примерах цифровых двойников Центра Интернета вещей.
Пример устройства IoT Plug and Play в этой статье реализует модель контроллера температуры, которая имеет компоненты термостата.
Двойники устройств и цифровые двойники
Наряду с цифровым двойником Центр Интернета вещей Azure также поддерживает двойник устройства для каждого подключенного устройства. Двойник устройства схож с цифровым двойником тем, что он представляет собой свойства устройства. Узел Интернета вещей инициализирует цифровой двойник и двойник устройства при первом развертывании устройства IoT Plug and Play. Пакеты SDK службы Интернета вещей Azure включают API для взаимодействия с двойниками устройств.
Двойники устройств — это документы JSON, в которых хранятся сведения о состоянии устройства, включая метаданные, конфигурации и условия. Дополнительные сведения см. в примерах клиентов службы Центра Интернета вещей. Построители устройств и решений могут использовать один и тот же набор API двойников устройств и пакеты SDK для реализации устройств и решений с помощью соглашений IoT Plug and Play. В двойнике устройства состояние записываемого свойства распределяется по нужным свойствам и разделам сообщаемых свойств . Все свойства, доступные только для чтения, доступны в разделе сообщаемых свойств.
API цифровых двойников работают на высокоуровневых конструкциях DTDL, таких как компоненты, свойства и команды, и упрощают создание решений IoT Plug and Play. В цифровом двойнике присутствует единое представление текущего и требуемого состояния объекта. Состояние синхронизации для данного свойства хранится в соответствующем разделе компонента $metadata по умолчанию.
Пример JSON цифрового двойника устройства
В следующем фрагменте кода показан двойник устройства IoT Plug and Play, отформатированный как объект JSON:
{
"deviceId": "sample-device",
"modelId": "dtmi:com:example:TemperatureController;1",
"version": 15,
"properties": {
"desired": {
"thermostat1": {
"__t": "c",
"targetTemperature": 21.8
},
"$metadata": {...},
"$version": 4
},
"reported": {
"serialNumber": "alwinexlepaho8329",
"thermostat1": {
"maxTempSinceLastReboot": 25.3,
"__t": "c",
"targetTemperature": {
"value": 21.8,
"ac": 200,
"ad": "Successfully executed patch",
}
},
"$metadata": {...},
"$version": 11
}
}
}
Пример цифрового двойника
В следующем фрагменте кода показан цифровой двойник, отформатированный как объект JSON:
{
"$dtId": "sample-device",
"serialNumber": "alwinexlepaho8329",
"thermostat1": {
"maxTempSinceLastReboot": 25.3,
"targetTemperature": 21.8,
"$metadata": {
"targetTemperature": {
"desiredValue": 21.8,
"desiredVersion": 4,
"ackVersion": 4,
"ackCode": 200,
"ackDescription": "Successfully executed patch",
"lastUpdateTime": "2020-07-17T06:11:04.9309159Z"
},
"maxTempSinceLastReboot": {
"lastUpdateTime": "2020-07-17T06:10:31.9609233Z"
}
}
},
"$metadata": {
"$model": "dtmi:com:example:TemperatureController;1",
"serialNumber": {
"lastUpdateTime": "2020-07-17T06:10:31.9609233Z"
}
}
}
В следующей таблице описаны поля в объекте JSON цифрового двойника:
| Имя поля | Описание |
|---|---|
$dtId |
Указанная пользователем строка, представляющая идентификатор цифрового двойника устройства. |
{propertyName} |
Значение свойства в ФОРМАТЕ JSON. |
$metadata.$model |
[Необязательно] Идентификатор интерфейса модели, характеризующего этот цифровой двойник. |
$metadata.{propertyName}.desiredValue |
[Только для доступных для записи свойств] Требуемое значение указанного свойства. |
$metadata.{propertyName}.desiredVersion |
[Только для доступных для записи свойств] Версия требуемого значения, поддерживаемого Центром Интернета вещей. |
$metadata.{propertyName}.ackVersion |
[Обязательный, только для записываемых свойств] Версия, подтвержденная устройством, реализующим цифровой двойник, должна быть больше или равна требуемой версии. |
$metadata.{propertyName}.ackCode |
[Обязательный, только для записываемых свойств] Код, ack возвращаемый приложением устройства, реализующим цифровой двойник. |
$metadata.{propertyName}.ackDescription |
[Необязательно, только для записываемых свойств] Описание ack, возвращаемое приложением устройства, которое реализует цифровой двойник. |
$metadata.{propertyName}.lastUpdateTime |
Центр Интернета вещей поддерживает метку времени последнего обновления свойства устройством. Метки времени находятся в формате UTC и кодируются ISO8601 в формате YYYY-MM-DDTHH:MM:SS.mmmZ. |
{componentName} |
Объект JSON, содержащий значения и метаданные свойства компонента. |
{componentName}.{propertyName} |
Значение свойства компонента в ФОРМАТЕ JSON. |
{componentName}.$metadata |
Сведения о метаданных компонента. |
Свойства
Свойства — это поля данных, представляющие состояние сущности так же, как свойства во многих объектно-ориентированных языках программирования.
Свойство только для чтения
Схема DTDL:
{
"@type": "Property",
"name": "serialNumber",
"displayName": "Serial Number",
"description": "Serial number of the device.",
"schema": "string"
}
В этом примере alwinexlepaho8329 — это текущее значение свойства serialNumber, доступного только для чтения, которое сообщается устройством.
В следующих фрагментах кода дано параллельное представление свойства serialNumber в формате JSON.
Двойник устройства
"properties": {
"reported": {
"serialNumber": "alwinexlepaho8329"
}
}
Цифровой двойник
"serialNumber": "alwinexlepaho8329"
Свойство для записи
В следующих примерах показано свойство, допускаемое для записи, в компоненте по умолчанию.
DTDL:
{
"@type": "Property",
"name": "fanSpeed",
"displayName": "Fan Speed",
"writable": true,
"schema": "double"
}
Двойник устройства
{
"properties": {
"desired": {
"fanSpeed": 2.0,
},
"reported": {
"fanSpeed": {
"value": 3.0,
"ac": 200,
"av": 1,
"ad": "Successfully executed patch version 1"
}
}
},
}
Цифровой двойник
{
"fanSpeed": 3.0,
"$metadata": {
"fanSpeed": {
"desiredValue": 2.0,
"desiredVersion": 2,
"ackVersion": 1,
"ackCode": 200,
"ackDescription": "Successfully executed patch version 1",
"lastUpdateTime": "2020-07-17T06:10:31.9609233Z"
}
}
}
В этом примере используется текущее значение 3.0 свойства, fanSpeed сообщаемого устройством.
2.0 — требуемое значение, заданное решением. Требуемое значение и состояние синхронизации свойства корневого уровня устанавливается в корневом уровне $metadata для цифрового двойника. Когда устройство подключено, оно может применить это обновление и сообщить об обновленном значении.
Components
Компоненты позволяют создавать интерфейс модели как сборку других интерфейсов. Например, интерфейс Thermostat можно включить в качестве компонентов thermostat1 и thermostat2 в модель Temperature Controller.
В цифровом двойнике устройства маркер { "__t": "c"} определяет компонент. В цифровом двойнике наличие $metadata обозначает компонент.
В этом примере thermostat1 используется компонент с двумя свойствами:
- Свойство
maxTempSinceLastRebootявляется доступным только для чтения. -
targetTemperature— это доступное для записи свойство, которое было успешно синхронизировано устройством. Требуемое значение и состояние синхронизации этих свойств находятся в компоненте$metadata.
В следующих фрагментах кода показано сравнительное представление thermostat1 компонента в формате JSON.
Двойник устройства
"properties": {
"desired": {
"thermostat1": {
"__t": "c",
"targetTemperature": 21.8
},
"$metadata": {
},
"$version": 4
},
"reported": {
"thermostat1": {
"maxTempSinceLastReboot": 25.3,
"__t": "c",
"targetTemperature": {
"value": 21.8,
"ac": 200,
"ad": "Successfully executed patch",
"av": 4
}
},
"$metadata": {
},
"$version": 11
}
}
Цифровой двойник
"thermostat1": {
"maxTempSinceLastReboot": 25.3,
"targetTemperature": 21.8,
"$metadata": {
"targetTemperature": {
"desiredValue": 21.8,
"desiredVersion": 4,
"ackVersion": 4,
"ackCode": 200,
"ackDescription": "Successfully executed patch",
"lastUpdateTime": "2020-07-17T06:11:04.9309159Z"
},
"maxTempSinceLastReboot": {
"lastUpdateTime": "2020-07-17T06:10:31.9609233Z"
}
}
}
API цифровых двойников
API цифровых двойников включают операции Get Digital Twin, Update Digital Twin, Invoke Component Command и Invoke Command для управления цифровым двойником. Интерфейсы REST API можно использовать напрямую или через один из пакетов SDK службы.
События изменений цифровых двойников
При включении событий изменения цифрового двойника событие активируется всякий раз, когда текущее или требуемое значение компонента или свойства изменяется. События изменений цифровых двойников создаются в формате JSON Patch. Соответствующие события создаются в формате двойника устройства, если включены события изменения двойника.
Сведения о том, как включить маршрутизацию для событий устройств и цифровых двойников, см. в статье "Использование маршрутизации сообщений Центра Интернета вещей" для отправки сообщений из устройства в облако в разные конечные точки. Сведения о формате сообщения см. в статье "Создание и чтение сообщений Центра Интернета вещей".
Например, следующее событие изменения цифрового двойника активируется, когда решение задает значение targetTemperature.
iothub-connection-device-id:sample-device
iothub-enqueuedtime:7/17/2020 6:11:04 AM
iothub-message-source:digitalTwinChangeEvents
correlation-id:275d463fa034
content-type:application/json-patch+json
content-encoding:utf-8
[
{
"op": "add",
"path": "/thermostat1/$metadata/targetTemperature",
"value": {
"desiredValue": 21.8,
"desiredVersion": 4
}
}
]
Следующее событие изменения цифрового двойника активируется, когда устройство сообщает, что было применено предыдущее требуемое изменение:
iothub-connection-device-id:sample-device
iothub-enqueuedtime:7/17/2020 6:11:05 AM
iothub-message-source:digitalTwinChangeEvents
correlation-id:275d464a2c80
content-type:application/json-patch+json
content-encoding:utf-8
[
{
"op": "add",
"path": "/thermostat1/$metadata/targetTemperature/ackCode",
"value": 200
},
{
"op": "add",
"path": "/thermostat1/$metadata/targetTemperature/ackDescription",
"value": "Successfully executed patch"
},
{
"op": "add",
"path": "/thermostat1/$metadata/targetTemperature/ackVersion",
"value": 4
},
{
"op": "add",
"path": "/thermostat1/$metadata/targetTemperature/lastUpdateTime",
"value": "2020-07-17T06:11:04.9309159Z"
},
{
"op": "add",
"path": "/thermostat1/targetTemperature",
"value": 21.8
}
]
Замечание
Сообщения уведомлений об изменении цифровых двойников удваиваются при включении как уведомлений об изменении устройства, так и цифрового двойника.