IoT 솔루션에서 IoT 플러그 앤 플레이 모델 사용

이 문서에서는 IoT 솔루션에서 IoT 플러그 앤 플레이 디바이스의 모델 ID를 식별한 다음 해당 모델 정의를 검색하는 방법을 설명합니다.

IoT 솔루션에는 두 가지 광범위한 범주가 있습니다.

  • 특별 제작된 솔루션은 솔루션에 연결할 IoT 플러그 앤 플레이 디바이스용으로 알려진 모델 세트와 함께 작동합니다. 솔루션을 개발할 때 이러한 모델을 사용합니다.

  • 모델 기반 솔루션은 모든 IoT 플러그 앤 플레이 디바이스의 모델과 함께 작동합니다. 모델 기반 솔루션을 빌드하는 것은 더 복잡하지만 향후 추가될 수 있는 모든 디바이스에서 솔루션이 작동한다는 이점이 있습니다. 모델 기반 IoT 솔루션은 모델을 검색하고 이를 사용하여 디바이스가 구현하는 원격 분석, 속성 및 명령을 결정합니다.

IoT 플러그 앤 플레이 모델을 사용하는 IoT 솔루션:

  1. 솔루션에 연결된 IoT 플러그 앤 플레이 디바이스, 모듈 또는 IoT Edge 모듈에 의해 구현된 모델의 모델 ID를 식별합니다.

  2. 모델 ID를 사용하여 모델 리포지토리 또는 사용자 지정 저장소에서 연결된 디바이스의 모델 정의를 검색합니다.

모델 ID 식별

IoT 플러그 앤 플레이 디바이스가 IoT Hub에 연결되면 IoT Hub에 구현하는 모델의 모델 ID를 등록합니다.

IoT Hub는 디바이스 연결 흐름의 일부로 디바이스 모델 ID를 사용하여 솔루션에 알립니다.

솔루션은 다음 세 가지 방법 중 하나를 사용하여 IoT 플러그 앤 플레이 디바이스의 모델 ID를 가져올 수 있습니다.

Get Device Twin API

솔루션은 Get Device Twin API API를 사용하여 IoT 플러그 앤 플레이 디바이스의 모델 ID를 검색할 수 있습니다.

모듈 및 IoT Edge 모듈의 경우 ModuleClient.getTwin을 사용합니다.

다음 디바이스 트윈 응답 조각에서 modelId는 IoT 플러그 앤 플레이 디바이스의 모델 ID를 포함합니다.

{
    "deviceId": "sample-device",
    "etag": "AAAAAAAAAAc=",
    "deviceEtag": "NTk0ODUyODgx",
    "status": "enabled",
    "statusUpdateTime": "0001-01-01T00:00:00Z",
    "connectionState": "Disconnected",
    "lastActivityTime": "2020-07-17T06:12:26.8402249Z",
    "cloudToDeviceMessageCount": 0,
    "authenticationType": "sas",
    "x509Thumbprint": {
        "primaryThumbprint": null,
        "secondaryThumbprint": null
    },
    "modelId": "dtmi:com:example:TemperatureController;1",
    "version": 15,
    "properties": {...}
    }
}

Get Digital Twin API

솔루션은 Get Digital Twin API를 사용하여 IoT 플러그 앤 플레이 디바이스에서 구현된 모델의 모델 ID를 검색할 수 있습니다.

다음 디지털 트윈 응답 조각에서 $metadata.$model은 IoT 플러그 앤 플레이 디바이스의 모델 ID를 포함합니다.

{
    "$dtId": "sample-device",
    "$metadata": {
        "$model": "dtmi:com:example:TemperatureController;1",
        "serialNumber": {
            "lastUpdateTime": "2020-07-17T06:10:31.9609233Z"
        }
    }
}

디지털 트윈 변경 이벤트 알림

디바이스가 연결되면 디지털 트윈 변경 이벤트 알림이 표시됩니다. 솔루션은 이 이벤트 알림을 구독해야 합니다. 디지털 트윈 이벤트에 대한 라우팅을 사용하도록 설정하는 방법을 알아보려면 IoT Hub 메시지 라우팅을 사용하여 디바이스 간 메시지를 다른 엔드포인트로 보내기를 참조하세요.

솔루션은 다음 코드 조각에 표시된 이벤트를 사용하여 연결하고 해당 모델 ID를 가져오는 IoT 플러그 앤 플레이 디바이스에 대해 알아볼 수 있습니다.

iothub-connection-device-id:sample-device
iothub-enqueuedtime:7/22/2020 8:02:27 PM
iothub-message-source:digitalTwinChangeEvents
correlation-id:100f322dc2c5
content-type:application/json-patch+json
content-encoding:utf-8
[
  {
    "op": "replace",
    "path": "/$metadata/$model",
    "value": "dtmi:com:example:TemperatureController;1"
  }
]

모델 정의 검색

솔루션은 위에서 식별된 모델 ID를 사용하여 해당 모델 정의를 검색합니다.

솔루션은 다음 옵션 중 하나를 사용하여 모델 정의를 가져올 수 있습니다.

모델 리포지토리

솔루션은 DMR(디바이스 모델 리포지토리)에서 DTDL 모델을 검색할 수 있습니다. DMR은 큐레이팅된 DTDL 모델의 컬렉션을 포함하는 Microsoft에서 호스트하는 퍼블릭 리포지토리. DMR에 저장된 공용 디바이스 모델은 모든 사용자가 공용 엔드포인트 https://devicemodels.azure.com에서 애플리케이션을 사용하고 통합할 수 있습니다.

새 디바이스 연결의 모델 ID를 식별한 후 다음 단계를 따르세요.

  1. 모델 리포지토리에서 모델 ID를 사용하여 모델 정의를 검색합니다. 자세한 내용은 모델 해결을 참조 하세요.

  2. 연결된 디바이스의 모델 정의를 사용하여 디바이스의 기능을 열거할 수 있습니다.

  3. 디바이스의 열거된 기능을 사용하여 사용자가 디바이스와 상호 작용하도록 활성화할 수 있습니다.

모델 확인

DMR 규칙에는 호스트된 모델의 사용을 간소화하기 위한 다른 아티팩트가 포함됩니다. 이러한 기능은 사용자 지정 또는 프라이빗 리포지토리에 선택 사항입니다.

DMR의 공용 DTDL 모델에 프로그래밍 방식으로 액세스하려면 NuGet 패키지 Azure.IoT.ModelsRepository에서 사용할 수 있는 모델을 사용할 ModelsRepositoryClient 수 있습니다. 이 클라이언트는 기본적으로 devicemodels.azure.com에서 사용 가능한 공용 DMR을 쿼리하도록 구성되며 모든 사용자 정의 리포지토리에 구성할 수 있습니다.

클라이언트는 DTMI를 입력으로 수락하고 모든 필수 인터페이스와 함께 사전을 반환합니다.

using Azure.IoT.ModelsRepository;

var client = new ModelsRepositoryClient();
ModelResult models = client.GetModel("dtmi:com:example:TemperatureController;1");
models.Content.Keys.ToList().ForEach(k => Console.WriteLine(k));

예상 출력은 종속성 체인에 있는 세 가지 인터페이스의 DTMI를 표시합니다.

dtmi:com:example:TemperatureController;1
dtmi:com:example:Thermostat;1
dtmi:azure:DeviceManagement:DeviceInformation;1

ModelsRepositoryClient는 http(s)를 통해 사용할 수 있는 사용자 지정 DMR을 쿼리하도록 구성하고 ModelDependencyResolution 플래그를 사용하여 종속성 확인을 지정할 수 있습니다.

  • Disabled. 종속성 없이 지정된 인터페이스만 반환합니다.
  • Enabled. 종속성 체인의 모든 인터페이스를 반환합니다.

사용자 지정 리포지토리는 .expanded.json 파일을 노출하지 않을 수 있습니다. 이 파일을 사용할 수 없는 경우 클라이언트가 대체되어 각 종속성을 로컬로 처리합니다.

다음 샘플 코드는 사용자 지정 리포지토리 기본 URL을 사용하여 ModelsRepositoryClient를 초기화하는 방법을 보여줍니다. 이 경우에는 raw 엔드포인트에서 사용할 수 없기 때문에 expanded 형식을 사용하지 않고 GitHub API의 raw URL을 사용합니다. 클라이언트에서 수행하는 HTTP 요청을 검사하기 위해 AzureEventSourceListener가 초기화됩니다.

using AzureEventSourceListener listener = AzureEventSourceListener.CreateConsoleLogger();

var client = new ModelsRepositoryClient(
    new Uri("https://raw.githubusercontent.com/Azure/iot-plugandplay-models/main"));

ModelResult model = await client.GetModelAsync(
    "dtmi:com:example:TemperatureController;1", 
    dependencyResolution: ModelDependencyResolution.Enabled);

model.Content.Keys.ToList().ForEach(k => Console.WriteLine(k));

Azure SDK GitHub 리포지토리에서 사용할 수 있는 샘플은 다음과 같습니다. Azure.Iot.ModelsRepository/samples

사용자 지정 저장소

솔루션은 이러한 모델 정의를 로컬 파일 시스템, 공용 파일 저장소에 저장하거나 사용자 지정 구현을 사용할 수 있습니다.

새 디바이스 연결의 모델 ID를 식별한 후 다음 단계를 따르세요.

  1. 사용자 지정 저장소에서 모델 ID를 사용하여 모델 정의를 검색합니다.

  2. 연결된 디바이스의 모델 정의를 사용하여 디바이스의 기능을 열거할 수 있습니다.

  3. 디바이스의 열거된 기능을 사용하여 사용자가 디바이스와 상호 작용하도록 활성화할 수 있습니다.

다음 단계

이제 IoT 솔루션에서 IoT 플러그 앤 플레이 모델을 통합하는 방법을 배웠으므로 몇 가지 제안된 다음 단계는 다음과 같습니다.