다음을 통해 공유


IoT Hub(Python)를 사용하여 클라우드-디바이스 메시지 보내기

Azure IoT Hub는 수백만 개의 디바이스와 솔루션 백 엔드 간에 안정적이고 안전한 양방향 통신이 가능하도록 지원하는 완전히 관리되는 서비스입니다.

이 문서는 다음을 수행하는 방법을 보여줍니다.

  • IoT Hub를 통해 C2D(클라우드-디바이스) 메시지를 솔루션 백 엔드에서 단일 디바이스로 전송

  • 디바이스에서 클라우드-디바이스 메시지를 받습니다.

참고 항목

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

이 문서의 끝에서 두 개의 Python 콘솔 앱을 실행합니다.

  • SimulatedDevice.py: IoT 허브에 연결하고 클라우드-디바이스 메시지를 수신하는 디바이스를 시뮬레이션합니다.

  • SendCloudToDeviceMessage.py: IoT Hub를 통해 시뮬레이션된 디바이스 앱에 클라우드-디바이스 메시지를 보냅니다.

클라우드-디바이스 메시지에 대해 자세히 알아보려면 IoT 허브에서 클라우드-디바이스 메시지 보내기를 참조하세요.

참고 항목

IoT Hub는 Azure IoT 디바이스 SDK를 통해 다양한 디바이스 플랫폼 및 언어(C, Java, Python 및 JavaScript)에 대한 SDK 지원을 제공합니다.

필수 조건

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

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

  • IoT Hub에 등록된 디바이스. IoT 허브에 디바이스가 없으면 디바이스 등록의 단계를 따릅니다.

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

  • 방화벽에서 포트 8883이 열려 있는지 확인합니다. 이 문서의 디바이스 샘플은 포트 8883을 통해 통신하는 MQTT 프로토콜을 사용합니다. 이 포트는 일부 회사 및 교육용 네트워크 환경에서 차단될 수 있습니다. 이 문제를 해결하는 자세한 내용과 방법은 IoT Hub에 연결(MQTT)을 참조하세요.

시뮬레이션된 디바이스 앱에서 메시지 수신

이 섹션에서는 디바이스를 시뮬레이션하고 IoT Hub에서 클라우드-디바이스 메시지를 수신하는 Python 콘솔 앱을 만듭니다.

  1. 작업 디렉터리의 명령 프롬프트에서 Python용 Azure IoT Hub 디바이스 SDK를 설치합니다.

    pip install azure-iot-device
    
  2. 텍스트 편집기를 사용하여 SimulatedDevice.py 파일을 만듭니다.

  3. SimulatedDevice.py 파일의 시작 부분에 다음 import 문 및 변수를 추가합니다.

    import time
    from azure.iot.device import IoTHubDeviceClient
    
    RECEIVED_MESSAGES = 0
    
  4. 다음 코드를 SimulatedDevice.py 파일에 추가합니다. {deviceConnectionString} 자리 표시자 값을 필수 구성 요소에서 등록된 디바이스의 연결 문자열로 바꿉니다.

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. 수신된 메시지를 콘솔에 인쇄하는 데 사용하는 다음 함수를 정의합니다.

    def message_handler(message):
        global RECEIVED_MESSAGES
        RECEIVED_MESSAGES += 1
        print("")
        print("Message received:")
    
        # print data from both system and application (custom) properties
        for property in vars(message).items():
            print ("    {}".format(property))
    
        print("Total calls received: {}".format(RECEIVED_MESSAGES))
    
  6. 다음 코드를 추가하여 클라이언트를 초기화하고 클라우드-디바이스 메시지를 수신하기 위해 대기합니다.

    def main():
        print ("Starting the Python IoT Hub C2D Messaging device sample...")
    
        # Instantiate the client
        client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        print ("Waiting for C2D messages, press Ctrl-C to exit")
        try:
            # Attach the handler to the client
            client.on_message_received = message_handler
    
            while True:
                time.sleep(1000)
        except KeyboardInterrupt:
            print("IoT Hub C2D Messaging device sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
  7. 다음 main 함수를 추가합니다.

    if __name__ == '__main__':
        main()
    
  8. SimulatedDevice.py 파일을 저장하고 닫습니다.

클라우드-디바이스 메시지 수명 주기 및 IoT Hub가 클라우드-디바이스 메시지를 처리하는 방법에 대한 자세한 내용은 IoT 허브에서 클라우드-디바이스 메시지 보내기를 참조하세요.

IoT Hub 연결 문자열 가져오기

이 문서에서는 IoT Hub를 통해 클라우드-디바이스 메시지를 보내도록 백 엔드 서비스를 만듭니다. 클라우드-디바이스 메시지를 보내려면 서비스에 서비스 연결 권한이 있어야 합니다. 기본적으로 모든 IoT Hub는 이 사용 권한을 부여하는 service라는 공유 액세스 정책을 사용하여 만듭니다.

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

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

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

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

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

Azure Portal의 IoT Hub에서 연결 문자열을 검색하는 방법을 보여 주는 스크린샷.

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

클라우드-디바이스 메시지 보내기

이 섹션에서는 클라우드-디바이스 메시지를 시뮬레이션된 디바이스 앱으로 보내는 Python 콘솔 응용 프로그램을 만듭니다. 디바이스의 디바이스 ID 및 IoT 허브 연결 문자열이 필요합니다.

  1. 작업 디렉터리에서 명령 프롬프트를 열고 Python용 Azure IoT Hub 서비스 SDK를 설치합니다.

    pip install azure-iot-hub
    
  2. 텍스트 편집기를 사용하여 SendCloudToDeviceMessage.py 파일을 만듭니다.

  3. SendCloudToDeviceMessage.py 파일 앞에 다음 import 문 및 변수를 추가합니다.

    import random
    import sys
    from azure.iot.hub import IoTHubRegistryManager
    
    MESSAGE_COUNT = 2
    AVG_WIND_SPEED = 10.0
    MSG_TXT = "{\"service client sent a message\": %.2f}"
    
  4. SendCloudToDeviceMessage.py 파일에 다음 코드를 추가합니다. {iot hub connection string}{device id} 자리 표시자 값을 앞에서 기록해 둔 IoT Hub 연결 문자열 및 디바이스 ID로 바꿉니다.

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
  5. 다음 코드를 추가하여 디바이스에 메시지를 보냅니다.

    def iothub_messaging_sample_run():
        try:
            # Create IoTHubRegistryManager
            registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
            for i in range(0, MESSAGE_COUNT):
                print ( 'Sending message: {0}'.format(i) )
                data = MSG_TXT % (AVG_WIND_SPEED + (random.random() * 4 + 2))
    
                props={}
                # optional: assign system properties
                props.update(messageId = "message_%d" % i)
                props.update(correlationId = "correlation_%d" % i)
                props.update(contentType = "application/json")
    
                # optional: assign application properties
                prop_text = "PropMsg_%d" % i
                props.update(testProperty = prop_text)
    
                registry_manager.send_c2d_message(DEVICE_ID, data, properties=props)
    
            try:
                # Try Python 2.xx first
                raw_input("Press Enter to continue...\n")
            except:
                pass
                # Use Python 3.xx in the case of exception
                input("Press Enter to continue...\n")
    
        except Exception as ex:
            print ( "Unexpected error {0}" % ex )
            return
        except KeyboardInterrupt:
            print ( "IoT Hub C2D Messaging service sample stopped" )
    
  6. 다음 main 함수를 추가합니다.

    if __name__ == '__main__':
        print ( "Starting the Python IoT Hub C2D Messaging service sample..." )
    
        iothub_messaging_sample_run()
    
  7. SendCloudToDeviceMessage.py 파일을 저장한 후 닫습니다.

애플리케이션 실행

이제 애플리케이션을 실행할 준비가 되었습니다.

  1. 작업 디렉터리의 명령 프롬프트에서 다음 명령을 실행하여 클라우드-디바이스 메시지를 수신 대기합니다.

    python SimulatedDevice.py
    

    시뮬레이션된 디바이스 앱 실행

  2. 작업 디렉터리에서 새 명령 프롬프트를 열고 다음 명령을 실행하여 클라우드-디바이스 메시지를 보냅니다.

    python SendCloudToDeviceMessage.py
    

    앱을 실행하여 클라우드-디바이스 명령 보내기

  3. 디바이스에서 수신한 메시지를 기록해 둡니다.

    수신된 메시지

다음 단계

이 문서에서는 클라우드-디바이스 메시지를 보내고 받는 방법을 알아보았습니다.