[SKKU DT] 61일차 -Azure Digital Twin 실습(3), Postman

2024. 1. 26. 18:19SKKU DT

728x90
반응형

TAM-SAM-SOM

TAM : Total Addressable Market

전체시장으로 제품/서비스의 카테고리 영억을 포함하는 비즈니스 도메인 크기

SAM : Service Available Market

유효시장이라고 하며, TAM 내의 스타트업이 추구하는 비즈니스 시장 규모

SOM : Service Obtainable Market

SOM은 수익시장이라고 하며, 유효시장 내에서 초기 단계에 확보 가능한 시장 규모


 

이전 글에 이어서, DigitalTwinsManager 스크립트에 CreateDigitalTwin 함수를 주목한다. 아래와 같이 스크립트하고,

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 void CreateModel(string path)
        {
            using var modelStreamReader = new StreamReader(path);
            string dtdl = modelStreamReader.ReadToEnd();
            string[] dtdls = new string[] { dtdl };
            client.CreateModels(dtdls);
        }
        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;
        }
        public bool UpdateDigitalTwin(string twinId, string property, object value)
        {
            try
            {
                BasicDigitalTwin digitalTwin = client.GetDigitalTwin<BasicDigitalTwin>(twinId);
                digitalTwin.Contents[property] = value;
                client.CreateOrReplaceDigitalTwin<BasicDigitalTwin>(twinId, digitalTwin);
            }
            catch (RequestFailedException)
            {
                return false;
            }
            return true;
        }
        public void UpdateDigitalTwinProperty(string twinId, string property, object value)
        {
            JsonPatchDocument patch = null;
            try
            {
                patch = new JsonPatchDocument();
                patch.AppendAdd("/" + property, value);
                client.UpdateDigitalTwin(twinId, patch);
            }
            catch (RequestFailedException)
            {
            }
            patch = new JsonPatchDocument();
            patch.AppendReplace("/" + property, value);
            client.UpdateDigitalTwin(twinId, patch);
        }
    }
}

 

Program.cs 스크립트를 아래처럼 작성하고,

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

namespace SmartBuildingConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DigitalTwinsManager dtHelper = new DigitalTwinsManager();
            dtHelper.UpdateDigitalTwinProperty("GroundFloor", "floornumber", 1);
            dtHelper.UpdateDigitalTwinProperty("GroundFloor", "lightson", true);
        }
    }
}

 

Floor에 [Create a Twin]으로 GroundFloor를 하나 만들면, 위의 코드를 실행했을 때 floornumber와 lightson의 정보가 들어가게 된다. 그리고 chapter5안에 floor.json도 있어야 한다.

{
    "@id": "dtmi:com:smartbuilding:Floor;1",
    "@type": "Interface",
    "@context": "dtmi:dtdl:context;2",
    "displayName": "Floor",
    "contents": [
        {
            "@type": "Property",
            "name": "floornumber",
            "schema": "integer",
            "writable": false
        },
        {
            "@type": "Property",
            "name": "lightson",
            "schema": "boolean",
            "writable": true
        }
    ]
}

 

 


 

 

chapter5에 building.json모델 추가

{
    "@id": "dtmi:com:smartbuilding:Building;1",
    "@type": "Interface",
    "@context": "dtmi:dtdl:context;2",
    "displayName": "Building",
    "contents": [
        {
            "@type": "Property",
            "name": "rooms",
            "writable": true,
            "schema": {
                "@type": "Map",
                "mapKey": {
                    "name": "roomname",
                    "schema": "string"
                },
                "mapValue": {
                    "name": "roomtemperature",
                    "schema": "float"
                }
            }
        }
    ]
}

 

 

Program.cs 스크립트에서 이전 building.json 모델 지우고 chapter5에 넣은 새로운 building.json으로 create한다. 성공적으로 되었다면 Model updated가 출력된다.

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

namespace SmartBuildingConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DigitalTwinsManager dtHelper = new DigitalTwinsManager();
            string[] paths = new string[] {
"Models/chapter5/building.json"
};
            dtHelper.DeleteModel("dtmi:com:smartbuilding:Building;1");
            dtHelper.CreateModels(paths);
            Console.WriteLine("Model updated");
        }
    }
}

 

그리고 Building 모델에 [Create a Twin]으로 MainBuilding이름의 Twin 생성

 

Program.cs 스크립트를 아래와 같이 작성하고 실행하면, Dictionary 정보들이 보이게 된다.

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

namespace SmartBuildingConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DigitalTwinsManager dtHelper = new DigitalTwinsManager();
            var map = new Dictionary<string, float>();
            map.Add("MeetingRoom101", 21.3f);
            map.Add("MeetingRoom102", 22.1f);
            map.Add("MeetingRoom103", 20.9f);
            dtHelper.UpdateDigitalTwinProperty("MainBuilding", "rooms", map);
        }
    }
}

 

 


 

 

Explorer 상단의 SELECT 부분은, SQL이기 때문에 해당 언어를 사용해서 데이터를 표시할 수 있다.

 

 


 

 

Azure Digital Twin Postman 활용

https://github.com/Azure/azure-rest-api-specs/blob/master/specification/digitaltwins/resource-manager/Microsoft.DigitalTwins/stable/2020-12-01/digitaltwins.json

위의 링크에서 json을 다운로드 받는다.

 

이후 Postman을 열고 [New] 버튼으로 새 Workspace를 만들고, [Import]로 위에서 받은 json 파일을 드래그 앤 드랍 한다.

 

 

PowerShell을 관리자 권한으로 열 후 아래를 입력해서 key를 받는다.

az account get-access-token --resource https://management.azure.com/

 

 

Postman에서 [Authorization] - [Token] 부분에 토큰 입력

 

 

Azure Portal에서 아래의 경로로 들어간 후 구독 ID를 복사해서 Postman에 붙여넣는다.

 

 

아래의 resourceGroupName에는 리소스 그룹 이름을 넣는다.

 

 

그리고 Send 버튼을 누르면 json 결과물이 나온다.

 

 


 

 

밑에 json도 받아서 Postman에 import 한다.

https://github.com/Azure/azure-rest-api-specs/blob/master/specification/digitaltwins/resource-manager/Microsoft.DigitalTwins/stable/2020-10-31/digitaltwins.json

 

토큰 받아오고, 출력된 토큰 값을 복사해 Postman에서 토큰 입력

az account get-access-token --resource 0b07f429-9f4b-4714-9392-cc5e8e80c8b0

 

 

호스트 이름 복사해서 Postman에 붙여넣기

 

 

Send를 눌렀지만 오류...

728x90
반응형