Azure IoT Hub 모듈 ID 및 모듈 쌍 시작(.NET)

모듈 ID 및 모듈 쌍은 Azure IoT Hub 디바이스 ID 및 디바이스 쌍과 비슷하지만 더 자세한 세분성을 제공합니다. Azure IoT Hub 장치 ID와 장치 쌍은 백 엔드 응용 프로그램에서 장치를 구성할 수 있도록 하고 장치 상태를 표시하는 반면, 모듈 ID와 모듈 쌍은 장치의 개별 구성 요소에 대해 해당 기능을 제공합니다. 운영 체제 디바이스 또는 펌웨어 디바이스와 같이 여러 구성 요소가 있는 가능한 디바이스에서 모듈 ID와 모듈 쌍은 각 구성 요소에 대해 격리된 구성과 상태를 허용합니다.

참고 항목

이 문서에서 설명하는 기능은 IoT Hub의 표준 계층에서만 사용할 수 있습니다. 기본 및 표준/무료 IoT Hub 계층에 대한 자세한 내용은 솔루션에 적합한 IoT Hub 계층 선택을 참조하세요.

이 문서를 마치면 다음과 같은 두 개의 .NET 콘솔 앱이 생깁니다.

  • CreateIdentities: 디바이스 ID, 모듈 ID 및 관련 보안 키를 만들어 디바이스 및 모듈 클라이언트를 연결합니다.

  • UpdateModuleTwinReportedProperties: 업데이트된 모듈 쌍 reported 속성을 IoT 허브에 보냅니다.

참고 항목

디바이스 및 백 엔드 앱을 빌드하는 데 사용할 수 있는 SDK 도구에 대한 자세한 내용은 Azure IoT SDK를 참조하세요.

필수 조건

  • Visual Studio.

  • IoT 허브. CLI 또는 Azure Portal을 사용하여 만듭니다.

모듈 인증

대칭 키 또는 X.509 인증서를 사용하여 모듈 ID를 인증할 수 있습니다. X.509 인증서 인증의 경우 모듈의 인증서에는 반드시CN=<deviceid>/<moduleid>와 같은 형식의 CN(일반 이름)이 있어야 합니다. 예시:

openssl req -new -key d1m1.key.pem -out d1m1.csr -subj "/CN=device01\/module01"

IoT Hub 연결 문자열 가져오기

이 문서에서는 ID 레지스트리에서 디바이스를 추가한 다음, 해당 디바이스에 모듈을 추가하는 백 엔드 서비스를 만듭니다. 서비스에 레지스트리 쓰기 권한이 필요합니다. 기본적으로 모든 IoT 허브는 이 권한을 부여하는 registryReadWrite라는 공유 액세스 정책을 사용하여 만듭니다.

registryReadWrite 정책에 대한 IoT Hub 연결 문자열을 가져오려면 다음 단계를 수행합니다.

  1. Azure Portal에서 리소스 그룹을 선택합니다. 허브가 있는 리소스 그룹을 선택한 다음, 리소스 목록에서 허브를 선택합니다.

  2. 허브의 왼쪽 창에서 공유 액세스 정책을 선택합니다.

  3. 정책 목록에서 registryReadWrite 정책을 선택합니다.

  4. 기본 연결 문자열을 복사하고 값을 저장합니다.

    Screen capture that shows how to retrieve the connection string

IoT Hub 공유 액세스 정책 및 사용 권한에 대한 자세한 내용은 액세스 제어 및 권한을 참조하세요.

모듈 ID 만들기

이 섹션에서는 허브의 ID 레지스트리에서 디바이스 ID 및 모듈 ID를 만드는 .NET 콘솔 앱을 만듭니다. ID 레지스트리에 항목이 없는 경우 디바이스 또는 모듈을 허브에 연결할 수 없습니다. 자세한 내용은 IoT Hub 개발자 가이드의 ID 레지스트리 섹션을 참조하세요.

이 콘솔 앱을 실행하면 디바이스 및 모듈 둘 다의 고유한 ID 및 키가 생성됩니다. 디바이스 및 모듈은 IoT Hub에 디바이스-클라우드 메시지를 보낼 때 이러한 값을 사용하여 자신을 식별합니다. ID는 대/소문자를 구분합니다.

  1. Visual Studio를 열고 새 프로젝트 만들기를 선택합니다.

  2. 새 프로젝트 만들기에서 C#에 대해 콘솔 앱(.NET Framework)을 선택합니다.

  3. 다음을 선택하여 새 프로젝트 구성을 엽니다. 프로젝트 이름을 CreateIdentities로 지정한 후 다음을 선택합니다.

    Screenshot that shows the 'Configure your new project' popup with 'CreateIdentities'.

  4. 기본 .NET Framework 옵션을 유지하고 만들기를 선택하여 프로젝트를 만듭니다.

  5. Visual Studio에서 도구>NuGet 패키지 관리자>솔루션용 NuGet 패키지 관리를 엽니다. 찾아보기 탭을 선택합니다.

  6. Microsoft.Azure.Devices를 검색합니다. 이를 선택한 후 설치를 선택합니다.

    Install Azure IoT Hub .NET service SDK current version

  7. Program.cs 파일 위에 다음 using 문을 추가합니다.

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Common.Exceptions;
    
  8. Program 클래스에 다음 필드를 추가합니다. 자리 표시자 값을 이전 섹션에서 만든 허브의 IoT Hub 연결 문자열로 대체합니다.

    const string connectionString = "<replace_with_iothub_connection_string>";
    const string deviceID = "myFirstDevice";
    const string moduleID = "myFirstModule";
    
  9. Main 클래스에 다음 코드를 추가합니다.

    static void Main(string[] args)
    {
        AddDeviceAsync().Wait();
        AddModuleAsync().Wait();
    }
    
  10. Program 클래스에 다음 메서드를 추가합니다.

    private static async Task AddDeviceAsync()
    {
       RegistryManager registryManager = 
         RegistryManager.CreateFromConnectionString(connectionString);
       Device device;
    
       try
       {
           device = await registryManager.AddDeviceAsync(new Device(deviceID));
       }
       catch (DeviceAlreadyExistsException)
        {
            device = await registryManager.GetDeviceAsync(deviceID);
        }
    
        Console.WriteLine("Generated device key: {0}", 
          device.Authentication.SymmetricKey.PrimaryKey);
    }
    
    private static async Task AddModuleAsync()
    {
        RegistryManager registryManager = 
          RegistryManager.CreateFromConnectionString(connectionString);
        Module module;
    
        try
        {
            module = 
              await registryManager.AddModuleAsync(new Module(deviceID, moduleID));
        }
        catch (ModuleAlreadyExistsException)
        {
            module = await registryManager.GetModuleAsync(deviceID, moduleID);
        }
    
        Console.WriteLine("Generated module key: {0}", module.Authentication.SymmetricKey.PrimaryKey);
    }
    

    AddDeviceAsync 메서드는 ID myFirstDevice로 디바이스 ID를 만듭니다. ID 레지스트리에 해당 디바이스 ID가 이미 있는 경우 코드는 기존 디바이스 정보만 검색합니다. 그러면 앱에서 해당 ID에 대한 기본 키를 표시합니다. 이 키를 시뮬레이션된 디바이스 앱에서 사용하여 허브에 연결합니다.

    AddModuleAsync 메서드는 myFirstDevice 디바이스에서 ID가 myFirstModule인 모듈 ID를 만듭니다. ID 레지스트리에 해당 모듈 ID가 이미 있는 경우 코드는 기존 모듈 정보만 검색합니다. 그러면 앱에서 해당 ID에 대한 기본 키를 표시합니다. 이 키를 시뮬레이션된 모듈 앱에서 사용하여 허브에 연결합니다.

    Important

    고객 지원 및 문제 해결을 위해 수집한 로그에 디바이스 ID를 표시할 수 있으므로 이름을 지정하는 동안 중요한 정보를 피해야 합니다.

  11. 이 앱을 실행하고 디바이스 키 및 모듈 키를 기록합니다.

참고 항목

IoT Hub ID 레지스트리는 디바이스 및 모듈 ID만 저장하여 허브에 보안 액세스를 사용합니다. ID 레지스트리는 보안 자격 증명으로 사용할 디바이스 ID 및 키를 저장합니다. 또한 ID 레지스트리는 각 디바이스에 대한 액세스를 사용하지 않도록 설정하는 데 사용할 수 있는 해당 디바이스에 대한 enabled/disabled 플래그를 저장합니다. 앱이 다른 디바이스별 메타데이터를 저장해야 할 경우 애플리케이션별 스토리지를 사용해야 합니다. 모듈 ID에 대한 enabled/disabled 플래그는 없습니다. 자세한 내용은 IoT Hub 개발자 가이드를 참조하세요.

.NET 디바이스 SDK를 사용하여 모듈 쌍 업데이트

이제 시뮬레이션된 디바이스에서 클라우드와 통신해 보겠습니다. 모듈 ID가 만들어지면 모듈 쌍이 IoT Hub에서 암시적으로 생성됩니다. 이 섹션에서는 시뮬레이션된 디바이스에 모듈 쌍 reported 속성을 업데이트하는 .NET 콘솔 앱을 만듭니다.

모듈 연결 문자열을 검색하려면 IoT 허브로 이동한 다음, 디바이스를 선택합니다. myFirstDevice를 찾아서 선택하여 연 다음, myFirstModule을 선택하여 엽니다. 모듈 ID 세부 정보에서 연결 문자열(기본 키)을 복사하고 콘솔 앱에 저장합니다.

Screenshot that shows the 'Module Identity Details' page.

  1. Visual Studio에서 파일>신규>프로젝트를 선택하여 새 프로젝트를 솔루션에 추가합니다. 새 프로젝트 만들기에서 콘솔 앱(.NET Framework)을 선택하고 다음을 선택합니다.

  2. 새 프로젝트 구성에서 UpdateModuleTwinReportedProperties를 프로젝트 이름으로 지정한 후 다음을 선택합니다.

    Screenshot that shows the 'Configure your new project' popup.

  3. 기본 .NET Framework 옵션을 유지하고 만들기를 선택하여 프로젝트를 만듭니다.

  4. Visual Studio에서 도구>NuGet 패키지 관리자>솔루션용 NuGet 패키지 관리를 엽니다. 찾아보기 탭을 선택합니다.

  5. Microsoft.Azure.Devices.Client를 검색하여 선택하고 설치를 선택합니다.

    Screenshot that shows the 'Microsoft.Azure.Devices.Client' selected and the 'Install' button highlighted.

  6. Program.cs 파일 위에 다음 using 문을 추가합니다.

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    
  7. Program 클래스에 다음 필드를 추가합니다. 자리 표시자 값을 모듈 연결 문자열로 바꿉니다.

    private const string ModuleConnectionString = "<Your module connection string>";
    private static ModuleClient Client = null;
    static void ConnectionStatusChangeHandler(ConnectionStatus status, 
      ConnectionStatusChangeReason reason)
    {
        Console.WriteLine("Connection Status Changed to {0}; the reason is {1}", 
          status, reason);
    }
    
  8. Program 클래스에 OnDesiredPropertyChanged 메서드를 추가합니다.

    private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, 
      object userContext)
        {
            Console.WriteLine("desired property change:");
            Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
            Console.WriteLine("Sending current time as reported property");
            TwinCollection reportedProperties = new TwinCollection
            {
                ["DateTimeLastDesiredPropertyChangeReceived"] = DateTime.Now
            };
    
            await Client.UpdateReportedPropertiesAsync(reportedProperties).ConfigureAwait(false);
        }
    
  9. Main 메서드에 다음 줄을 추가합니다.

    static void Main(string[] args)
    {
        Microsoft.Azure.Devices.Client.TransportType transport = 
          Microsoft.Azure.Devices.Client.TransportType.Amqp;
    
        try
        {
            Client = 
              ModuleClient.CreateFromConnectionString(ModuleConnectionString, transport);
            Client.SetConnectionStatusChangesHandler(ConnectionStatusChangeHandler);
            Client.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null).Wait();
    
            Console.WriteLine("Retrieving twin");
            var twinTask = Client.GetTwinAsync();
            twinTask.Wait();
            var twin = twinTask.Result;
            Console.WriteLine(JsonConvert.SerializeObject(twin.Properties)); 
    
            Console.WriteLine("Sending app start time as reported property");
            TwinCollection reportedProperties = new TwinCollection();
            reportedProperties["DateTimeLastAppLaunch"] = DateTime.Now;
    
            Client.UpdateReportedPropertiesAsync(reportedProperties);
        }
        catch (AggregateException ex)
        {
            Console.WriteLine("Error in sample: {0}", ex);
        }
    
        Console.WriteLine("Waiting for Events.  Press enter to exit...");
        Console.ReadLine();
        Client.CloseAsync().Wait();
    }
    

    이제 AMQP 프로토콜을 사용하여 모듈 쌍을 검색하고 reported 속성을 업데이트할 수 있습니다.

  10. 필요에 따라 Main 메서드에 이러한 문을 추가하여 모듈에서 IoT Hub 이벤트를 보낼 수 있습니다. try catch블록 아래에 다음 줄을 추가합니다.

    Byte[] bytes = new Byte[2];
    bytes[0] = 0;
    bytes[1] = 1;
    var sendEventsTask = Client.SendEventAsync(new Message(bytes));
    sendEventsTask.Wait();
    Console.WriteLine("Event sent to IoT Hub.");
    

앱 실행

이제 앱을 실행할 수 있습니다.

  1. 솔루션 탐색기의 Visual Studio에서 솔루션을 마우스 오른쪽 단추로 클릭하고 시작 프로젝트 설정을 선택합니다.

  2. 공용 속성에서 시작 프로젝트를 선택합니다.

  3. 여러 시작 프로젝트를 선택한 다음, 앱에 대한 작업으로 시작을 선택하고, 변경 내용을 적용하려면 OK를 선택합니다.

  4. F5 키를 눌러 앱을 시작합니다.

다음 단계

계속해서 IoT Hub을 시작하고 다른 IoT 시나리오를 탐색하려면 다음을 참조하세요.