디바이스 데이터 수집

완료됨

이 단원에서는 건물의 온도 조절 디바이스(디바이스 시뮬레이터로 표시)에서 Azure Digital Twins로 데이터 수집을 설정합니다. 이 프로세스에는 이 다이어그램의 흐름 A에 표시된 리소스가 포함됩니다.

디바이스에서 Azure Digital Twins로, 그리고 Azure Digital Twins 전체로 흐르는 데이터를 보여 주는 그래프.

데이터 흐름은 다음 경로를 따릅니다.

  1. 시뮬레이션된 디바이스인 Thermostat 67은 온도 데이터를 생성합니다.
  2. 온도 데이터는 클라우드로 전송되어 IoT Hub에 도착합니다.
  3. IoT Hub는 온도 데이터를 사용자 지정 Azure 함수(IoTHubToADT)로 라우팅합니다.
  4. Azure 함수 코드는 온도 데이터를 사용하여 Azure Digital Twins의 해당 Thermostat67 트윈에서 온도 속성을 업데이트합니다.

필수 리소스 만들기

먼저 이 흐름에 필요한 리소스인 IoT Hub 및 Azure 함수를 만듭니다.

IoT Hub 만들기

Cloud Shell 창으로 돌아가서 다음 Azure CLI 명령을 사용하여 IoT 허브를 만듭니다. 기본 이름은 iot-hub-smart-building입니다.

IOT_HUB="iot-hub-smart-building"
az iot hub create --name $IOT_HUB --resource-group $RESOURCE_GROUP --sku S1

Azure 함수 만들기

다음으로, IoT Hub의 데이터를 처리하고 Azure Digital Twins를 업데이트하는 Azure 함수를 만듭니다.

함수 앱 만들기

먼저 Azure에서 새 함수 앱을 만듭니다. 다음 CLI 명령을 실행하여 함수 앱에 대한 스토리지 계정을 만들고, 새 함수 앱을 만들고, Visual Studio에서 게시할 수 있는지 확인합니다. 이 명령은 스토리지 계정 이름과 함수 앱 이름에 사용할 난수를 생성합니다.

STORAGE_ACCOUNT_NAME="functionstorage$RANDOM"
az storage account create --name $STORAGE_ACCOUNT_NAME --location $REGION --resource-group $RESOURCE_GROUP --sku Standard_LRS

FUNCTION_APP_NAME="digitaltwinsfunctions$RANDOM"
az functionapp create --name $FUNCTION_APP_NAME --storage-account $STORAGE_ACCOUNT_NAME --consumption-plan-location $REGION --resource-group $RESOURCE_GROUP --functions-version 4
az resource update --resource-group $RESOURCE_GROUP --name scm --namespace Microsoft.Web --resource-type basicPublishingCredentialsPolicies --parent sites/$FUNCTION_APP_NAME --set properties.allow=true

함수 앱 구성

다음 Azure CLI 명령을 실행하여 Azure 함수 앱에 대한 시스템 할당 ID를 만들고 해당 ID에 Azure Digital Twins 인스턴스에 대한 Azure Digital Twins 데이터 소유자 역할을 부여합니다. 이를 통해 함수 앱의 함수가 Azure Digital Twins 인스턴스의 데이터를 변경할 수 있습니다.

APP_ID=$(az functionapp identity assign --resource-group $RESOURCE_GROUP --name $FUNCTION_APP_NAME --query principalId -o tsv)
az dt role-assignment create --resource-group $RESOURCE_GROUP --dt-name $INSTANCE_NAME --assignee $APP_ID --role "Azure Digital Twins Data Owner"

다음 Azure CLI 명령을 실행하여 Azure Digital Twins 인스턴스의 URL을 보유하는 Azure 함수에 환경 변수를 만듭니다. 이 변수는 런타임 시 Azure 함수 코드에 Azure Digital Twins 인스턴스 URL을 제공합니다. 이와 같이 함수 환경 변수에 URL을 저장하면 이 값을 변경해야 하는 경우 이 한 지점에서 함수 앱의 모든 함수에 대해 값을 변경할 수 있습니다.

az functionapp config appsettings set --resource-group $RESOURCE_GROUP --name $FUNCTION_APP_NAME --settings "ADT_SERVICE_URL=https://$INSTANCE_NAME.api.wus2.digitaltwins.azure.net"

함수 프로젝트 설정

다음으로, Azure의 함수 앱에 게시될 첫 번째 Azure 함수를 작성할 로컬 프로젝트를 설정합니다.

  1. 로컬 컴퓨터에서 Visual Studio를 열고 새 프로젝트 만들기를 선택합니다.

  2. Azure Functions 템플릿을 검색하고 선택합니다.

    새 프로젝트에 대한 Azure Functions 템플릿을 보여 주는 Visual Studio 스크린샷.

  3. 설정 프롬프트를 계속 진행합니다. 프로젝트 이름을 DigitalTwinsTrainingApp으로 지정하고 Event Grid 트리거의 기본 함수 선택을 그대로 둡니다. 설정이 완료되면 새 함수 앱 프로젝트가 Visual Studio에서 열리고 Function1.cs라는 새 함수 템플릿 파일이 표시됩니다.

  4. 솔루션 탐색기에서 DigitalTwinsTrainingApp을 길게 선택하거나 마우스 오른쪽 단추로 클릭하여 옵션 목록을 열고 NuGet 패키지 관리...Visual Studio에서 NuGet 패키지 관리 옵션을 보여 주는 스크린샷.를 선택합니다.

    패키지 관리자를 사용하여 다음 패키지를 설치합니다. Azure.Identity, Azure.DigitalTwins.Core.

함수 코드 작성

다음으로 함수의 코드 본문을 입력합니다. 이 함수는 IoT Hub에서 들어오는 메시지에서 주요 정보를 식별한 다음 Azure Digital Twins .NET SDK를 사용하여 Azure Digital Twins에서 올바른 트윈을 업데이트해야 합니다.

먼저 다음 단계를 완료하여 함수를 설정하고 Azure Digital Twins와 함께 작동하도록 준비합니다.

  1. 기능을 비동기식으로 만들고 Azure 기능에 액세스할 수 있도록 다음 using 문을 파일에 추가합니다. (다른 using 문은 코드에 붙여넣으면 Visual Studio에서 자동으로 추가합니다.)

    using Azure;
    using System.Threading.Tasks;
    
  2. 템플릿에 제공된 샘플 함수를 다음과 같이 업데이트합니다.

    1. 함수의 기본 이름은 Function1입니다. 나중에 쉽게 알아볼 수 있도록 이름을 IoTHubToADT로 바꿉니다.
    2. 클래스 선언에서 static을 제거합니다.
    3. Run 메서드의 서명을 public static void에서 public async Task로 변경하여 함수를 비동기식으로 만듭니다.

    Visual Studio에서 템플릿 변경 내용을 보여 주는 코드 스크린샷.

  1. 함수 선언 앞에 클래스 상단에 다음 변수를 추가합니다. 이러한 클래스 변수는 Azure Digital Twins로 함수를 인증하는 데 사용됩니다. 바꿀 자리 표시자가 없습니다. 표시된 대로 붙여넣으면 됩니다.

    private static readonly HttpClient httpClient = new HttpClient();
    private static string adtServiceUrl = Environment.GetEnvironmentVariable("ADT_SERVICE_URL");  //This will be populated at runtime by the environment variable you set up earlier for the Azure function app. adtServiceUrl will ultimately be set to "https://<host-name-of-your-Azure-Digital-Twins-instance>".
    

    Visual Studio에서 새 변수를 보여 주는 코드 스크린샷.

  2. Run 메서드에서 로그 줄 뒤에 다음 코드를 추가합니다. 이 코드 조각은 위의 인증 변수를 사용하여 디지털 트윈 정보를 검색하고 업데이트하는 메서드가 포함된 DigitalTwinsClient를 설정합니다. 이 클래스에 대한 자세한 내용은 DigitalTwinsClient 클래스(.NET SDK)를 참조하세요.

    var credentials = new DefaultAzureCredential();
    DigitalTwinsClient client = new DigitalTwinsClient(
        new Uri(adtServiceUrl), credentials, new DigitalTwinsClientOptions
        { Transport = new HttpClientTransport(httpClient) });
    log.LogInformation($"ADT service client connection created.");
    

    Visual Studio에서 DigitalTwinsClient를 보여 주는 코드 스크린샷.

다음으로 고유한 기능을 추가합니다.

  1. 여전히 Run 메서드 내에서 함수가 데이터와 함께 Event Grid 이벤트를 수신할 때 조치를 취하도록 if 문을 설정합니다. IoT Hub의 온도 데이터가 Azure 함수에 도착하면 실행됩니다.

    if (eventGridEvent != null && eventGridEvent.Data != null)
    {
        log.LogInformation(eventGridEvent.Data.ToString());
    }
    

    Visual Studio에서 if 문을 보여 주는 코드 스크린샷.

  2. if 문의 본문에서 로거 줄 뒤에 다음 코드를 추가합니다. 이 코드 조각은 IoT Hub에서 들어오는 메시지를 읽어 메시지를 보내는 디바이스와 업데이트된 온도 값을 식별합니다.

    // Reading deviceId and temperature for IoT Hub JSON
    JObject deviceMessage = (JObject)JsonConvert.DeserializeObject(eventGridEvent.Data.ToString());
    string deviceId = (string)deviceMessage["systemProperties"]["iothub-connection-device-id"];
    var temperature = deviceMessage["body"]["Temperature"];
    
    log.LogInformation($"Device:{deviceId} Temperature is:{temperature}");
    

    Visual Studio에서 if 문에 대한 읽기 추가 사항을 보여 주는 코드 스크린샷.

  3. 다음 코드를 사용하여 if 문을 완료합니다. 이 코드 조각은 UpdateDigitalTwinAsync 메서드를 사용하여 원격 분석 메시지의 디바이스 ID와 일치하는 ID를 가진 디지털 트윈을 업데이트합니다. 이 메서드는 JSON 패치 문서를 사용하여 트윈의 Temperature 속성을 새 온도 값과 일치하도록 업데이트합니다.

    //Update twin using device temperature
    var updateTwinData = new JsonPatchDocument();
    updateTwinData.AppendReplace("/Temperature", temperature.Value<double>());
    await client.UpdateDigitalTwinAsync(deviceId, updateTwinData);
    

    Visual Studio에서 if 문에 대한 업데이트 추가 사항을 보여 주는 코드 스크린샷.

  4. 완료된 함수 파일을 저장합니다.

참고 항목

디바이스 시뮬레이터를 다운로드한 동일한 GitHub 리포지토리에서 이 전체 코드 샘플을 볼 수 있습니다. ProcessHubToDTEvents.cs(digital-twins-samples).

함수 게시

이 단원의 앞부분에서 만든 Azure 함수 앱에 함수를 게시하려면 다음 단계를 따릅니다.

  1. 솔루션 탐색기에서 DigitalTwinsTrainingApp을 길게 선택하거나 마우스 오른쪽 단추로 클릭하여 옵션 목록을 열고 게시...Visual Studio에서 게시 옵션을 보여 주는 스크린샷.를 선택합니다.

  2. 팝업되는 게시 대화 상자에서 다음을 선택합니다.

    1. 대상: Azure를 선택합니다.
    2. 특정 대상: Azure 함수 앱(Windows)을 선택합니다.
    3. 함수 인스턴스: 구독 이름에서 구독을 선택합니다. 리소스 그룹이 상자에 표시됩니다. 이 모듈의 리소스 그룹을 확장하고(기본 이름을 유지한 경우 azure-digital-twins-training) digitaltwinsfunctions로 시작하는 함수 앱을 선택합니다.
    4. 게시 프로필 설정을 마치려면 마침을 선택합니다.
  3. Visual Studio로 돌아가서 함수가 함수 앱에 게시할 준비가 되었는지 확인하고 게시를 선택합니다. Visual Studio에서 최종 게시 단추를 보여 주는 코드 스크린샷.

게시가 성공하면 Visual Studio는 게시가 성공했음을 나타냅니다.

게시 URL에 연결할 수 없음이라는 오류와 함께 게시가 실패하는 경우 Azure CLI에서 다음 명령을 다시 실행하여 Visual Studio가 배포를 수행하기 위해 인증할 수 있는지 확인합니다. 그런 다음 게시를 다시 시도합니다.

az resource update --resource-group $RESOURCE_GROUP --name scm --namespace Microsoft.Web --resource-type basicPublishingCredentialsPolicies --parent sites/$FUNCTION_APP_NAME --set properties.allow=true

리소스 연결

이제 IoT Hub 및 Azure 함수가 만들어졌으므로 시뮬레이션된 디바이스 데이터가 리소스를 통해 흐를 수 있도록 이러한 리소스 간의 연결을 설정할 수 있습니다.

IoT Hub에 디바이스 연결

먼저 시뮬레이션된 디바이스 데이터를 IoT Hub로 가져옵니다.

Important

이 모듈에는 공유 액세스 서명(대칭 키 인증이라고도 함)을 사용하여 디바이스를 연결하는 단계가 포함되어 있습니다. 이 인증 방법은 테스트와 평가에 편리하지만, X.509 인증서를 사용하여 디바이스를 인증하는 것이 더 안전한 방식입니다. 자세한 내용은 보안 모범 사례 > 연결 보안을 참조하세요.

Azure CLI에서 다음 명령을 실행하여 자동 온도 조절 디바이스를 나타내는 IoT Hub에 가상 디바이스를 만듭니다. IoT Hub 디바이스 쌍의 이름은 Thermostat67입니다.

az iot hub device-identity create --device-id Thermostat67 --hub-name $IOT_HUB --resource-group $RESOURCE_GROUP

다음으로 IoT Hub 디바이스 표현에 연결하도록 디바이스 시뮬레이터를 구성합니다. 2단원에서 다운로드한 디바이스 시뮬레이터 코드에서 IoT Hub 연결 값을 설정하여 이 작업을 수행합니다.

IoT Hub 전체에 대한 연결 문자열을 가져오고(첫 번째 명령), IoT Hub의 Thermostat67 가상 디바이스에 대한 연결 문자열을 가져오는(두 번째 명령) 다음 Azure CLI 명령을 실행하여 시작합니다. 각각 HostName=...으로 시작하는 출력 값을 디바이스 시뮬레이터 코드에 복사하게 됩니다.

az iot hub connection-string show --hub-name $IOT_HUB
az iot hub device-identity connection-string show --device-id Thermostat67 --hub-name $IOT_HUB

그런 다음 컴퓨터에 다운로드한 디바이스 시뮬레이터 폴더로 이동합니다. 편집하려면 digital-twins-samples-main\DeviceSimulator\DeviceSimulator\AzureIoTHub.cs에서 파일을 엽니다. 다음 코드를 찾아 자리 표시자를 위에서 수집한 값으로 변경합니다.

private const string iotHubConnectionString = "<your-hub-connection-string>";
//...
private const string deviceConnectionString = "<your-device-connection-string>";

파일을 저장 후 닫습니다.

이제 IoT Hub로 데이터를 보내도록 디바이스 시뮬레이터가 설정되었습니다. 여러 디바이스가 포함된 실제 시나리오에서는 모든 디바이스를 IoT Hub에 등록합니다.

IoT Hub를 Azure 함수에 연결

다음으로 IoT Hub에서 Azure 함수로의 데이터 흐름을 설정합니다.

Azure 함수를 엔드포인트로 IoT Hub에서 Event Grid 이벤트 구독을 만드는 다음 Azure CLI 명령을 사용합니다. 이는 IoT Hub에서 발생하는 원격 분석 이벤트에 대한 IoTHubToADT 함수를 "구독"합니다.

az eventgrid event-subscription create --name iothubsubscription --event-delivery-schema eventgridschema --source-resource-id /subscriptions/$AZURE_SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Devices/IotHubs/$IOT_HUB --included-event-types Microsoft.Devices.DeviceTelemetry --endpoint-type azurefunction --endpoint /subscriptions/$AZURE_SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Web/sites/$FUNCTION_APP_NAME/functions/IoTHubToADT

이제 IoT Hub가 Azure 함수에 데이터를 보낼 준비가 되었습니다. 여기에서 이 단원의 앞부분에서 작성한 함수 코드가 Azure Digital Twins를 업데이트합니다.

시뮬레이션 실행 및 결과 확인

이제 데이터 시뮬레이터를 실행하고 결과를 확인할 시간입니다.

컴퓨터에서 새 콘솔 창을 열고 digital-twins-samples-main\DeviceSimulator\DeviceSimulator 폴더로 이동합니다.

콘솔에서 다음 dotnet 명령을 실행하여 디바이스 시뮬레이터 프로젝트를 시작합니다. 샘플 시나리오에서 이 시뮬레이터는 정기적으로 온도 판독값을 내보내는 스마트 빌딩의 온도 조절 장치를 나타냅니다.

dotnet run

프로젝트가 실행되기 시작하고 몇 분 후에 시뮬레이션된 온도 원격 분석 메시지를 보내기 시작합니다. 5초마다 새 메시지가 전송됩니다.

콘솔에서 실행되는 디바이스 시뮬레이터의 스크린샷.

실행 중인 동안 Cloud Shell로 돌아가서 다음 명령을 실행하여 Azure Digital Twins 인스턴스를 쿼리합니다. 이 명령은 인스턴스에 있는 모든 트윈의 ID 값과 온도를 반환하는 쿼리를 보냅니다.

az dt twin query -n $INSTANCE_NAME -q "select T.\$dtId, T.Temperature from digitaltwins T"

결과는 원래 2단원에서 온도 값이 0.0으로 만들어진 Thermostat67 트윈에 온도 값(디바이스 시뮬레이터의 값과 일치함)이 있음을 보여 줍니다. 값이 빠르게 업데이트되므로 쿼리 명령을 몇 번 더 반복하여 값 변경을 확인합니다.

쿼리 출력을 보여 주는 Cloud Shell 스크린샷

디지털 트윈에서 변화하는 온도 값을 관찰한 후 디바이스 시뮬레이터를 중지할 수 있습니다. 이러한 값은 트윈이 디바이스 시뮬레이터에 성공적으로 연결되었으며 판독값을 기반으로 업데이트되고 있음을 나타냅니다. 샘플 시나리오에서 이는 Azure Digital Twins 표현이 이제 스마트 빌딩의 라이브 데이터로 실행되고 있음을 의미합니다.

만든 Azure 함수는 IoT Hub에 모두 표시되고 이름이 일치하는 디지털 트윈이 있는 한 모든 디바이스에서 작동합니다.

쿼리 결과에서 Thermostat67 트윈이 업데이트되고 있지만 이에 연결된 Room21 트윈은 0으로 유지된다는 것을 알 수 있습니다. 이는 아직 Azure Digital Twins 그래프를 통해 데이터 흐름을 연결하지 않았기 때문입니다. 이를 설정하려면 다음 단원으로 진행합니다.