자습서: 대칭 키 등록 그룹을 사용한 디바이스 프로비전

이 자습서에서는 등록 그룹을 사용하여 여러 대칭 키 디바이스를 단일 IoT Hub에 안전하게 프로비전하는 방법을 보여줍니다.

Azure IoT Hub Device Provisioning Service는 디바이스 프로비저닝에 대해 다음 두 가지 유형의 등록을 지원합니다.

  • 등록 그룹: 여러 관련 디바이스를 등록하는 데 사용됩니다. 이 자습서에서는 등록 그룹을 사용하여 프로비저닝하는 방법을 보여 줍니다.
  • 개별 등록: 단일 디바이스를 등록하는 데 사용됩니다.

Azure IoT Hub Device Provisioning Service는 디바이스 프로비저닝에 대해 다음 세 가지 유형의 인증을 지원합니다.

  • X.509 인증서
  • 신뢰할 수 있는 플랫폼 모듈(TPM)
  • 대칭 키 - 이 자습서에서는 대칭 키 증명을 보여 줍니다.

일부 디바이스에는 디바이스를 안전하게 식별하는 데 사용할 수 있는 인증서, TPM 또는 다른 보안 기능이 없을 수 있습니다. 이러한 디바이스의 경우 Azure IoT Hub DPS(Device Provisioning Service)에는 대칭 키 증명이 포함됩니다. MAC 주소 또는 일련 번호와 같은 고유 정보 기반 디바이스를 식별하는 데 대칭 키 증명을 사용할 수 있습니다.

이 자습서에서는 다음 목표를 달성합니다.

  • 각 디바이스에 대한 고유한 등록 ID를 정의합니다.
  • 대칭 키 증명을 사용하는 등록 그룹을 만듭니다.
  • 고유한 등록 ID 및 공유 등록 그룹 키를 사용하여 각 디바이스에 대한 디바이스 키를 생성합니다.
  • Azure IoT 디바이스 SDK에서 디바이스 키 및 샘플 코드를 사용하여 디바이스를 프로비전합니다.

이 자습서는 Windows 기반 워크스테이션에 적용됩니다. 그러나 Linux에서 절차를 수행할 수 있습니다. Linux 예제는 자습서: 지역 대기 시간 프로비저닝을 참조하세요.

참고 항목

이전에 빠른 시작: 시뮬레이션된 대칭 키 디바이스 프로비저닝을 완료했으며 여전히 Azure 리소스 및 개발 환경을 설정한 경우 이 자습서에서 대칭 키 등록 그룹 만들기를 진행할 수 있습니다.

필수 조건

  • Windows 개발 환경을 사용하는 경우 ‘C++를 사용한 데스크톱 개발’ 워크로드를 사용하도록 설정된 Visual Studio 2022를 설치합니다. Visual Studio 2019, Visual Studio 2017 및 Visual Studio 2015도 지원됩니다. Linux 또는 macOS의 경우 SDK 설명서에서 개발 환경 준비의 해당 섹션을 참조하세요.

  • 최신 CMake 빌드 시스템을 설치합니다. CMake 실행 파일을 경로에 추가하는 옵션을 선택했는지 확인합니다.

    Important

    CMake 설치를 시작하기 전에 Visual Studio 필수 구성 요소(Visual Studio 및 ‘C++를 사용한 데스크톱 개발’ 워크로드)가 머신에 설치되어 있는지 확인합니다. 필수 구성 요소가 설치되고 다운로드를 확인하면 CMake 빌드 시스템을 설치합니다. 이전 버전의 CMake 빌드 시스템은 이 문서에 사용된 솔루션 파일을 생성하지 못합니다. 최신 버전의 CMake를 사용해야 합니다.

  • Windows 기반 머신에 .NET SDK 6.0 이상을 설치합니다. 다음 명령을 사용하여 버전을 확인할 수 있습니다.

    dotnet --info
    
  • Windows 기반 머신에 설치된 Python 3.7 이상을 설치합니다. python --version을 실행하여 Python 버전을 확인할 수 있습니다.
  • 최신 버전의 Git을 설치합니다. Git이 명령 창에 액세스할 수 있는 환경 변수에 추가되었는지 확인합니다. 설치할 git 도구의 최신 버전은 Software Freedom Conservancy의 Git 클라이언트 도구를 참조하세요. 여기에는 로컬 Git 리포지토리와 상호 작용하는 데 사용할 수 있는 명령줄 앱인 Git Bash가 포함됩니다.

개발 환경 준비

이 섹션에서는 C용 Azure IoT 디바이스 SDK를 빌드하기 위한 개발 환경을 준비합니다. 샘플 코드는 디바이스의 부팅 시퀀스 중에 디바이스를 프로비전합니다.

  1. 웹 브라우저에서 Azure IoT C SDK의 릴리스 페이지로 이동합니다.

  2. Azure IoT C SDK의 최신 릴리스에 대한 태그 이름을 복사합니다(예: lts_03_2024.

  3. Windows 명령 프롬프트를 열고 다음 명령을 실행하여 C GitHub 리포지토리용 Azure IoT 디바이스 SDK의 최신 릴리스를 복제합니다. 이전 단계에서 복사한 태그로 바꿉 <release-tag> 습니다.

    git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git
    cd azure-iot-sdk-c
    git submodule update --init
    

    이 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다.

  4. 작업이 완료되면 azure-iot-sdk-c 디렉터리에서 다음 명령을 실행합니다.

    mkdir cmake
    cd cmake
    
  5. 코드 샘플에서는 대칭 키를 사용하여 증명을 제공합니다. 다음 명령을 실행하여 디바이스 프로비저닝 클라이언트를 포함하는 개발 클라이언트 플랫폼과 관련된 SDK 버전을 빌드합니다.

    cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    

    cmake에서 C++ 컴파일러를 찾지 못하면 위의 명령을 실행하는 동안 빌드 오류가 발생할 수 있습니다. 이 경우에는 Visual Studio 명령 프롬프트에서 명령을 실행합니다.

  6. 빌드가 성공적으로 완료되면 마지막 몇몇 출력 줄은 다음 출력과 유사하게 표시됩니다.

    $ cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    -- Building for: Visual Studio 16 2019
    -- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.22621.
    -- The C compiler identification is MSVC 19.29.30146.0
    -- The CXX compiler identification is MSVC 19.29.30146.0
    
    ...
    
    -- Configuring done
    -- Generating done
    -- Build files have been written to: C:/azure-iot-sdk-c/cmake
    
  1. 명령 프롬프트 또는 Git Bash 터미널을 엽니다.

  2. 다음 명령을 사용하여 C# GitHub 리포지토리용 Azure IoT SDK를 복제합니다.

    git clone https://github.com/Azure/azure-iot-sdk-csharp.git
    
  1. 명령 프롬프트 또는 Git Bash 터미널을 엽니다.

  2. 다음 명령을 사용하여 Node.js용 Azure IoT SDK GitHub 리포지토리를 복제합니다.

    git clone https://github.com/Azure/azure-iot-sdk-node.git --recursive
    
  1. 명령 프롬프트 또는 Git Bash 터미널을 엽니다.

  2. 다음 명령을 사용하여 Python용 Azure IoT 디바이스 SDK GitHub 리포지토리를 복제합니다.

    git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive
    

    참고 항목

    이 자습서에 사용된 샘플은 azure-iot-sdk-python 리포지토리의 v2 분기에 있습니다. Python SDK의 V3는 베타에서 사용할 수 있습니다. Python SDK의 V3 릴리스를 사용하도록 V2 코드 샘플을 업데이트하는 방법에 대한 자세한 내용은 Python용 Azure IoT 디바이스 SDK 마이그레이션 가이드를 참조하세요.

  1. 명령 프롬프트 또는 Git Bash 터미널을 엽니다.

  2. 다음 명령을 사용하여 Java용 Azure IoT SDK GitHub 리포지토리를 복제합니다.

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  3. 필요한 모든 패키지를 다운로드하려면 루트 azure-iot-sdk-java 디렉터리로 이동하고 프로젝트를 빌드합니다. 이 단계를 완료하는 데 몇 분 정도 걸릴 수 있습니다.

    cd azure-iot-sdk-java
    mvn install -DskipTests=true
    

대칭 키 등록 그룹 만들기

  1. Azure Portal에 로그인하고, Device Provisioning Service 인스턴스로 이동합니다.

  2. 탐색 메뉴의 설정 섹션에서 등록 관리를 선택합니다.

  3. 등록 그룹 추가를 선택합니다.

  4. 등록 그룹 추가 페이지의 등록 + 프로비저닝 탭에서 다음 정보를 제공하여 등록 그룹 세부 정보를 구성합니다.

    필드 설명
    증명 증명 메커니즘으로 대칭 키를 선택합니다.
    대칭 키 설정 임의로 생성된 키를 사용하려면 자동으로 대칭 키 생성 확인란을 선택합니다. 고유한 키를 제공하려는 경우 이 확인란의 선택을 취소합니다.
    그룹 이름 디바이스 그룹의 이름을 제공합니다. 등록 그룹 이름은 영숫자 문자의 대/소문자를 구분하지 않는 문자열(최대 128자 길이)과 특수 문자인 '-', '.', '_', ':'입니다. 마지막 문자는 영숫자 또는 대시('-')여야 합니다.
    프로비전 상태 디바이스를 프로비전하는 데 이 등록 그룹을 사용할 수 있도록 하려면 이 등록 사용 확인란을 선택합니다. 그룹을 사용하지 않도록 설정하려면 이 확인란의 선택을 취소합니다. 이 설정은 나중에 변경할 수 있습니다.
    재프로비전 정책 DPS가 다시 프로비전을 요청하는 디바이스를 처리하는 방법을 반영하는 재프로비전 정책을 선택합니다. 자세한 내용은 정책 다시 프로비전을 참조하세요

    Screenshot that shows adding an enrollment group for symmetric key attestation.

  5. 다음: IoT 허브를 선택합니다.

  6. 등록 그룹 추가 페이지의 IoT 허브 탭에서 다음 정보를 제공하여 등록 그룹이 디바이스를 프로비전할 수 있는 IoT 허브를 결정합니다.

    필드 설명
    대상 IoT 허브 연결된 IoT 허브 중 하나 이상을 선택하거나 IoT 허브에 새 링크를 추가합니다. DPS 인스턴스에 IoT 허브를 연결하는 방법에 대해 자세히 알아보려면 IoT 허브 연결 및 관리 방법을 참조하세요.
    할당 정책 둘 이상의 연결된 IoT 허브를 선택한 경우 디바이스를 다른 허브에 할당할 방법을 선택합니다. 할당 정책에 대한 자세한 내용은 할당 정책 사용 방법을 참조하세요.

    연결된 IoT 허브를 하나만 선택한 경우 동일 가중 배포 정책을 사용하는 것이 좋습니다.

    Screenshot that shows connecting IoT hubs to the new enrollment group.

  7. 다음: 디바이스 설정을 선택합니다

  8. 등록 그룹 추가 페이지의 디바이스 설정 탭에서 다음 정보를 제공하여 새로 프로비전된 디바이스를 구성하는 방법을 정의합니다.

    필드 설명
    IoT Edge 이 그룹을 통해 프로비전된 모든 디바이스가 Azure IoT Edge를 실행하는 경우 프로비전된 디바이스에서 IoT Edge 사용을 선택합니다. 이 그룹이 비 IoT Edge 지원 디바이스에만 해당되는 경우 이 확인란의 선택을 취소합니다. 그룹의 모든 디바이스는 IoT Edge를 사용하도록 설정되거나 아무것도 사용할 수 없습니다.
    디바이스 태그 프로비전된 디바이스의 디바이스 쌍에 적용하려는 태그를 제공하려면 이 텍스트 상자를 사용합니다.
    원하는 속성 프로비전된 디바이스의 디바이스 쌍에 적용하려는 원하는 속성을 제공하려면 이 텍스트 상자를 사용합니다.

    자세한 내용은 IoT Hub의 디바이스 쌍 이해 및 사용을 참조하세요.

  9. 완료되면 다음: 리뷰 + 만들기를 클릭합니다.

  10. 검토 + 만들기 탭에서 모든 값을 확인한 다음 만들기를 선택합니다.

등록 그룹을 만들 때 DPS는 기본 키보조 키를 생성한 다음 등록 항목에 추가합니다. 대칭 키 등록 그룹이 등록 그룹 탭의 그룹 이름 열 아래에 표시됩니다.

등록을 열고 기본 키의 값을 복사합니다. 이 키는 그룹 키입니다.

디바이스에 대한 고유한 등록 ID를 선택합니다.

각 디바이스를 식별하기 위한 고유한 등록 ID가 정의되어야 합니다. 디바이스에서 MAC 주소, 일련 번호 또는 고유 정보를 사용할 수 있습니다.

이 예제에서는 등록 ID에 대한 다음 문자열을 형성하는 MAC 주소와 일련 번호의 조합을 사용합니다.

sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6

각 디바이스에 대해 고유한 등록 ID를 만듭니다. 등록 ID는 영숫자 문자와 다음 특수 문자 - . _ :의 대/소문자를 구분하지 않는 문자열(최대 128자)입니다. 마지막 문자는 영숫자 또는 대시(-)여야 합니다.

디바이스 키 파생

디바이스 키를 생성하려면 등록 그룹 기본 키를 사용하여 각 디바이스에 대한 등록 ID의 HMAC-SHA256 해시를 계산합니다. 그런 다음, 결과는 각 디바이스에 대한 Base 64 형식으로 변환됩니다.

Warning

각 디바이스의 디바이스 코드에는 해당 디바이스에 대한 파생된 디바이스 키만 포함되어야 합니다. 디바이스 코드에 그룹 기본 키를 포함하지 마세요. 손상된 그룹 키는 인증되는 모든 디바이스의 보안을 손상시킬 가능성이 있습니다.

Azure CLI에 대한 IoT 확장에서는 파생된 디바이스 키를 생성할 수 있는 az iot dps enrollment-group compute-device-key 명령을 제공합니다. 이 명령은 Windows 기반 및 Linux 시스템 모두에서 사용할 수 있습니다.

--key 매개 변수 값을 등록 그룹의 기본 키로 바꿉니다.

--registration-id 매개 변수의 값을 등록 ID로 바꿉니다.

az iot dps enrollment-group compute-device-key --key <group_primary_key> --registration-id <device_registration_id>

결과 예제:

"Jsm0lyGpjaVYVP2g3FnmnmG9dI/9qU24wNoykUmermc="

각 디바이스는 파생된 디바이스 키와 고유한 등록 ID를 사용하여 프로비전하는 동안 등록 그룹과의 대칭 키 증명을 수행합니다.

디바이스 프로비저닝 코드 준비 및 실행

이 섹션에서는 디바이스의 부팅 시퀀스를 Device Provisioning Service 인스턴스에 보내도록 디바이스 샘플 코드를 업데이트합니다. 이 부팅 시퀀스를 사용하면 디바이스가 인식되고, 인증되며, Device Provisioning Service 인스턴스에 연결된 IoT Hub에 할당됩니다.

샘플 프로비저닝 코드는 다음 작업을 순서대로 수행합니다.

  1. 다음 세 개의 매개 변수를 사용하여 Device Provisioning 리소스로 디바이스를 인증합니다.

    • Device Provisioning Service의 ID 범위
    • 디바이스의 등록 ID입니다.
    • 디바이스에 대한 파생 디바이스 키입니다.
  2. Device Provisioning Service 인스턴스에 이미 연결된 IoT Hub에 디바이스를 할당합니다.

디바이스 정보를 사용하여 프로비저닝 샘플을 업데이트하고 실행하려면:

  1. Device Provisioning Service의 주 메뉴에서 개요를 선택합니다.

  2. ID 범위 값을 복사합니다.

    Screenshot that shows copying the ID scope from the DPS overview pane.

  3. Visual Studio에서 CMake를 실행하여 생성된 azure_iot_sdks.sln 솔루션 파일을 엽니다. 솔루션 파일은 다음 위치에 있습니다.

    
    \azure-iot-sdk-c\cmake\azure_iot_sdks.sln
    
    

    파일이 Cmake 디렉터리에 생성되지 않는 경우 최신 버전의 CMake 빌드 시스템을 사용했는지 확인합니다.

  4. Visual Studio의 솔루션 탐색기 창에서 Provision_Samples 폴더로 이동합니다. prov_dev_client_sample이라는 샘플 프로젝트를 확장합니다. 원본 파일을 확장하고 prov_dev_client_sample.c를 엽니다.

  5. 상수 찾기 id_scope 및 값을 Azure Portal에서 복사한 ID 범위 값으로 바꿉니다.

    static const char* id_scope = "0ne00002193";
    
  6. 동일한 파일에서 main() 함수에 대한 정의를 찾습니다. 아래와 같이 hsm_type 변수가 SECURE_DEVICE_TYPE_SYMMETRIC_KEY로 설정되었는지 확인합니다.

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    //hsm_type = SECURE_DEVICE_TYPE_X509;
    hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  7. prov_dev_client_sample.c에서 주석으로 처리된 prov_dev_set_symmetric_key_info()에 대한 호출을 찾습니다.

    // Set the symmetric key if using they auth type
    //prov_dev_set_symmetric_key_info("<symm_registration_id>", "<symmetric_Key>");
    

    함수 호출의 주석 처리를 제거하고 자리 표시자 값(꺾쇠 괄호 포함)을 디바이스에 대한 고유 등록 ID 선택디바이스 키 파생에서 생성한 파생 디바이스 키에서 선택한 등록 ID로 바꿉니다.

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6", "Jsm0lyGpjaVYVP2g3FnmnmG9dI/9qU24wNoykUmermc=");
    

    주의

    이 단계의 경우 파생된 디바이스 키가 각 디바이스의 이미지에 포함된 채로 있으므로 권장되는 보안 모범 사례가 아닙니다. 이러한 이유로 보안과 사용 편의성은 종종 상충합니다. 사용자는 본인의 요구 사항에 따라 디바이스의 보안을 철저히 검토해야 합니다.

  8. 파일을 저장합니다.

  9. prov_dev_client_sample 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 시작 프로젝트로 설정을 선택합니다.

  10. Visual Studio 메뉴에서 디버그>디버깅하지 않고 시작을 선택하여 솔루션을 실행합니다. 프로젝트 다시 빌드 프롬프트에서 를 선택하여 실행하기 전에 프로젝트를 다시 빌드합니다.

    다음 출력은 IoT 허브에 할당할 프로비저닝 서비스 인스턴스에 성공적으로 연결하는 디바이스의 예제입니다.

    Provisioning API Version: 1.9.1
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-hub-2.azure-devices.net, deviceId: sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6
    Press enter key to exit:
    

샘플 프로비저닝 코드는 다음 작업을 수행합니다.

  1. 다음 세 개의 매개 변수를 사용하여 Device Provisioning 리소스로 디바이스를 인증합니다.

    • Device Provisioning Service의 ID 범위
    • 디바이스의 등록 ID입니다.
    • 디바이스에 대한 파생 디바이스 키입니다.
  2. Device Provisioning Service 인스턴스에 이미 연결된 IoT Hub에 디바이스를 할당합니다.

  3. IoT 허브에 테스트 원격 분석 메시지를 보냅니다.

디바이스 정보를 사용하여 프로비저닝 샘플을 업데이트하고 실행하려면:

  1. Device Provisioning Service의 주 메뉴에서 개요를 선택합니다.

  2. ID 범위 값을 복사합니다.

    Screenshot that shows copying the ID scope from the DPS overview pane.

  3. 명령 프롬프트를 열고 복제된 SDK 리포지토리의 SymmetricKeySample 로 이동합니다.

    cd .\azure-iot-sdk-csharp\provisioning\device\samples\how to guides\SymmetricKeySample
    
  4. SymmetricKeySample 폴더의 Parameters.cs를 텍스트 편집기에서 엽니다. 이 파일은 샘플에서 참조하는 매개 변수를 보여줍니다. 이 문서에서는 샘플을 실행할 때 처음 세 개의 필수 매개 변수만 사용합니다. 이 파일의 코드를 살펴보세요. 변경할 필요는 없습니다.

    매개 변수 필수 설명
    --i 또는 --IdScope True DPS 인스턴스의 ID 범위
    --r 또는 --RegistrationId True 디바이스의 등록 ID입니다. 등록 ID는 영숫자 문자의 대/소문자를 구분하지 않는 문자열(최대 128자 길이)과 특수 문자인 '-', '.', '_', ':'입니다. 마지막 문자는 영숫자 또는 대시('-')여야 합니다.
    --p 또는 --PrimaryKey True 개별 등록의 기본 키 또는 그룹 등록의 파생 디바이스 키입니다.
    --g 또는 --GlobalDeviceEndpoint False 디바이스에서 연결할 전역 엔드포인트. 기본값은 global.azure-devices-provisioning.net입니다.
    --t 또는 --TransportType False 디바이스 프로비저닝 인스턴스와 통신하는 데 사용할 전송. 기본값은 Mqtt입니다. 가능한 값은 Mqtt, Mqtt_WebSocket_Only, Mqtt_Tcp_Only, Amqp, Amqp_WebSocket_Only, Amqp_Tcp_onlyHttp1입니다.
  5. SymmetricKeySample 폴더의 ProvisioningDeviceClientSample.cs를 텍스트 편집기에서 엽니다. 이 파일은 시뮬레이션된 대칭 키 디바이스를 프로비저닝하기 위해 SecurityProviderSymmetricKey 클래스와 ProvisioningDeviceClient 클래스가 어떻게 함께 사용되는지 보여 줍니다. 이 파일의 코드를 살펴보세요. 변경할 필요는 없습니다.

  6. 다음 명령을 사용하여 샘플 코드를 빌드하고 실행합니다.

    • Azure Portal에서 복사한 ID 범위로 바꿉 <id-scope> 니다.
    • <registration-id>을(를) 디바이스에 대한 고유한 등록 ID 선택에서 선택한 등록 ID로 바꿉니다.
    • <primarykey>을(를) 생성한 파생 디바이스 키로 바꿉니다.
    dotnet run --i <id-scope> --r <registration-id> --p <primarykey>
    
  7. 다음과 비슷하게 표시됩니다. “TestMessage” 문자열은 테스트 메시지로 허브에 전송됩니다.

    D:\azure-iot-sdk-csharp\provisioning\device\samples\how to guides\SymmetricKeySample>dotnet run --i 0ne00000A0A --r sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6 --p sbDDeEzRuEuGKag+kQKV+T1QGakRtHpsERLP0yPjwR93TrpEgEh/Y07CXstfha6dhIPWvdD1nRxK5T0KGKA+nQ==
    
    Initializing the device provisioning client...
    Initialized for registration Id sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6.
    Registering with the device provisioning service...
    Registration status: Assigned.
    Device sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6 registered to contoso-hub-2.azure-devices.net.
    Creating symmetric key authentication for IoT Hub...
    Testing the provisioned device with IoT Hub...
    Sending a telemetry message...
    Finished.
    

샘플 프로비저닝 코드는 다음 작업을 순서대로 수행합니다.

  1. 다음 네 개의 매개 변수를 사용하여 Device Provisioning 리소스로 디바이스를 인증합니다.

    • PROVISIONING_HOST
    • PROVISIONING_IDSCOPE
    • PROVISIONING_REGISTRATION_ID
    • PROVISIONING_SYMMETRIC_KEY
  2. Device Provisioning Service 인스턴스에 이미 연결된 IoT Hub에 디바이스를 할당합니다.

  3. IoT 허브에 테스트 원격 분석 메시지를 보냅니다.

디바이스 정보를 사용하여 프로비저닝 샘플을 업데이트하고 실행하려면:

  1. Device Provisioning Service의 주 메뉴에서 개요를 선택합니다.

  2. ID 범위 값을 복사합니다.

    Screenshot that shows copying the ID scope from the DPS overview pane.

  3. Node.js 명령을 실행하기 위한 명령 프롬프트를 열고 다음 디렉터리로 이동합니다.

    cd azure-iot-sdk-node\provisioning\device\samples
    
  4. provisioning/device/samples 폴더에서 register_symkey.js를 열고, 코드를 검토합니다.

    샘플은 기본적으로 전송 프로토콜로 MQTT로 설정됩니다. 다른 프로토콜을 사용하려는 경우 다음 줄을 주석으로 처리하고 적절한 프로토콜에 대한 줄의 주석 처리를 제거합니다.

    var ProvisioningTransport = require('azure-iot-provisioning-device-mqtt').Mqtt;
    

    샘플 코드에서는 사용자 지정 페이로드를 설정합니다.

    provisioningClient.setProvisioningPayload({a: 'b'});
    

    이 자습서에는 필요하지 않으므로 이 코드를 주석으로 처리할 수 있습니다. 사용자 지정 할당 웹후크를 사용하여 디바이스를 IoT Hub에 할당하려는 경우 사용자 지정 페이로드를 사용할 수 있습니다. 자세한 내용은 자습서: 사용자 지정 할당 정책 사용을 참조하세요.

    provisioningClient.register() 메서드에서 디바이스 등록을 시도합니다.

  5. 명령 프롬프트에서 다음 명령을 실행하여 샘플에서 사용하는 환경 변수를 설정합니다.

    • 첫 번째 명령은 PROVISIONING_HOST 환경 변수를 전역 디바이스 엔드포인트로 설정합니다. 이 엔드포인트는 모든 DPS 인스턴스에 대해 동일합니다.
    • Azure Portal에서 복사한 ID 범위로 바꿉 <id-scope> 니다.
    • <registration-id>을(를) 디바이스에 대한 고유한 등록 ID 선택에서 선택한 등록 ID로 바꿉니다.
    • <defived-device-key>을(를) 디바이스 키 파생에서 생성한 파생 디바이스 키로 바꿉니다.
    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    
    set PROVISIONING_IDSCOPE=<id-scope>
    
    set PROVISIONING_REGISTRATION_ID=<registration-id>
    
    set PROVISIONING_SYMMETRIC_KEY=<derived-device-key>
    
  6. 다음 명령을 사용하여 샘플 코드를 빌드하고 실행합니다.

     npm install
    
    node register_symkey.js
    
  7. 이제 다음 출력과 비슷하게 표시됩니다. “Hello World” 문자열이 테스트 메시지로 허브에 전송됩니다.

    registration succeeded
    assigned hub=contoso-hub-2.azure-devices.net
    deviceId=sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6
    payload=undefined
    Client connected
    send status: MessageEnqueued
    

샘플 프로비저닝 코드는 다음 작업을 순서대로 수행합니다.

  1. 다음 네 개의 매개 변수를 사용하여 Device Provisioning 리소스로 디바이스를 인증합니다.

    • PROVISIONING_HOST
    • PROVISIONING_IDSCOPE
    • PROVISIONING_REGISTRATION_ID
    • PROVISIONING_SYMMETRIC_KEY
  2. Device Provisioning Service 인스턴스에 이미 연결된 IoT Hub에 디바이스를 할당합니다.

  3. IoT 허브에 테스트 원격 분석 메시지를 보냅니다.

디바이스 정보를 사용하여 프로비저닝 샘플을 업데이트하고 실행하려면:

  1. Device Provisioning Service의 주 메뉴에서 개요를 선택합니다.

  2. ID 범위 값을 복사합니다.

    Screenshot that shows copying the ID scope from the DPS overview pane.

  3. 명령 프롬프트를 열고 샘플 파일, provision_symmetric_key.py가 있는 디렉터리로 이동합니다.

    cd azure-iot-sdk-python\samples\async-hub-scenarios
    
  4. 명령 프롬프트에서 다음 명령을 실행하여 샘플에서 사용하는 환경 변수를 설정합니다.

    • 첫 번째 명령은 PROVISIONING_HOST 환경 변수를 전역 디바이스 엔드포인트로 설정합니다. 이 엔드포인트는 모든 DPS 인스턴스에 대해 동일합니다.
    • Azure Portal에서 복사한 ID 범위로 바꿉 <id-scope> 니다.
    • <registration-id>을(를) 디바이스에 대한 고유한 등록 ID 선택에서 선택한 등록 ID로 바꿉니다.
    • <defived-device-key>을(를) 디바이스 키 파생에서 생성한 파생 디바이스 키로 바꿉니다.
    set PROVISIONING_HOST=global.azure-devices-provisioning.net
    
    set PROVISIONING_IDSCOPE=<id-scope>
    
    set PROVISIONING_REGISTRATION_ID=<registration-id>
    
    set PROVISIONING_SYMMETRIC_KEY=<derived-device-key>
    
  5. 다음 명령을 실행하여 azure-iot-device 라이브러리를 설치합니다.

    pip install azure-iot-device
    
  6. provision_symmetric_key.py에서 Python 샘플 코드를 실행합니다.

    python provision_symmetric_key.py
    
  7. 이제 다음 출력과 비슷하게 표시됩니다. 몇 가지 예제 풍속 원격 분석 메시지도 테스트로 허브에 전송됩니다.

    D:\azure-iot-sdk-python\samples\async-hub-scenarios>python provision_symmetric_key.py
    The complete registration result is
    sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6
    contoso-hub-2.azure-devices.net
    initialAssignment
    null
    Will send telemetry from the provisioned device
    sending message #1
    sending message #2
    sending message #3
    sending message #4
    sending message #5
    sending message #6
    sending message #7
    sending message #8
    sending message #9
    sending message #10
    done sending message #1
    done sending message #2
    done sending message #3
    done sending message #4
    done sending message #5
    done sending message #6
    done sending message #7
    done sending message #8
    done sending message #9
    done sending message #10
    

샘플 프로비저닝 코드는 다음 작업을 순서대로 수행합니다.

  1. 다음 네 개의 매개 변수를 사용하여 Device Provisioning 리소스로 디바이스를 인증합니다.

    • GLOBAL_ENDPOINT
    • SCOPE_ID
    • REGISTRATION_ID
    • SYMMETRIC_KEY
  2. Device Provisioning Service 인스턴스에 이미 연결된 IoT Hub에 디바이스를 할당합니다.

  3. IoT 허브에 테스트 원격 분석 메시지를 보냅니다.

디바이스 정보를 사용하여 프로비저닝 샘플을 업데이트하고 실행하려면:

  1. Device Provisioning Service의 주 메뉴에서 개요를 선택합니다.

  2. ID 범위 값을 복사합니다.

    Screenshot that shows copying the ID scope from the DPS overview pane.

  3. 편집을 위해 Java 디바이스 샘플 코드를 엽니다. 디바이스 샘플 코드에 대한 전체 경로는 다음과 같습니다.

    azure-iot-sdk-java/provisioning/provisioning-samples/provisioning-symmetrickey-individual-sample/src/main/java/samples/com/microsoft/azure/sdk/iot/ProvisioningSymmetricKeyIndividualEnrollmentSample.java

  4. DPS 및 디바이스 등록에 대해 다음 변수의 값을 설정합니다.

    • Azure Portal에서 복사한 ID 범위로 바꿉 [Your scope ID here] 니다.
    • [Your Provisioning Service Global Endpoint here]을(를) 전역 디바이스 엔드포인트: global.azure-devices-provisioning.net로 바꿉니다. 이 엔드포인트는 모든 DPS 인스턴스에 대해 동일합니다.
    • [Enter your Symmetric Key here]을(를) 디바이스 키 파생에서 생성한 파생 디바이스 키로 바꿉니다.
    • [Enter your Registration ID here]을(를) 디바이스에 대한 고유한 등록 ID 선택에서 선택한 등록 ID로 바꿉니다.
    private static final String SCOPE_ID = "[Your scope ID here]";
    private static final String GLOBAL_ENDPOINT = "[Your Provisioning Service Global Endpoint here]";
    private static final String SYMMETRIC_KEY = "[Enter your Symmetric Key here]";
    private static final String REGISTRATION_ID = "[Enter your Registration ID here]";
    

    주의

    이 단계의 경우 파생된 디바이스 키가 각 디바이스의 이미지에 포함된 채로 있으므로 권장되는 보안 모범 사례가 아닙니다. 이러한 이유로 보안과 사용 편의성은 종종 상충합니다. 사용자는 본인의 요구 사항에 따라 디바이스의 보안을 철저히 검토해야 합니다.

  5. 빌드를 위한 명령 프롬프트를 엽니다. Java SDK 리포지토리의 프로비저닝 샘플 프로젝트 폴더로 이동합니다.

    cd azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-symmetrickey-individual-sample
    
  6. 샘플을 빌드합니다.

    mvn clean install
    
  7. target 폴더로 이동하고 만든 .jar 파일을 실행합니다. java 명령에서 {version} 자리 표시자를 컴퓨터의 .jar 파일 이름에 있는 버전으로 바꿉니다.

    cd target
    java -jar ./provisioning-symmetrickey-individual-sample-{version}-with-deps.jar
    
  8. 이제 다음 출력과 비슷하게 표시됩니다.

    Starting...
    Beginning setup.
    WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
    2022-10-07 18:14:48,388 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Initialized a ProvisioningDeviceClient instance using SDK version 2.0.2
    2022-10-07 18:14:48,390 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Starting provisioning thread...
    Waiting for Provisioning Service to register
    2022-10-07 18:14:48,392 INFO (global.azure-devices-provisioning.net-002edcf5-CxnPendingConnectionId-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Opening the connection to device provisioning service...
    2022-10-07 18:14:48,518 INFO (global.azure-devices-provisioning.net-002edcf5-Cxn002edcf5-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Connection to device provisioning service opened successfully, sending initial device registration message
    2022-10-07 18:14:48,521 INFO (global.azure-devices-provisioning.net-002edcf5-Cxn002edcf5-azure-iot-sdk-RegisterTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.RegisterTask] - Authenticating with device provisioning service using symmetric key
    2022-10-07 18:14:49,252 INFO (global.azure-devices-provisioning.net-002edcf5-Cxn002edcf5-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Waiting for device provisioning service to provision this device...
    2022-10-07 18:14:49,253 INFO (global.azure-devices-provisioning.net-002edcf5-Cxn002edcf5-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Current provisioning status: ASSIGNING
    2022-10-07 18:14:52,459 INFO (global.azure-devices-provisioning.net-002edcf5-Cxn002edcf5-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Device provisioning service assigned the device successfully
    IotHUb Uri : contoso-hub-2.azure-devices.net
    Device ID : sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6
    2022-10-07 18:14:58,424 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
    2022-10-07 18:14:58,436 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
    2022-10-07 18:14:58,440 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.1.1
    2022-10-07 18:14:58,450 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection...
    2022-10-07 18:14:58,471 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet...
    2022-10-07 18:14:59,314 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged
    2022-10-07 18:14:59,315 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6/messages/devicebound/#
    2022-10-07 18:14:59,378 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6/messages/devicebound/# was acknowledged
    2022-10-07 18:14:59,379 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully
    2022-10-07 18:14:59,381 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established
    2022-10-07 18:14:59,383 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK
    2022-10-07 18:14:59,389 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads
    2022-10-07 18:14:59,392 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details
    2022-10-07 18:14:59,395 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully
    2022-10-07 18:14:59,404 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully
    Sending message from device to IoT Hub...
    2022-10-07 18:14:59,408 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Message was queued to be sent later ( Message details: Correlation Id [32cf12c4-4db1-4562-9d8c-267c0506636f] Message Id [2e1717be-cfcf-41a7-b1c0-59edeb8ea865] )
    Press any key to exit...
    2022-10-07 18:14:59,409 DEBUG (contoso-hub-2.azure-devices.net-sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6-c32c76d0-Cxn0e70bbf7-8476-441d-8626-c17250585ee6-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Sending message ( Message details: Correlation Id [32cf12c4-4db1-4562-9d8c-267c0506636f] Message Id [2e1717be-cfcf-41a7-b1c0-59edeb8ea865] )
    2022-10-07 18:14:59,777 DEBUG (MQTT Call: sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - IotHub message was acknowledged. Checking if there is record of sending this message ( Message details: Correlation Id [32cf12c4-4db1-4562-9d8c-267c0506636f] Message Id [2e1717be-cfcf-41a7-b1c0-59edeb8ea865] )
    2022-10-07 18:14:59,779 DEBUG (contoso-hub-2.azure-devices.net-sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6-c32c76d0-Cxn0e70bbf7-8476-441d-8626-c17250585ee6-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking the callback function for sent message, IoT Hub responded to message ( Message details: Correlation Id [32cf12c4-4db1-4562-9d8c-267c0506636f] Message Id [2e1717be-cfcf-41a7-b1c0-59edeb8ea865] ) with status OK
    Message received! Response status: OK
    

디바이스 프로비저닝 등록 확인

이 자습서에서는 정적 구성 할당 정책을 사용하여 등록 그룹을 통해 등록하는 디바이스를 동일한 IoT 허브에 할당했습니다. 그러나 디바이스가 여러 IoT 허브 중 하나에 프로비전될 수 있는 할당의 경우 등록 그룹의 등록 레코드를 검사하여 디바이스가 프로비전된 IoT 허브를 확인할 수 있습니다.

  1. Azure Portal에서 DPS 인스턴스로 이동합니다.

  2. 설정 메뉴에서 등록 관리를 선택합니다.

  3. 등록 그룹을 선택합니다.

  4. 이 자습서를 위해 만든 등록 그룹을 선택합니다.

  5. 등록 그룹 세부 정보 페이지에서 등록 상태를 선택합니다.

  6. 사용자 디바이스에서 디바이스 ID 열의 디바이스 ID를 찾고 할당된 IoT 허브 열에서 IoT 허브를 적어 둡니다.

    디바이스 레코드를 선택하여 디바이스에 할당된 초기 트윈과 같은 자세한 정보를 볼 수 있습니다.

IoT 허브에서 디바이스를 확인하려면 다음을 수행합니다.

  1. Azure Portal에서 디바이스가 할당된 IoT 허브로 이동합니다.

  2. 디바이스 관리 메뉴에서 디바이스를 선택합니다.

  3. 디바이스가 성공적으로 프로비전된 경우 상태사용으로 설정된 디바이스 ID가 목록에 표시됩니다. 디바이스가 표시되지 않으면 새로 고침을 선택합니다.

    Device is registered with the IoT hub

참고 항목

등록 그룹의 기본값으로부터 초기 디바이스 쌍 상태를 변경한 경우, 허브에서 원하는 쌍 상태를 가져와서 그에 맞게 작동할 수 있습니다. 자세한 내용은 IoT Hub의 디바이스 쌍 이해 및 사용을 참조하세요.

더 많은 디바이스 프로비전

등록 그룹을 통해 더 많은 디바이스를 프로비전하려면 이전 섹션의 단계에 따라 다음을 수행합니다.

  1. 디바이스에 대한 고유한 등록 ID를 선택합니다.

  2. 디바이스 키 파생. 이전에 했던 것처럼 등록 그룹의 기본 키를 그룹 키로 사용합니다.

  3. 디바이스 프로비저닝 코드 실행. 필요한 아티팩트를 새 파생 디바이스 키 및 등록 ID로 바꿉니다.

리소스 정리

디바이스 클라이언트 샘플을 계속해서 작업하고 검색할 계획인 경우 이 자습서에서 만든 리소스를 정리하지 마세요. 계속하지 않으려는 경우 다음 단계를 사용하여 이 자습서에서 만든 모든 리소스를 삭제합니다.

등록 그룹을 삭제합니다

등록 그룹을 삭제해도 등록 그룹과 연결된 등록 레코드는 삭제되지 않습니다. 이러한 분리된 레코드는 DPS 인스턴스의 등록 할당량 에 대해 계산됩니다. 이러한 이유로 등록 그룹 자체를 삭제하기 전에 등록 그룹과 연결된 모든 등록 레코드를 삭제하는 것이 가장 좋습니다.

  1. Azure Portal에서 DPS 인스턴스로 이동합니다.

  2. 설정 메뉴에서 등록 관리를 선택합니다.

  3. 등록 그룹 탭을 선택합니다.

  4. 이 자습서에 사용한 등록 그룹의 이름을 선택하여 세부 정보 페이지를 엽니다.

  5. 등록 세부 정보 페이지에서 등록 상태를 선택합니다. 그런 다음 디바이스 ID 열 머리글 옆에 있는 확인란을 선택하여 등록 그룹에 대한 모든 등록 레코드를 선택합니다. 페이지 맨 위에서 삭제를 선택하여 등록 레코드를 삭제합니다.

  6. 등록 관리 페이지로 다시 돌아갑니다.

  7. 이 자습서에서 사용한 등록 그룹의 이름 옆에 있는 확인란을 선택합니다.

  8. 페이지 위쪽에서 삭제를 선택합니다.

IoT Hub에서 디바이스 등록 삭제

  1. Azure Portal에서 디바이스가 할당된 IoT 허브로 이동합니다.

  2. 탐색 메뉴의 장치 관리 섹션에서 장치를 선택합니다.

  3. 이 자습서에서 등록한 디바이스의 디바이스 ID 옆에 있는 확인란을 선택합니다.

  4. 페이지 위쪽에서 삭제를 선택합니다.

다음 단계

이 자습서에서는 등록 그룹을 사용하여 여러 디바이스를 단일 IoT 허브에 프로비전했습니다. 다음으로, 여러 허브에서 IoT 디바이스를 프로비전하는 방법을 알아봅니다.