[SKKU DT] 59일차 -Azure Digital Twin 실습

2024. 1. 24. 12:57SKKU DT

728x90
반응형

Node.js 설치

맞는 버전을 설치하기 위해서 LTS 버전이 아닌 14.15.4버전을 설치한다.

 

Node.js — Node v14.15.4 (LTS)

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

잘 설치가 되었다면 PowerShell을 관리자 권한으로 열었을 때 node -v를 입력하면 버전이 나온다.

 

 

아래의 샘플을 받아서 압축을 푼다.

 

GitHub - Azure-Samples/digital-twins-explorer: A code sample for visualizing Azure Digital Twins graphs as a web application to

A code sample for visualizing Azure Digital Twins graphs as a web application to create, edit, view, and diagnose digital twins, models, and relationships. - GitHub - Azure-Samples/digital-twins-ex...

github.com

 

 

압축 푼 경로로 들어가서 아래와 같은 순서를 밟는다. npm install을 치면 설치가 쭉 된다.

 

 

az login으로 azure에 로그인한다. 로그인이 잘 되었다면 웹페이지에 You have logged!라고 뜬다.

 

 

az account list --output table을 입력하면 정보를 볼 수 있다.

 

 

npm start run을 입력하고 되지 않는다면 아래의 코드를 입력한다.

$env:NODE_OPTIONS="--max-old-space-size=8192"

성공하면, 아래의 화면이 나온다.

 

 

호스트 이름 copy 해서 바로 위 사진의 Azure Digital Twins URL에 https://와 함께 입력한다.

 

 

Upload a Model을 누른 후 examples 아래의 모든 파일을 선택해서 올린다.

 

 

Import graph 버튼 클릭,

 

 

distributionGrid.xlsx 파일 열기

 

 

열면 아래의 그림이 나온다. 오른쪽 위 저장 버튼을 누르면 Import Successful 팝업이 뜬다.

 

 

Run Query 후 Model Graph 누르면 관계도를 볼 수 있다.

 

 


 

 

모델 생성하기 -Visual Studio

콘솔 앱 새 프로젝트 만들기

 

 

솔루션 탐색기에서 오른쪽 버튼, [NuGet 패키지 관리] 선택

솔루션 탐색기가 없다면 위쪽 탭에서 [보기]에서 솔루션 탐색기를 찾을 수 있다.

 

 

찾아보기 탭에서 검색하여 Azure.Identity 설치

-Azure ID용 Azure SDK 클라이언트 라이브러리의 구현이며 어플리케이션에서 Azure Digital Twins 인스턴스에 연결하는 데에 사용된다.

 

 

Azure.DigitalTwins.Core 설치

-Azure Digital Twins 서비스를 빌드한다.

 

 

새 폴더 추가, DigitalTwins로 이름 바꾸기

 

 

폴더에 클래스 추가, 이름은 DigitalTwinsManager

 

 

DigitalTwinsManager 코드 작성, "<Azure Digital Twins Instance URL>" 부분의 자신의 호스트 네임을 입력한다. 꺾쇠 지우고 URL 넣기

using Azure.DigitalTwins.Core;
using Azure.Identity;
using System;
using System.IO;
namespace SmartBuildingConsoleApp.DigitalTwins
{
    public class DigitalTwinsManager
    {
        private static readonly string adtInstanceUrl = "<Azure Digital Twins Instance URL>";
        private DigitalTwinsClient client;
        public DigitalTwinsManager()
        {
            Connect();
        }
        public void Connect()
        {
            var cred = new DefaultAzureCredential();
            client = new DigitalTwinsClient(new Uri(adtInstanceUrl), cred);
        }

        public void CreateModel(string path)
        {
            using var modelStreamReader = new StreamReader(path);
            string dtdl = modelStreamReader.ReadToEnd();
            string[] dtdls = new string[] { dtdl };
            client.CreateModels(dtdls);
        }

    }
}

위 화면에서 호스트 이름을 볼 수 있다.

 

 

Programs.cs에는 아래의 코드를 넣는다.

using SmartBuildingConsoleApp.DigitalTwins;
using System;

namespace SmartBuildingConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DigitalTwinsManager dtHelper = new DigitalTwinsManager();
            // TODO

            string path = "Models/Chapter4/room.json";
            dtHelper.CreateModel(path);
        }
    }
}

 

 

폴더 하나 더 추가, Models로 이름 변경

 

 

밑에 chapter4 이름의 폴더를 만들고, 그 안에 새 항목 추가. 이름은 room.json이다.

 

room.json 코드는 아래와 같고, 트리 구성도 아래를 참고하면 된다.

{
    "@id": "dtmi:com:smartbuilding:Room;1",
    "@type": "Interface",
    "@context": "dtmi:dtdl:context;2",
    "displayName": "Room"
}

 

 

room.json 파일에서 오른쪽 마우스를 누르고 [속성] 메뉴를 열면 [출력 디렉터리로 복사] 항목이 있는데, [항상 복사]로 바꾼다.

 

 


 

 

다시 Azure Digital Twin Explorer 웹페이지에서, 이미 넣었던 모델들을 지워야 한다.

 

 

다시 Visual Studio로 돌아와서 디버그하지 않고 시작을 누른다.

 

 

잘 되었다면 웹페이지 상에 Room 모델이 생긴다.

 

 

DigitalTwinsManager 스크립트의 CreateModel 함수 부분을 업데이트 한다.

using Azure;
using Azure.DigitalTwins.Core;
using Azure.Identity;
using System;
using System.IO;
namespace SmartBuildingConsoleApp.DigitalTwins
{
    public class DigitalTwinsManager
    {
        private static readonly string adtInstanceUrl = "https://DTBDigitalTwins12.api.krc.digitaltwins.azure.net";
        private DigitalTwinsClient client;
        public DigitalTwinsManager()
        {
            Connect();
        }
        public void Connect()
        {
            var cred = new DefaultAzureCredential();
            client = new DigitalTwinsClient(new Uri(adtInstanceUrl), cred);
        }

        public bool CreateModel(string path)
        {
            return CreateModels(new string[] { path });
        }
        public bool CreateModels(string[] path)
        {
            List<string> dtdls = new List<string>();
            foreach (string p in path)
            {
                using var modelStreamReader = new StreamReader(p);
                string dtdl = modelStreamReader.ReadToEnd();
                dtdls.Add(dtdl);
            }
            try
            {
                DigitalTwinsModelData[] models = client.CreateModels(dtdls.ToArray());
            }
            catch (RequestFailedException)
            {
                return false;
            }
            return true;
        }

    }
}

 

 

아래의 링크에서 지난 글에서 받았던 zip파일이 있는데 없다면 다시 다운받고,

 

GitHub - PacktPublishing/Hands-on-Azure-Digital-Twins: Hands-on Azure Digital Twins, published by Packt

Hands-on Azure Digital Twins, published by Packt. Contribute to PacktPublishing/Hands-on-Azure-Digital-Twins development by creating an account on GitHub.

github.com

압축되어있는 chapter4 나머지 json도 끌어다가 프로젝트 폴더에 복사해서 넣는다.

 

 

Program.cs를 다음과 같이 업데이트,

using SmartBuildingConsoleApp.DigitalTwins;
using System;

namespace SmartBuildingConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DigitalTwinsManager dtHelper = new DigitalTwinsManager();
            // TODO
            
            string[] paths = new string[] {
                "Models/chapter4/campus.json",
                "Models/chapter4/building.json",
                "Models/chapter4/floor.json",
                "Models/chapter4/workarea.json",
                "Models/chapter4/sensor.json",
                "Models/chapter4/meetingroom.json"
            };
            dtHelper.CreateModels(paths);
        }
    }
}

 

 

추가된 json은 [항상 복사]로 수정한다.

 

 

디버그하지 않고 시작하면 Azure Digital Twin Explorer에 다른 모델도 뜬다.

 


 

 

 DigitalTwinsManager 스크립트의 맨 아래에 DeleteModel() 함수를 추가하고,

using Azure;
using Azure.DigitalTwins.Core;
using Azure.Identity;
using System;
using System.IO;
namespace SmartBuildingConsoleApp.DigitalTwins
{
    public class DigitalTwinsManager
    {
        private static readonly string adtInstanceUrl = "https://DTBDigitalTwins12.api.krc.digitaltwins.azure.net";
        private DigitalTwinsClient client;
        public DigitalTwinsManager()
        {
            Connect();
        }
        public void Connect()
        {
            var cred = new DefaultAzureCredential();
            client = new DigitalTwinsClient(new Uri(adtInstanceUrl), cred);
        }

        public bool CreateModel(string path)
        {
            return CreateModels(new string[] { path });
        }
        public bool CreateModels(string[] path)
        {
            List<string> dtdls = new List<string>();
            foreach (string p in path)
            {
                using var modelStreamReader = new StreamReader(p);
                string dtdl = modelStreamReader.ReadToEnd();
                dtdls.Add(dtdl);
            }
            try
            {
                DigitalTwinsModelData[] models = client.CreateModels(dtdls.ToArray());
            }
            catch (RequestFailedException)
            {
                return false;
            }
            return true;
        }

        public void DeleteModel(string modelId)
        {
            client.DeleteModel(modelId);
        }
    }
}

 

 

Program.cs 스크립트에는 이전 것을 주석처리하고 한 줄을 추가한다.

using SmartBuildingConsoleApp.DigitalTwins;
using System;

namespace SmartBuildingConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DigitalTwinsManager dtHelper = new DigitalTwinsManager();
            // TODO
            /*
            string[] paths = new string[] {
                "Models/chapter4/campus.json",
                "Models/chapter4/building.json",
                "Models/chapter4/floor.json",
                "Models/chapter4/workarea.json",
                "Models/chapter4/sensor.json",
                "Models/chapter4/meetingroom.json"
            };
            dtHelper.CreateModels(paths);
            */
            dtHelper.DeleteModel("dtmi:com:smartbuilding:Meetingroom;1");
        }
    }
}

 

 

실행하면, Meetingroom 모델이 Explorer 상에서 없어진다.

 

 

DigitalTwinsManager 스크립트에 GetModel 함수 추가

using Azure;
using Azure.DigitalTwins.Core;
using Azure.Identity;
using System;
using System.IO;
namespace SmartBuildingConsoleApp.DigitalTwins
{
    public class DigitalTwinsManager
    {
        private static readonly string adtInstanceUrl = "https://DTBDigitalTwins12.api.krc.digitaltwins.azure.net";
        private DigitalTwinsClient client;
        public DigitalTwinsManager()
        {
            Connect();
        }
        public void Connect()
        {
            var cred = new DefaultAzureCredential();
            client = new DigitalTwinsClient(new Uri(adtInstanceUrl), cred);
        }

        public bool CreateModel(string path)
        {
            return CreateModels(new string[] { path });
        }
        public bool CreateModels(string[] path)
        {
            List<string> dtdls = new List<string>();
            foreach (string p in path)
            {
                using var modelStreamReader = new StreamReader(p);
                string dtdl = modelStreamReader.ReadToEnd();
                dtdls.Add(dtdl);
            }
            try
            {
                DigitalTwinsModelData[] models = client.CreateModels(dtdls.ToArray());
            }
            catch (RequestFailedException)
            {
                return false;
            }
            return true;
        }
        
        public void DeleteModel(string modelId)
        {
            client.DeleteModel(modelId);
        }

        public DigitalTwinsModelData GetModel(string modelId)
        {
            try
            {
                return client.GetModel(modelId);
            }
            catch (RequestFailedException)
            {
                return null;
            }
        }
    }
}

 

 

Program.cs 스크립트에도 GetModel 관련 코드 추가

using Azure.DigitalTwins.Core;
using SmartBuildingConsoleApp.DigitalTwins;
using System;

namespace SmartBuildingConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DigitalTwinsManager dtHelper = new DigitalTwinsManager();
            // TODO
            /*
            string[] paths = new string[] {
                "Models/chapter4/campus.json",
                "Models/chapter4/building.json",
                "Models/chapter4/floor.json",
                "Models/chapter4/workarea.json",
                "Models/chapter4/sensor.json",
                "Models/chapter4/meetingroom.json"
            };
            dtHelper.CreateModels(paths);
            */
            //dtHelper.DeleteModel("dtmi:com:smartbuilding:Meetingroom;1");

            DigitalTwinsModelData model = dtHelper.GetModel("dtmi:com:smartbuilding:Room;1");
            Console.WriteLine(model.Id);
            Console.WriteLine(model.LanguageDisplayNames["en"]);
        }
    }
}

 

 

실행하면 아래처럼 출력값이 뜬다.

 

 


 

 

DigitalTwinsManager 스크립트 맨 밑에 함수 추가

using Azure;
using Azure.DigitalTwins.Core;
using Azure.Identity;
using System;
using System.IO;
namespace SmartBuildingConsoleApp.DigitalTwins
{
    public class DigitalTwinsManager
    {
        private static readonly string adtInstanceUrl = "https://DTBDigitalTwins12.api.krc.digitaltwins.azure.net";
        private DigitalTwinsClient client;
        public DigitalTwinsManager()
        {
            Connect();
        }
        public void Connect()
        {
            var cred = new DefaultAzureCredential();
            client = new DigitalTwinsClient(new Uri(adtInstanceUrl), cred);
        }

        public bool CreateModel(string path)
        {
            return CreateModels(new string[] { path });
        }
        public bool CreateModels(string[] path)
        {
            List<string> dtdls = new List<string>();
            foreach (string p in path)
            {
                using var modelStreamReader = new StreamReader(p);
                string dtdl = modelStreamReader.ReadToEnd();
                dtdls.Add(dtdl);
            }
            try
            {
                DigitalTwinsModelData[] models = client.CreateModels(dtdls.ToArray());
            }
            catch (RequestFailedException)
            {
                return false;
            }
            return true;
        }
        
        public void DeleteModel(string modelId)
        {
            client.DeleteModel(modelId);
        }

        public DigitalTwinsModelData GetModel(string modelId)
        {
            try
            {
                return client.GetModel(modelId);
            }
            catch (RequestFailedException)
            {
                return null;
            }
        }

        public Pageable<DigitalTwinsModelData> GetModels()
        {
            GetModelsOptions options = new GetModelsOptions();
            return client.GetModels(options);
        }
    }
}

 

Program.cs 스크립트에도 관련 코드 추가

using Azure.DigitalTwins.Core;
using SmartBuildingConsoleApp.DigitalTwins;
using System;

namespace SmartBuildingConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DigitalTwinsManager dtHelper = new DigitalTwinsManager();
            // TODO
            /*
            string[] paths = new string[] {
                "Models/chapter4/campus.json",
                "Models/chapter4/building.json",
                "Models/chapter4/floor.json",
                "Models/chapter4/workarea.json",
                "Models/chapter4/sensor.json",
                "Models/chapter4/meetingroom.json"
            };
            dtHelper.CreateModels(paths);
            */
            //dtHelper.DeleteModel("dtmi:com:smartbuilding:Meetingroom;1");
            /*
            DigitalTwinsModelData model = dtHelper.GetModel("dtmi:com:smartbuilding:Room;1");
            Console.WriteLine(model.Id);
            Console.WriteLine(model.LanguageDisplayNames["en"]);
            */
            var models = dtHelper.GetModels();
            foreach (DigitalTwinsModelData model in models)
            {
                Console.WriteLine(model.Id);
                Console.WriteLine(model.LanguageDisplayNames["en"]);
            }
        }
    }
}

 

결과값 출력

 

 


 

 

Digital Twin Instance 관리

DigitalTwinsManager 스크립트에서 맨 밑의 내용 추가

using Azure;
using Azure.DigitalTwins.Core;
using Azure.Identity;
using System;
using System.IO;
namespace SmartBuildingConsoleApp.DigitalTwins
{
    public class DigitalTwinsManager
    {
        private static readonly string adtInstanceUrl = "https://DTBDigitalTwins12.api.krc.digitaltwins.azure.net";
        private DigitalTwinsClient client;
        public DigitalTwinsManager()
        {
            Connect();
        }
        public void Connect()
        {
            var cred = new DefaultAzureCredential();
            client = new DigitalTwinsClient(new Uri(adtInstanceUrl), cred);
        }

        public bool CreateModel(string path)
        {
            return CreateModels(new string[] { path });
        }
        public bool CreateModels(string[] path)
        {
            List<string> dtdls = new List<string>();
            foreach (string p in path)
            {
                using var modelStreamReader = new StreamReader(p);
                string dtdl = modelStreamReader.ReadToEnd();
                dtdls.Add(dtdl);
            }
            try
            {
                DigitalTwinsModelData[] models = client.CreateModels(dtdls.ToArray());
            }
            catch (RequestFailedException)
            {
                return false;
            }
            return true;
        }
        
        public void DeleteModel(string modelId)
        {
            client.DeleteModel(modelId);
        }

        public DigitalTwinsModelData GetModel(string modelId)
        {
            try
            {
                return client.GetModel(modelId);
            }
            catch (RequestFailedException)
            {
                return null;
            }
        }

        public Pageable<DigitalTwinsModelData> GetModels()
        {
            GetModelsOptions options = new GetModelsOptions();
            return client.GetModels(options);
        }

        public bool CreateDigitalTwin(string twinId, string modelId)
        {
            BasicDigitalTwin digitalTwin = new BasicDigitalTwin();
            digitalTwin.Metadata = new DigitalTwinMetadata();
            digitalTwin.Metadata.ModelId = modelId;
            digitalTwin.Id = twinId;
            try
            {
                client.CreateOrReplaceDigitalTwin<BasicDigitalTwin>(twinId, digitalTwin);
            }
            catch (RequestFailedException)
            {
                return false;
            }
            return true;
        }
    }
}

 

Programs 스크립트에서 맨 아래 내용 추가

using Azure.DigitalTwins.Core;
using SmartBuildingConsoleApp.DigitalTwins;
using System;

namespace SmartBuildingConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DigitalTwinsManager dtHelper = new DigitalTwinsManager();
            // TODO
            /*
            string[] paths = new string[] {
                "Models/chapter4/campus.json",
                "Models/chapter4/building.json",
                "Models/chapter4/floor.json",
                "Models/chapter4/workarea.json",
                "Models/chapter4/sensor.json",
                "Models/chapter4/meetingroom.json"
            };
            dtHelper.CreateModels(paths);
            */
            //dtHelper.DeleteModel("dtmi:com:smartbuilding:Meetingroom;1");
            /*
            DigitalTwinsModelData model = dtHelper.GetModel("dtmi:com:smartbuilding:Room;1");
            Console.WriteLine(model.Id);
            Console.WriteLine(model.LanguageDisplayNames["en"]);
            */
            /*
            var models = dtHelper.GetModels();
            foreach (DigitalTwinsModelData model in models)
            {
                Console.WriteLine(model.Id);
                Console.WriteLine(model.LanguageDisplayNames["en"]);
            }
            */
            dtHelper.CreateDigitalTwin("Campus", "dtmi:com:smartbuilding:Campus;1");
            dtHelper.CreateDigitalTwin("MainBuilding", "dtmi:com:smartbuilding:Building;1");
            dtHelper.CreateDigitalTwin("GroundFloor", "dtmi:com:smartbuilding:Floor;1");
            dtHelper.CreateDigitalTwin("MeetingRoom1.01", "dtmi:com:smartbuilding:Meetingroom;1");
        }
    }
}

 

생성이 되었다면 Explorer에 생성된 개체들이 보인다.

728x90
반응형