Share via


IoT Hub 모듈 ID 및 모듈 쌍 시작(Python)

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

참고 항목

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

이 문서의 끝에 세 가지 Python 앱이 있습니다.

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

  • UpdateModuleTwinDesiredProperties: 업데이트된 모듈 쌍의 desired 속성을 IoT Hub에 보냅니다.

  • ReceiveModuleTwinDesiredPropertiesPatch: 디바이스에서 모듈 쌍의 desired 속성 패치를 받습니다.

참고 항목

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

필수 조건

  • 활성 Azure 계정. 계정이 없는 경우 몇 분 만에 무료 계정을 만들 수 있습니다.

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

  • Python 버전 3.7 이상을 사용하는 것이 좋습니다. 설치 프로그램의 요구 사항에 따라 32비트 또는 64비트 설치를 사용해야 합니다. 설치하는 동안 메시지가 나타나면 플랫폼별 환경 변수에 Python을 추가해야 합니다.

모듈 인증

대칭 키 또는 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 레지스트리에서 디바이스를 추가한 다음, 해당 디바이스에 모듈을 추가하는 백 엔드 서비스를 만듭니다. 이 서비스를 사용하려면 레지스트리 쓰기 권한(레지스트리 읽기 권한도 포함됨)이 필요합니다. 또한 새로 만든 모듈의 모듈 쌍에 desired 속성을 추가하는 서비스를 만듭니다. 이 서비스를 사용하려면 서비스 연결 권한이 필요합니다. 권한을 개별적으로 부여하는 기본 공유 액세스 정책이 있지만 이 섹션에서는 두 권한을 모두 포함하는 사용자 지정 공유 액세스 정책을 만듭니다.

서비스 연결레지스트리 쓰기 권한을 부여하는 공유 액세스 정책을 만들고 이 정책에 대한 연결 문자열을 가져오려면 다음 단계를 수행합니다.

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

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

  3. 정책 목록 위의 메뉴에서 공유 액세스 정책 추가를 선택합니다.

  4. 공유 액세스 정책 추가에서 정책에 사용할 설명형 이름(예: serviceAndRegistryReadWrite)을 입력합니다. 권한에서 레지스트리 쓰기서비스 연결을 선택한 다음, 추가를 선택합니다. (레지스트리 읽기 권한은 레지스트리 쓰기를 선택하면 자동으로 포함됩니다.)

    Screen capture that shows how to add a new shared access policy

  5. 정책 목록에서 새 정책을 선택합니다.

  6. 공유 액세스 키에서 기본 연결 문자열에 대한 복사 아이콘을 선택하고 값을 저장합니다.

    Screen capture that shows how to retrieve the connection string

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

IoT Hub에서 디바이스 ID 및 모듈 ID 만들기

이 섹션에서는 IoT 허브의 ID 레지스트리에 디바이스 ID 및 모듈 ID를 만드는 Python 서비스 앱을 만듭니다. ID 레지스트리에 항목이 없는 경우 디바이스 또는 모듈을 IoT 허브에 연결할 수 없습니다. 자세한 내용은 IoT 허브의 ID 레지스트리 이해를 참조하세요. 이 콘솔 앱을 실행하면 디바이스 및 모듈 둘 다의 고유한 ID 및 키가 생성됩니다. ID 및 키는 대/소문자를 구분합니다. 디바이스 및 모듈은 IoT Hub에 디바이스-클라우드 메시지를 보낼 때 이러한 값을 사용하여 자신을 식별합니다.

  1. 명령 프롬프트에서 다음 명령을 실행하여 azure-iot-hub 패키지를 설치합니다.

    pip install azure-iot-hub
    
  2. 명령 프롬프트에서 다음 명령을 실행하여 msrest 패키지를 설치합니다. HTTPOperationError 예외를 catch하려면 이 패키지가 필요합니다.

    pip install msrest
    
  3. 텍스트 편집기를 사용하여 작업 디렉터리에 CreateModule.py라는 파일을 만듭니다.

  4. Python 파일에 다음 코드를 추가합니다. IoT 허브 연결 문자열 가져오기에서 복사한 연결 문자열로 YourIoTHubConnectionString을 바꿉니다.

    import sys
    from msrest.exceptions import HttpOperationError
    from azure.iot.hub import IoTHubRegistryManager
    
    CONNECTION_STRING = "YourIotHubConnectionString"
    DEVICE_ID = "myFirstDevice"
    MODULE_ID = "myFirstModule"
    
    try:
        # RegistryManager
        iothub_registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
        try:
            # CreateDevice - let IoT Hub assign keys
            primary_key = ""
            secondary_key = ""
            device_state = "enabled"
            new_device = iothub_registry_manager.create_device_with_sas(
                DEVICE_ID, primary_key, secondary_key, device_state
            )
        except HttpOperationError as ex:
            if ex.response.status_code == 409:
                # 409 indicates a conflict. This happens because the device already exists.
                new_device = iothub_registry_manager.get_device(DEVICE_ID)
            else:
                raise
    
        print("device <" + DEVICE_ID +
              "> has primary key = " + new_device.authentication.symmetric_key.primary_key)
    
        try:
            # CreateModule - let IoT Hub assign keys
            primary_key = ""
            secondary_key = ""
            managed_by = ""
            new_module = iothub_registry_manager.create_module_with_sas(
                DEVICE_ID, MODULE_ID, managed_by, primary_key, secondary_key
            )
        except HttpOperationError as ex:
            if ex.response.status_code == 409:
                # 409 indicates a conflict. This happens because the module already exists.
                new_module = iothub_registry_manager.get_module(DEVICE_ID, MODULE_ID)
            else:
                raise
    
        print("device/module <" + DEVICE_ID + "/" + MODULE_ID +
              "> has primary key = " + new_module.authentication.symmetric_key.primary_key)
    
    except Exception as ex:
        print("Unexpected error {0}".format(ex))
    except KeyboardInterrupt:
        print("IoTHubRegistryManager sample stopped")
    
  5. 명령 프롬프트에서 다음 명령을 실행합니다.

    python CreateModule.py
    

이 앱은 ID가 myFirstDevice인 디바이스 ID와 ID가 myFirstModule인 모듈 ID를 myFirstDevice 디바이스 아래에 만듭니다. (디바이스 또는 모듈 ID가 ID 레지스트리에 이미 있는 경우 코드는 기존 디바이스 또는 모듈 정보만 검색함) 앱은 ID와 각 ID의 기본 키를 표시합니다.

참고 항목

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

Python 서비스 SDK를 사용하여 모듈 쌍 업데이트

이 섹션에서는 모듈 쌍의 desired 속성을 업데이트하는 Python 서비스 앱을 만듭니다.

  1. 명령 프롬프트에서 다음 명령을 실행하여 azure-iot-hub 패키지를 설치합니다. 이전 섹션에서 azure-iot-hub 패키지를 설치한 경우 이 단계를 건너뛰어도 됩니다.

    pip install azure-iot-hub
    
  2. 텍스트 편집기를 사용하여 작업 디렉터리에 UpdateModuleTwinDesiredProperties.py라는 파일을 만듭니다.

  3. Python 파일에 다음 코드를 추가합니다. IoT 허브 연결 문자열 가져오기에서 복사한 연결 문자열로 YourIoTHubConnectionString을 바꿉니다.

    import sys
    from azure.iot.hub import IoTHubRegistryManager
    from azure.iot.hub.models import Twin, TwinProperties
    
    CONNECTION_STRING = "YourIoTHubConnectionString"
    DEVICE_ID = "myFirstDevice"
    MODULE_ID = "myFirstModule"
    
    try:
        # RegistryManager
        iothub_registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
        module_twin = iothub_registry_manager.get_module_twin(DEVICE_ID, MODULE_ID)
        print ( "" )
        print ( "Module twin properties before update    :" )
        print ( "{0}".format(module_twin.properties) )
    
        # Update twin
        twin_patch = Twin()
        twin_patch.properties = TwinProperties(desired={"telemetryInterval": 122})
        updated_module_twin = iothub_registry_manager.update_module_twin(
            DEVICE_ID, MODULE_ID, twin_patch, module_twin.etag
        )
        print ( "" )
        print ( "Module twin properties after update     :" )
        print ( "{0}".format(updated_module_twin.properties) )
    
    except Exception as ex:
        print ( "Unexpected error {0}".format(ex) )
    except KeyboardInterrupt:
        print ( "IoTHubRegistryManager sample stopped" )
    

디바이스 쪽에서 업데이트

이 섹션에서는 디바이스에서 모듈 쌍의 desired 속성 업데이트를 가져오는 Python 앱을 만듭니다.

  1. 모듈 연결 문자열을 가져옵니다. Azure Portal에서 IoT Hub로 이동한 다음, 왼쪽 창에서 디바이스를 선택합니다. 디바이스 목록에서 myFirstDevice를 선택하고 엽니다. 모듈 ID에서 myFirstModule을 선택합니다. 연결 문자열(기본 키)의 복사 아이콘을 선택합니다. 다음 단계에서 이 연결 문자열이 필요합니다.

    Screenshot of the Module Identity Details page in the Azure portal.

  2. 명령 프롬프트에서 다음 명령을 실행하여 azure-iot-device 패키지를 설치합니다.

    pip install azure-iot-device
    
  3. 텍스트 편집기를 사용하여 작업 디렉터리에 ReceiveModuleTwinDesiredPropertiesPatch.py라는 파일을 만듭니다.

  4. Python 파일에 다음 코드를 추가합니다. 1단계에서 복사한 모듈 연결 문자열로 YourModuleConnectionString을 바꿉니다.

    import time
    from azure.iot.device import IoTHubModuleClient
    
    CONNECTION_STRING = "YourModuleConnectionString"
    
    
    def twin_patch_handler(twin_patch):
        print("")
        print("Twin desired properties patch received:")
        print(twin_patch)
    
    
    def main():
        print ("Starting the IoT Hub Python sample...")
        client = IoTHubModuleClient.create_from_connection_string(CONNECTION_STRING)
    
        print ("Waiting for commands, press Ctrl-C to exit")
        try:
            # Attach the handler to the client
            client.on_twin_desired_properties_patch_received = twin_patch_handler
    
            while True:
                time.sleep(1000)
        except KeyboardInterrupt:
            print("IoTHubModuleClient sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
    if __name__ == '__main__':
        main()
    

앱 실행

이 섹션에서는 ReceiveModuleTwinDesiredPropertiesPatch 디바이스 앱을 실행한 다음 UpdateModuleTwinDesiredProperties 서비스 앱을 실행하여 모듈의 desired 속성을 업데이트합니다.

  1. 명령 프롬프트를 열고 디바이스 앱을 실행합니다.

    python ReceiveModuleTwinDesiredPropertiesPatch.py
    

    Device app initial output

  2. 새 명령 프롬프트를 열고 서비스 앱을 실행합니다.

    python UpdateModuleTwinDesiredProperties.py
    

    TelemetryInterval desired 속성이 서비스 앱 출력의 업데이트된 모듈 쌍에 표시되는지 확인합니다.

    Service app output

    디바이스 앱 출력에서 받은 desired 속성 패치에 동일한 속성이 표시됩니다.

    Device app output shows desired properties patch

다음 단계

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