Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сущности в вашей среде представлены цифровыми двойниками. Управление цифровыми двойниками может включать создание, изменение и удаление.
В этой статье рассматривается управление цифровыми двойниками; Сведения о работе с связями и графом двойников в целом см. в статье "Управление графом двойников и связями".
Tip
Все функции ПАКЕТА SDK входят в синхронные и асинхронные версии.
Prerequisites
Для работы с Azure Digital Twins в этой статье требуется экземпляр Azure Digital Twins и необходимые разрешения для его использования. Если у вас уже настроен экземпляр Azure Digital Twins, этот экземпляр можно использовать и перейти к следующему разделу. В противном случае следуйте инструкциям в разделе "Настройка экземпляра и проверка подлинности". Инструкции содержат сведения, помогающие убедиться, что каждый шаг выполнен успешно.
После настройки экземпляра запишите имя узла экземпляра. Имя узла можно найти на портале Azure.
Интерфейсы разработчика
В этой статье описывается, как выполнить различные операции управления с помощью пакета SDK для .NET (C#). Вы также можете создавать эти же вызовы управления с помощью других языковых пакетов SDK, описанных в API и пакетах SDK Azure Digital Twins.
Другие интерфейсы разработчика, которые можно использовать для выполнения этих операций, включают:
- Обозреватель Azure Digital Twins
- Вызовы REST API
- Команды Azure CLI
Visualization
Azure Digital Twins Explorer — это визуальное средство для изучения данных в графе Azure Digital Twins. Обозреватель можно использовать для просмотра, запроса и редактирования моделей, двойников и связей.
Дополнительные сведения о средстве Azure Digital Twins Explorer см. в azure Digital Twins Explorer. Подробные инструкции по использованию ее функций см. в статье "Использование Azure Digital Twins Explorer".
Вот как выглядит визуализация:
Создание цифрового двойника
Чтобы создать двойник, используйте CreateOrReplaceDigitalTwinAsync() метод на клиенте службы следующим образом:
await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinId, initData);
Чтобы создать цифровой двойник, необходимо указать следующее:
- Значение идентификатора, которое необходимо назначить цифровому двойнику (вы определяете этот идентификатор при создании двойника)
- Модель, которую вы хотите использовать
- Любая требуемая инициализация данных двойника, включая...
- Свойства (необязательное инициализация): можно задать начальные значения для свойств цифрового двойника, если требуется. Свойства обрабатываются как необязательные и могут быть заданы позже, но обратите внимание, что они не будут отображаться как часть двойника, пока они не будут заданы.
- Компоненты (инициализация требуется, если они присутствуют в двойниках): если двойник содержит какие-либо компоненты, эти компоненты необходимо инициализировать при создании двойника. Они могут быть пустыми объектами, но сами компоненты должны существовать.
Модель и все начальные значения свойств предоставляются с помощью initData параметра, которая представляет собой строку JSON, содержащую соответствующие данные. Дополнительные сведения о структурированию этого объекта см. в следующем разделе.
Tip
После создания или обновления двойника может возникнуть задержка до 10 секунд, прежде чем изменения будут отражены в запросах. API GetDigitalTwin (описанный далее в этой статье) не испытывает этой задержки, поэтому если вам нужен мгновенный ответ, используйте вызов API вместо запроса, чтобы просмотреть только что созданные двойники.
Инициализация модели и свойств
Вы можете инициализировать свойства двойника во время создания двойника.
API создания двойника принимает объект, сериализованный в допустимое описание свойств двойника. Сведения о формате JSON для двойника см. в разделе "Цифровые двойники" и графа двойников .
Во-первых, можно создать объект данных для представления двойника и его данных свойств. Объект параметра можно создать вручную или с помощью предоставленного вспомогательного класса. Ниже приведен пример каждого из них.
Создание двойников с помощью созданных вручную данных
Без использования пользовательских вспомогательных классов можно представить свойства двойника в том Dictionary<string, object>месте, где string имя свойства и объект, представляющий свойство и object его значение.
// Define a custom model type for the twin to be created
internal class CustomDigitalTwin
{
[JsonPropertyName(DigitalTwinsJsonPropertyNames.DigitalTwinId)]
public string Id { get; set; }
[JsonPropertyName(DigitalTwinsJsonPropertyNames.DigitalTwinETag)]
public string ETag { get; set; }
[JsonPropertyName("temperature")]
public double Temperature { get; set; }
[JsonPropertyName("humidity")]
public double Humidity{ get; set; }
}
// Initialize properties and create the twin
public class TwinOperationsCreateTwin
{
public async Task CreateTwinAsync(DigitalTwinsClient client)
{
// Initialize the twin properties
var myTwin = new CustomDigitalTwin
{
Temperature = 25.0,
Humidity = 50.0,
};
// Create the twin
const string twinId = "<twin-ID>";
Response<CustomDigitalTwin> response = await client.CreateOrReplaceDigitalTwinAsync(twinId, myTwin);
Console.WriteLine($"Temperature value: {response.Value.Temperature}");
}
}
Создание двойников с помощью вспомогательного класса
Вспомогательный класс BasicDigitalTwin позволяет хранить поля свойств непосредственно в объекте twin. Возможно, вам по-прежнему нужно создать список свойств с помощью Dictionary<string, object>объекта двойника, который затем можно добавить в объект двойника как его CustomProperties напрямую.
string twinId = "myTwinID";
var initData = new BasicDigitalTwin
{
Id = twinId,
Metadata = { ModelId = "dtmi:example:Room;1" },
// Initialize properties
Contents =
{
{ "Temperature", 25.0 },
{ "Humidity", 50.0 },
},
};
await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinId, initData);
Note
BasicDigitalTwin объекты приходят с полем Id . Это поле можно оставить пустым, но если вы добавите значение идентификатора, оно должно соответствовать параметру идентификатора, переданного вызову CreateOrReplaceDigitalTwinAsync() . Рассмотрим пример.
twin.Id = "myRoomId";
Создание двойников в массовом режиме с помощью API импорта заданий
API импорта заданий можно использовать для создания нескольких двойников одновременно в одном вызове API. Этот метод требует использования хранилища BLOB-объектов Azure и разрешений на запись в экземпляре Azure Digital Twins для двойников и массовых заданий.
Tip
API заданий импорта также позволяет импортировать модели и связи в одном вызове для создания всех частей графа одновременно. Дополнительные сведения об этом процессе см. в статье "Отправка моделей, двойников и связей" в массовом режиме с помощью API импорта заданий.
Для массового импорта двойников необходимо структурировать двойники (и любые другие ресурсы, включенные в задание массового импорта) в виде файла NDJSON . Раздел Twins приходит после Models раздела (и перед разделом Relationships ). Двойники, определенные в файле, могут ссылаться на модели, определенные в этом файле или уже присутствующих в экземпляре. Двойники, определенные в файле, могут включать инициализацию свойств двойника.
Вы можете просмотреть пример файла импорта и пример проекта для создания этих файлов в введение в API заданий импорта.
Затем файл необходимо передать в добавочный большой двоичный объект в хранилище BLOB-объектов Azure. Инструкции по созданию контейнера хранилища Azure см. в статье "Создание контейнера". Затем отправьте файл с помощью предпочтительного метода отправки (некоторые параметры — команда AzCopy, Azure CLI или портал Azure).
После отправки файла NDJSON в контейнер получите его URL-адрес в BLOB-контейнере. Это значение используется позже в тексте вызова API массового импорта.
Ниже приведен снимок экрана, показывающий значение URL-адреса файла BLOB-объекта на портале Azure:
Затем файл можно использовать в вызове API импорта заданий . Вы предоставляете URL-адрес хранилища BLOB-объектов входного файла и новый URL-адрес хранилища BLOB-объектов, чтобы указать, где должен храниться выходной журнал после создания службы.
Получение данных для цифрового двойника
Вы можете получить доступ к деталям любого цифрового двойника, вызвав GetDigitalTwin() метод следующим образом:
Response<BasicDigitalTwin> twinResponse = await client.GetDigitalTwinAsync<BasicDigitalTwin>(twinId);
twin = twinResponse.Value;
Этот вызов возвращает данные двойника как строго типизированный тип объекта, например BasicDigitalTwin.
BasicDigitalTwin — вспомогательный класс сериализации, включенный в пакет SDK, который возвращает метаданные и свойства основных двойников в предварительно подготовленных формах. Вы всегда можете десериализировать данные двойников с помощью выбранной библиотеки JSON, например System.Text.Json или Newtonsoft.Json. Однако для базового доступа к двойнику вспомогательные классы могут упростить десериализацию данных двойников.
Note
BasicDigitalTwin использует System.Text.Json атрибуты. Для использования BasicDigitalTwin с DigitalTwinsClient необходимо либо инициализировать клиент с помощью конструктора по умолчанию, либо, если вы хотите настроить параметр сериализатора, используйте JsonObjectSerializer.
Вспомогательный BasicDigitalTwin класс также предоставляет доступ к свойствам, определенным в двойнику, через Dictionary<string, object>класс. Для перечисления свойств двойника можно использовать следующее:
BasicDigitalTwin twin;
Response<BasicDigitalTwin> twinResponse = await client.GetDigitalTwinAsync<BasicDigitalTwin>(twinId);
twin = twinResponse.Value;
Console.WriteLine($"Model id: {twin.Metadata.ModelId}");
foreach (string prop in twin.Contents.Keys)
{
if (twin.Contents.TryGetValue(prop, out object value))
Console.WriteLine($"Property '{prop}': {value}");
}
При извлечении двойника с методом возвращаются только свойства, заданные по крайней GetDigitalTwin() мере один раз.
Tip
Для displayName двойника является частью метаданных модели, поэтому он не отображается при получении данных для экземпляра двойника. Чтобы увидеть это значение, его можно получить из модели.
Чтобы получить несколько двойников с помощью одного вызова API, ознакомьтесь с примерами API запросов в графе двойников.
Рассмотрим следующую модель (написанную на языке определения Digital Twins (DTDL)), которая определяет Луну:
{
"@id": "dtmi:example:Moon;1",
"@type": "Interface",
"@context": "dtmi:dtdl:context;3",
"contents": [
{
"@type": "Property",
"name": "radius",
"schema": "double",
"writable": true
},
{
"@type": "Property",
"name": "mass",
"schema": "double",
"writable": true
}
]
}
Результат вызова object result = await client.GetDigitalTwinAsync("my-moon"); двойника типа Луны может выглядеть следующим образом:
{
"$dtId": "myMoon-001",
"$etag": "W/\"e59ce8f5-03c0-4356-aea9-249ecbdc07f9\"",
"radius": 1737.1,
"mass": 0.0734,
"$metadata": {
"$model": "dtmi:example:Moon;1",
"radius": {
"lastUpdateTime": "2022-12-06T20:00:32.8209188Z"
},
"mass": {
"lastUpdateTime": "2022-12-04T12:04:43.3859361Z"
}
}
}
Определенные свойства цифрового двойника возвращаются как свойства верхнего уровня в цифровом двойнике. Метаданные или системные сведения, которые не являются частью $ определения DTDL, возвращаются с префиксом. Свойства метаданных включают следующие значения:
-
$dtId: идентификатор цифрового двойника в этом экземпляре Azure Digital Twins -
$etag: стандартное поле HTTP, назначенное веб-сервером. Это свойство обновляется до нового значения при каждом обновлении двойника, которое может быть полезно, чтобы определить, обновляются ли данные двойника на сервере с момента предыдущей проверки. Вы можете использовать для выполнения обновлений и удалений, которые выполняютсяIf-Matchтолько в том случае, если etag сущности соответствует предоставленному etag. Дополнительные сведения об этих операциях см. в документации по обновлению DigitalTwins и DigitalTwins Delete. -
$metadata: набор свойств метаданных, которые могут содержать следующие свойства:-
$model, DTMI модели цифрового двойника. -
lastUpdateTimeдля свойств двойника. Это свойство представляет собой метку времени, указывающую дату и время обработки сообщения об обновлении свойства Azure Digital Twins. -
sourceTimeдля свойств двойника. Это свойство является необязательным, записываемым свойством, представляющим метку времени, когда обновление свойства наблюдалось в реальном мире.
-
Дополнительные сведения о полях, содержащихся в цифровом двойнике в формате JSON цифрового двойника. Дополнительные сведения о вспомогательных классах сериализации, таких как BasicDigitalTwin в API и пакетах SDK для Azure Digital Twins.
Просмотр всех цифровых двойников
Чтобы просмотреть все цифровые двойники в вашем экземпляре, используйте запрос. Запрос можно выполнять с помощью API-интерфейсов запросов или команд CLI.
Ниже приведен текст базового запроса, который возвращает список всех цифровых двойников в экземпляре:
SELECT * FROM DIGITALTWINS
Обновление цифрового двойника
Чтобы обновить свойства цифрового двойника, напишите сведения, которые необходимо заменить в формате исправления JSON . Полный список операций исправления JSON, которые можно использовать, включая replaceи addremove, см. в разделе "Операции для исправления JSON".
После создания документа исправления JSON, содержащего сведения об обновлении, передайте документ в UpdateDigitalTwin() метод:
await client.UpdateDigitalTwinAsync(twinId, updateTwinData);
Один вызов исправления может обновлять столько свойств в одном двойнике, сколько вы хотите (даже все из них). Если необходимо обновить свойства для нескольких двойников, вам потребуется отдельный вызов обновления для каждого двойника.
Tip
После создания или обновления двойника может возникнуть задержка до 10 секунд, прежде чем изменения будут отражены в запросах. API GetDigitalTwin (описанный ранее в этой статье) не испытывает этой задержки, поэтому используйте вызов API вместо запроса, чтобы просмотреть обновленные двойники, если вам нужен мгновенный ответ.
Ниже приведен пример кода исправления JSON. Этот документ заменяет значения свойств массы и радиуса цифрового двойника. В этом примере показана операция исправления replace JSON, которая заменяет значение существующего свойства.
[
{
"op": "replace",
"path": "/mass",
"value": 0.0799
},
{
"op": "replace",
"path": "/radius",
"value": 0.800
}
]
При обновлении двойника из проекта кода с помощью пакета SDK для .NET можно создать исправления JSON с помощью JsonPatchDocument пакета SDK Для Azure .NET. Ниже приведен пример создания документа исправления JSON и использования UpdateDigitalTwin() в коде проекта.
var updateTwinData = new JsonPatchDocument();
updateTwinData.AppendAdd("/Temperature", 25.0);
updateTwinData.AppendAdd("/myComponent/Property", "Hello");
// Un-set a property
updateTwinData.AppendRemove("/Humidity");
await client.UpdateDigitalTwinAsync("myTwin", updateTwinData).ConfigureAwait(false);
Tip
Вы можете поддерживать метки времени источника в цифровых двойниках, обновив $metadata.<property-name>.sourceTime поле с помощью процесса, описанного в этом разделе. Дополнительные сведения об этом поле и других полях, доступных для записи в цифровых двойниках, см. в формате JSON цифрового двойника.
Обновление вложенных свойств в компонентах цифрового двойника
Помните, что модель может содержать компоненты, позволяя ей состоять из других моделей.
Чтобы исправить свойства в компонентах цифрового двойника, можно использовать синтаксис пути в исправлении JSON:
[
{
"op": "replace",
"path": "/mycomponentname/mass",
"value": 0.0799
}
]
Обновление вложенных свойств в свойствах типа объекта
Модели могут содержать свойства, которые относятся к типу объекта. Эти объекты могут иметь собственные свойства, и может потребоваться обновить одно из этих вложенных свойств, принадлежащих свойству типа объекта. Этот процесс аналогичен процессу обновления вложенных свойств в компонентах, но может потребовать некоторых дополнительных шагов.
Рассмотрим модель со свойством типа объекта. ObjectProperty
ObjectProperty имеет строковое свойство с именем StringSubProperty.
При создании двойника с помощью этой модели не требуется создавать экземпляры ObjectProperty в то время. Если свойство объекта не создается во время создания двойника, путь по умолчанию не создается для доступа ObjectProperty и его StringSubProperty для операции исправления. Прежде чем обновлять его свойства, необходимо добавить путь к ObjectProperty себе.
Это можно сделать с помощью операции исправления add JSON, как показано ниже.
[
{
"op": "add",
"path": "/ObjectProperty",
"value": {"StringSubProperty":"<string-value>"}
}
]
Note
Если ObjectProperty имеется несколько свойств, их следует включить в value поле этой операции, даже если вы обновляете только один из них:
... "value": {"StringSubProperty":"<string-value>", "Property2":"<property2-value>", ...}
После этого добавления один раз путь к StringSubProperty существу и его можно обновить непосредственно с помощью обычной replace операции:
[
{
"op": "replace",
"path": "/ObjectProperty/StringSubProperty",
"value": "<string-value>"
}
]
Хотя первый шаг не требуется в тех случаях, когда ObjectProperty был создан двойник, рекомендуется использовать его каждый раз при первом обновлении дочернего свойства, так как вы не всегда знаете, было ли изначально создано свойство объекта.
Обновление модели цифрового двойника
Функцию UpdateDigitalTwin() также можно использовать для переноса цифрового двойника в другую модель.
Например, рассмотрим следующий документ с исправлениями JSON, заменяющий поле метаданных $model цифрового двойника:
[
{
"op": "replace",
"path": "/$metadata/$model",
"value": "dtmi:example:foo;1"
}
]
Эта операция выполняется только в том случае, если цифровой двойник, измененный исправлением, соответствует новой модели.
Рассмотрим следующий пример:
- Представьте себе цифровой двойник с моделью foo_old. foo_old определяет необходимую массу свойств.
- Новая модель foo_new определяет массу свойств и добавляет новую необходимую температуру свойств.
- После исправления цифровой двойник должен иметь как свойство массы, так и температуры.
Исправление для этой ситуации необходимо обновить как модель, так и свойство температуры двойника, как показано ниже.
[
{
"op": "replace",
"path": "/$metadata/$model",
"value": "dtmi:example:foo_new;1"
},
{
"op": "add",
"path": "/temperature",
"value": 60
}
]
Обновление исходного времени свойства
При необходимости можно выбрать использование sourceTime поля в свойствах двойника для записи меток времени при наблюдении обновлений свойств в реальном мире. Azure Digital Twins изначально поддерживается sourceTime в метаданных для каждого свойства двойника. Значение sourceTime должно соответствовать формату даты и времени ISO 8601. Дополнительные сведения об этом поле и других полях цифровых двойников см. в формате JSON цифрового двойника.
Минимальная стабильная версия REST API для поддержки этого поля — версия 2022-05-31 . Чтобы работать с этим полем с помощью пакетов SDK для Azure Digital Twins, рекомендуется использовать последнюю версию пакета SDK, чтобы убедиться, что это поле включено.
Ниже приведен пример документа с исправлением JSON, который обновляет значение и sourceTime поле Temperature свойства:
[
{
"op": "replace",
"path": "/Temperature",
"value": "22.3"
},
{
"op": "replace",
"path": "/$metadata/Temperature/sourceTime",
"value": "2021-11-30T18:47:53.7648958Z"
}
]
Чтобы обновить sourceTime поле в свойстве, которое является частью компонента, включите компонент в начало пути. В предыдущем примере компонент будет включаться, изменив значение пути на /$metadata/Temperature/sourceTimemyComponent/$metadata/Temperature/sourceTime.
Note
Если вы обновляете sourceTime и значение свойства, а затем обновляете только значение свойства, sourceTime метка времени первого обновления остается.
Обработка конфликтующих вызовов обновления
Azure Digital Twins гарантирует, что все входящие запросы обрабатываются последовательно, один за другим. Эта последовательная обработка означает, что даже если несколько функций пытаются обновить одно и то же свойство в двойнике одновременно, вам не нужно писать явный код блокировки для обработки конфликта.
Это поведение выполняется на основе двойников.
Например, представьте сценарий, в котором эти три вызова приходят в одно и то же время:
- Запись свойства A в Twin1
- Запись свойства B в Twin1
- Запись свойства A в Twin2
Два вызова, изменяющие Twin1 , выполняются друг за другом, и сообщения об изменениях создаются для каждого изменения. Вызов изменения Twin2 может выполняться одновременно без конфликта, как только он поступает.
Удаление цифрового двойника
Двойники можно удалить с помощью DeleteDigitalTwin() метода. Однако вы можете удалить двойник только в том случае, если у него больше нет связей. Таким образом, сначала удалите входящие и исходящие связи двойника.
Ниже приведен пример кода для удаления двойников и их связей.
DeleteDigitalTwin Вызов пакета SDK выделен для уточнения того, где он попадает в более широкий пример контекста.
private static async Task CustomMethod_DeleteTwinAsync(DigitalTwinsClient client, string twinId)
{
await CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(client, twinId);
await CustomMethod_FindAndDeleteIncomingRelationshipsAsync(client, twinId);
try
{
await client.DeleteDigitalTwinAsync(twinId);
Console.WriteLine("Twin deleted successfully");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error:{ex.Message}");
}
}
private static async Task CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(DigitalTwinsClient client, string dtId)
{
// Find the relationships for the twin
try
{
// GetRelationshipsAsync will throw an error if a problem occurs
AsyncPageable<BasicRelationship> rels = client.GetRelationshipsAsync<BasicRelationship>(dtId);
await foreach (BasicRelationship rel in rels)
{
await client.DeleteRelationshipAsync(dtId, rel.Id).ConfigureAwait(false);
Console.WriteLine($"Deleted relationship {rel.Id} from {dtId}");
}
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting relationships for {dtId} due to {ex.Message}");
}
}
private static async Task CustomMethod_FindAndDeleteIncomingRelationshipsAsync(DigitalTwinsClient client, string dtId)
{
// Find the relationships for the twin
try
{
// GetRelationshipsAsync will throw an error if a problem occurs
AsyncPageable<IncomingRelationship> incomingRels = client.GetIncomingRelationshipsAsync(dtId);
await foreach (IncomingRelationship incomingRel in incomingRels)
{
await client.DeleteRelationshipAsync(incomingRel.SourceId, incomingRel.RelationshipId).ConfigureAwait(false);
Console.WriteLine($"Deleted incoming relationship {incomingRel.RelationshipId} from {dtId}");
}
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting incoming relationships for {dtId} due to {ex.Message}");
}
}
Удаление всех цифровых двойников
Пример удаления всех двойников одновременно скачайте пример приложения, используемого в разделе "Изучение основных возможностей" с примером клиентского приложения. Файл CommandLoop.cs удаляет все цифровые двойники в CommandDeleteAllTwins() функции.
Note
Если вы хотите удалить все модели, двойники и связи в экземпляре одновременно, используйте API удаления заданий.
Пример кода запускаемого цифрового двойника
Следующий пример кода можно использовать для создания двойника, обновления сведений и удаления двойника.
Настройка примеров файлов проекта
Фрагмент кода использует пример определения модели Room.json. Чтобы скачать файл модели , чтобы его можно было использовать в коде, используйте эту ссылку, чтобы перейти непосредственно к файлу в GitHub. Затем щелкните правой кнопкой мыши в любом месте экрана, выберите "Сохранить как в меню правой кнопкой мыши" браузера и используйте окно "Сохранить как", чтобы сохранить файл как Room.json.
Затем создайте проект консольного приложения в Visual Studio или в выбранном редакторе.
Затем скопируйте следующий код запускаемого примера в проект:
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using Azure;
using Azure.DigitalTwins.Core;
using Azure.Identity;
using System.IO;
namespace DigitalTwins_Samples
{
class TwinOperationsSample
{
public static async Task Main(string[] args)
{
Console.WriteLine("Hello World!");
// Create the Azure Digital Twins client for API calls
string adtInstanceUrl = "https://<your-instance-hostname>";
var credentials = new DefaultAzureCredential();
var client = new DigitalTwinsClient(new Uri(adtInstanceUrl), credentials);
Console.WriteLine($"Service client created – ready to go");
// Upload models
Console.WriteLine($"Upload a model");
string dtdl = File.ReadAllText("<path-to>/Room.json");
var models = new List<string> { dtdl };
// Upload the model to the service
await client.CreateModelsAsync(models);
// Create new digital twin
// <CreateTwin_withHelper>
string twinId = "myTwinID";
var initData = new BasicDigitalTwin
{
Id = twinId,
Metadata = { ModelId = "dtmi:example:Room;1" },
// Initialize properties
Contents =
{
{ "Temperature", 25.0 },
{ "Humidity", 50.0 },
},
};
// <CreateTwinCall>
await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinId, initData);
// </CreateTwinCall>
// </CreateTwin_withHelper>
Console.WriteLine("Twin created successfully");
//Print twin
Console.WriteLine("--- Printing twin details:");
await CustomMethod_FetchAndPrintTwinAsync(twinId, client);
Console.WriteLine("--------");
//Update twin data
var updateTwinData = new JsonPatchDocument();
updateTwinData.AppendAdd("/Temperature", 30.0);
// <UpdateTwinCall>
await client.UpdateDigitalTwinAsync(twinId, updateTwinData);
// </UpdateTwinCall>
Console.WriteLine("Twin properties updated");
Console.WriteLine();
//Print twin again
Console.WriteLine("--- Printing twin details (after update):");
await CustomMethod_FetchAndPrintTwinAsync(twinId, client);
Console.WriteLine("--------");
Console.WriteLine();
//Delete twin
await CustomMethod_DeleteTwinAsync(client, twinId);
}
private static async Task<BasicDigitalTwin> CustomMethod_FetchAndPrintTwinAsync(string twinId, DigitalTwinsClient client)
{
// <GetTwin>
BasicDigitalTwin twin;
// <GetTwinCall>
Response<BasicDigitalTwin> twinResponse = await client.GetDigitalTwinAsync<BasicDigitalTwin>(twinId);
twin = twinResponse.Value;
// </GetTwinCall>
Console.WriteLine($"Model id: {twin.Metadata.ModelId}");
foreach (string prop in twin.Contents.Keys)
{
if (twin.Contents.TryGetValue(prop, out object value))
Console.WriteLine($"Property '{prop}': {value}");
}
// </GetTwin>
return twin;
}
// <DeleteTwin>
private static async Task CustomMethod_DeleteTwinAsync(DigitalTwinsClient client, string twinId)
{
await CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(client, twinId);
await CustomMethod_FindAndDeleteIncomingRelationshipsAsync(client, twinId);
try
{
await client.DeleteDigitalTwinAsync(twinId);
Console.WriteLine("Twin deleted successfully");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error:{ex.Message}");
}
}
private static async Task CustomMethod_FindAndDeleteOutgoingRelationshipsAsync(DigitalTwinsClient client, string dtId)
{
// Find the relationships for the twin
try
{
// GetRelationshipsAsync will throw an error if a problem occurs
AsyncPageable<BasicRelationship> rels = client.GetRelationshipsAsync<BasicRelationship>(dtId);
await foreach (BasicRelationship rel in rels)
{
await client.DeleteRelationshipAsync(dtId, rel.Id).ConfigureAwait(false);
Console.WriteLine($"Deleted relationship {rel.Id} from {dtId}");
}
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting relationships for {dtId} due to {ex.Message}");
}
}
private static async Task CustomMethod_FindAndDeleteIncomingRelationshipsAsync(DigitalTwinsClient client, string dtId)
{
// Find the relationships for the twin
try
{
// GetRelationshipsAsync will throw an error if a problem occurs
AsyncPageable<IncomingRelationship> incomingRels = client.GetIncomingRelationshipsAsync(dtId);
await foreach (IncomingRelationship incomingRel in incomingRels)
{
await client.DeleteRelationshipAsync(incomingRel.SourceId, incomingRel.RelationshipId).ConfigureAwait(false);
Console.WriteLine($"Deleted incoming relationship {incomingRel.RelationshipId} from {dtId}");
}
}
catch (RequestFailedException ex)
{
Console.WriteLine($"*** Error {ex.Status}/{ex.ErrorCode} retrieving or deleting incoming relationships for {dtId} due to {ex.Message}");
}
}
// </DeleteTwin>
}
}
Note
В настоящее время существует известная проблема, влияющая на DefaultAzureCredential класс оболочки, которая может привести к ошибке при проверке подлинности. При возникновении этой проблемы можно попробовать создать экземпляр DefaultAzureCredential с помощью следующего необязательного параметра, чтобы устранить эту проблему: new DefaultAzureCredential(new DefaultAzureCredentialOptions { ExcludeSharedTokenCacheCredential = true });
Дополнительные сведения об этой проблеме см. в статье об известных проблемах Azure Digital Twins.
Настройка проекта
Затем выполните следующие действия, чтобы настроить код проекта:
Добавьте файлRoom.json , скачанный ранее в проект, и замените
<path-to>заполнитель в коде, чтобы сообщить программе, где его найти.Замените заполнитель
<your-instance-hostname>именем узла экземпляра Azure Digital Twins.Добавьте две зависимости в проект, необходимые для работы с Azure Digital Twins. Первый — это пакет для пакета SDK Azure Digital Twins для .NET, а второй — средства для проверки подлинности в Azure.
dotnet add package Azure.DigitalTwins.Core dotnet add package Azure.Identity
Кроме того, необходимо настроить локальные учетные данные, если вы хотите запустить пример напрямую. В следующем разделе описаны предварительные требования.
Настройка локальных учетных данных Azure
В этом примере используется DefaultAzureCredential (часть Azure.Identity библиотеки) для проверки подлинности с помощью экземпляра Azure Digital Twins при запуске примера на локальном компьютере.
DefaultAzureCredential — это один из многих вариантов проверки подлинности. Дополнительные сведения о различных способах проверки подлинности клиентского приложения с помощью Azure Digital Twins см. в разделе "Запись кода проверки подлинности приложения".
В DefaultAzureCredentialэтом примере выполняется поиск учетных данных в локальной среде, таких как вход Azure в локальную среду КОМАНДНОй строки Azure или Visual Studio Code. По этой причине вы должны войти в Azure локально с помощью одного из этих механизмов, чтобы настроить учетные данные для примера.
Если вы используете Visual Studio или Visual Studio Code для выполнения примеров кода, убедитесь, что вы вошли в этот редактор с теми же учетными данными Azure, которые вы хотите использовать для доступа к экземпляру Azure Digital Twins. Если вы используете локальное окно CLI, выполните az login команду, чтобы войти в учетную запись Azure. После входа в пример кода выполняется автоматическая проверка подлинности при запуске.
Запуск примера
После завершения установки можно запустить пример проекта кода.
Ниже приведены выходные данные консоли предыдущей программы:
Дальнейшие шаги
Узнайте, как создавать связи между цифровыми двойниками и управлять ими: