Работа с Azure Digital Twin — код клиентского приложения


В этой статье я буду использовать DT для Digital Twin.

Предварительные условия

  • знания о Azure DT

  • Любой редактор кода (предпочтительнее VS Code, и вам не нужно устанавливать .NET Core)

  • Установленный .NET Core

  • Создан экземпляр Azure DT

Начало работы

Настройка проекта

Самое первое — это создание минимального проекта на C# в созданной директории:

mkdir new-dt
cd new-dt
dotnet new console
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем вы хотите добавить две зависимости в ваш проект: одна — это пакет для Azure DT SDK для .NET, а другая — инструменты для управления аутентификацией:

dotnet add package Azure.DigitalTwins.Core
dotnet add package Azure.Identity
Вход в полноэкранный режим Выход из полноэкранного режима

Затем мы добавим следующие две части кода в Program.cs для добавления необходимых зависимостей и функциональности аутентификации:

Добавьте это сверху

using Azure.DigitalTwins.Core;
using Azure.Identity;
Войти в полноэкранный режим Выйти из полноэкранного режима

И добавьте это ниже строки ‘hello world’ в методе Main, и не забудьте установить значение adtInstanceUrl в имя хоста вашего экземпляра:

string adtInstanceUrl = "https://<your-Azure-Digital-Twins-instance-hostName>"; 

var credential = new DefaultAzureCredential();
var client = new DigitalTwinsClient(new Uri(adtInstanceUrl), credential);
Console.WriteLine($"Service client created – ready to go");
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь мы можем сохранить проект (или лучше зафиксировать в git) и выполнить приведенную ниже команду, чтобы проверить нашу предыдущую работу:

dotnet run
Войти в полноэкранный режим Выйти из полноэкранного режима

Если не возникнет ошибок, консоль выведет следующее:

Загрузка модели

Мы можем создавать модели, используя Digital Twins Definition Language (DTDL, язык, похожий на язык программирования ООП).

Создадим новый файл с именем SampleModel.json и вставим в него следующий код:

{
  "@id": "dtmi:example:SampleModel;1",
  "@type": "Interface",
  "displayName": "SampleModel",
  "contents": [
    {
      "@type": "Relationship",
      "name": "contains"
    },
    {
      "@type": "Property",
      "name": "data",
      "schema": "string"
    }
  ],
  "@context": "dtmi:dtdl:context;2"
}
Войти в полноэкранный режим Выйти из полноэкранного режима

После этого необходимо добавить остальной код в Program.cs для взаимодействия с экземпляром DT (включая ранее вставленный код):

using System;
// <Azure_Digital_Twins_dependencies>
using Azure.DigitalTwins.Core;
using Azure.Identity;
// </Azure_Digital_Twins_dependencies>
// <Model_dependencies>
using System.Threading.Tasks;
using System.IO;
using System.Collections.Generic;
using Azure;
// </Model_dependencies>
// <Query_dependencies>
using System.Text.Json;
// </Query_dependencies>

namespace DigitalTwins_Samples
{
    class DigitalTwinsClientAppSample
    {
        // <Async_signature>
        static async Task Main(string[] args)
        {
        // </Async_signature>
            Console.WriteLine("Hello World!");
            // <Authentication_code>
            string adtInstanceUrl = "https://<your-Azure-Digital-Twins-instance-hostName>"; 

            var credential = new DefaultAzureCredential();
            var client = new DigitalTwinsClient(new Uri(adtInstanceUrl), credential);
            Console.WriteLine($"Service client created – ready to go");
            // </Authentication_code>

            // <Model_code>
            Console.WriteLine();
            Console.WriteLine("Upload a model");
            string dtdl = File.ReadAllText("SampleModel.json");
            var models = new List<string> { dtdl };

            // Upload the model to the service
            // <Model_try_catch>
            try
            {
                await client.CreateModelsAsync(models);
                Console.WriteLine("Models uploaded to the instance:");
            }
            catch (RequestFailedException e)
            {
                Console.WriteLine($"Upload model error: {e.Status}: {e.Message}");
            }
            // </Model_try_catch>

            // <Print_model>
            // Read a list of models back from the service
            AsyncPageable<DigitalTwinsModelData> modelDataList = client.GetModelsAsync();
            await foreach (DigitalTwinsModelData md in modelDataList)
            {
                Console.WriteLine($"Model: {md.Id}");
            }
            // </Print_model>
            // </Model_code>

            // <Initialize_twins>
            var twinData = new BasicDigitalTwin();
            twinData.Metadata.ModelId = "dtmi:example:SampleModel;1";
            twinData.Contents.Add("data", $"Hello World!");

            string prefix = "sampleTwin-";
            for (int i = 0; i < 3; i++)
            {
                try
                {
                    twinData.Id = $"{prefix}{i}";
                    await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinData.Id, twinData);
                    Console.WriteLine($"Created twin: {twinData.Id}");
                }
                catch(RequestFailedException e)
                {
                    Console.WriteLine($"Create twin error: {e.Status}: {e.Message}");
                }
            }
            // </Initialize_twins>

            // <Use_create_relationship>
            // Connect the twins with relationships
            await CreateRelationshipAsync(client, "sampleTwin-0", "sampleTwin-1");
            await CreateRelationshipAsync(client, "sampleTwin-0", "sampleTwin-2");
            // </Use_create_relationship>

            // <Use_list_relationships>
            //List the relationships
            await ListRelationshipsAsync(client, "sampleTwin-0");
            // </Use_list_relationships>

            // <Query_twins>
            // Run a query for all twins
            string query = "SELECT * FROM digitaltwins";
            AsyncPageable<BasicDigitalTwin> queryResult = client.QueryAsync<BasicDigitalTwin>(query);

            await foreach (BasicDigitalTwin twin in queryResult)
            {
                Console.WriteLine(JsonSerializer.Serialize(twin));
                Console.WriteLine("---------------");
            }
            // </Query_twins>
        }

        // <Create_relationship>
        public async static Task CreateRelationshipAsync(DigitalTwinsClient client, string srcId, string targetId)
        {
            var relationship = new BasicRelationship
            {
                TargetId = targetId,
                Name = "contains"
            };

            try
            {
                string relId = $"{srcId}-contains->{targetId}";
                await client.CreateOrReplaceRelationshipAsync(srcId, relId, relationship);
                Console.WriteLine("Created relationship successfully");
            }
            catch (RequestFailedException e)
            {
                Console.WriteLine($"Create relationship error: {e.Status}: {e.Message}");
            }
        }
        // </Create_relationship>

        // <List_relationships>
        public async static Task ListRelationshipsAsync(DigitalTwinsClient client, string srcId)
        {
            try
            {
                AsyncPageable<BasicRelationship> results = client.GetRelationshipsAsync<BasicRelationship>(srcId);
                Console.WriteLine($"Twin {srcId} is connected to:");
                await foreach (BasicRelationship rel in results)
                {
                    Console.WriteLine($" -{rel.Name}->{rel.TargetId}");
                }
            }
            catch (RequestFailedException e)
            {
                Console.WriteLine($"Relationship retrieval error: {e.Status}: {e.Message}");
            }
        }
        // </List_relationships>
    }
}
Войти в полноэкранный режим Выйдите из полноэкранного режима

Теперь вы должны взаимодействовать со своими цифровыми двойниками, используя dotnet run.

Часть результата

Hello World!
Клиент сервиса создан — готов к работе

Загрузка модели
Модели загружены в экземпляр:
Модель: dtmi:example:Floor;1
Модель: dtmi:example:Room;1
Модель: dtmi:example:SampleModel;1
Созданный двойник: sampleTwin-0
Созданный близнец: sampleTwin-1
Создан близнец: sampleTwin-2
Созданные отношения успешно
Отношения созданы успешно
Близнец sampleTwin-0 соединен с:
-contains->sampleTwin-1
-contains->sampleTwin-2
….

Ссылки

Код клиентского приложения
https://docs.microsoft.com/en-us/azure/digital-twins/tutorial-code
Изображение обложки
https://www.ciobulletin.com/cloud/azure-digital-twins-generally-available

Оцените статью
devanswers.ru
Добавить комментарий