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

Azure IoT Hub는 수백만 개의 디바이스와 솔루션 백 엔드 간에 안정적이고 안전한 양방향 통신이 가능하도록 지원하는 완전히 관리되는 서비스입니다.Azure IoT Hub is a fully managed service that helps enable reliable and secure bi-directional communications between millions of devices and a solution back end. 디바이스에서 IoT Hub로 원격 분석 데이터 보내기 빠른 시작에서는 IoT Hub를 만들고 그 안에 디바이스 ID를 프로비저닝하고 디바이스-클라우드 메시지를 보내는 시뮬레이션된 디바이스 앱을 코딩하는 방법을 보여 줍니다.The Send telemetry from a device to an IoT hub quickstart shows how to create an IoT hub, provision a device identity in it, and code a simulated device app that sends device-to-cloud messages.

참고

이 문서에서 설명하는 기능은 IoT Hub의 표준 계층에서만 사용할 수 있습니다.The features described in this article are available only in the standard tier of IoT Hub. 기본 및 표준/무료 IoT Hub 계층에 대한 자세한 내용은 적합한 IoT Hub 계층 선택 방법을 참조하세요.For more information about the basic and standard/free IoT Hub tiers, see Choose the right IoT Hub tier.

이 자습서는 디바이스에서 IoT Hub로 원격 분석 데이터 보내기를 기반으로 합니다.This tutorial builds on Send telemetry from a device to an IoT hub. 이 항목에서는 다음 방법을 설명합니다.It shows you how to:

  • 솔루션 백 엔드에서 IoT Hub를 통해 클라우드-디바이스 메시지를 단일 디바이스로 보냅니다.From your solution back end, send cloud-to-device messages to a single device through IoT Hub.

  • 디바이스에서 클라우드-디바이스 메시지를 받습니다.Receive cloud-to-device messages on a device.

IoT Hub 개발자 가이드에서 클라우드-디바이스 메시지에 대한 자세한 내용을 찾아볼 수 있습니다.You can find more information on cloud-to-device messages in the IoT Hub developer guide.

이 자습서의 끝 부분에서 다음의 두 Python 콘솔 앱을 실행합니다.At the end of this tutorial, you run two Python console apps:

  • SimulatedDevice.py - 디바이스에서 IoT Hub로 원격 분석 데이터 보내기에서 만든 앱의 수정 버전입니다. IoT Hub에 연결하고 클라우드-디바이스 메시지를 수신합니다.SimulatedDevice.py, a modified version of the app created in Send telemetry from a device to an IoT hub, which connects to your IoT hub and receives cloud-to-device messages.

  • SendCloudToDeviceMessage.py - IoT Hub를 통해 시뮬레이션된 디바이스 앱에 클라우드-디바이스 메시지를 보냅니다.SendCloudToDeviceMessage.py, which sends cloud-to-device messages to the simulated device app through IoT Hub.

참고

IoT Hub는 Azure IoT 디바이스 SDK를 통해 많은 디바이스 플랫폼 및 언어(C, Java, Javascript 및 Python 포함)를 지원합니다.IoT Hub has SDK support for many device platforms and languages (including C, Java, Javascript, and Python) through Azure IoT device SDKs. Python을 사용하여 이 자습서의 코드 및 일반적으로 Azure IoT Hub에 디바이스를 연결하는 방법에 대한 지침은 Azure IoT Python SDK를 참조하세요.For instructions on how to use Python to connect your device to this tutorial's code, and generally to Azure IoT Hub, see the Azure IoT Python SDK.

필수 구성 요소Prerequisites

  • 방화벽에서 포트 8883이 열려 있는지 확인합니다.Make sure that port 8883 is open in your firewall. 이 문서의 디바이스 샘플은 포트 8883을 통해 통신하는 MQTT 프로토콜을 사용합니다.The device sample in this article uses MQTT protocol, which communicates over port 8883. 이 포트는 일부 회사 및 교육용 네트워크 환경에서 차단될 수 있습니다.This port may be blocked in some corporate and educational network environments. 이 문제를 해결하는 자세한 내용과 방법은 IoT Hub에 연결(MQTT)을 참조하세요.For more information and ways to work around this issue, see Connecting to IoT Hub (MQTT).

시뮬레이션된 디바이스 앱에서 메시지 수신Receive messages in the simulated device app

이 섹션에서는 디바이스를 시뮬레이션하고 IoT Hub에서 클라우드-디바이스 메시지를 수신하는 Python 콘솔 앱을 만듭니다.In this section, you create a Python console app to simulate the device and receive cloud-to-device messages from the IoT hub.

  1. 작업 디렉터리의 명령 프롬프트에서 Python용 Azure IoT Hub 디바이스 SDK 를 설치합니다.From a command prompt in your working directory, install the Azure IoT Hub Device SDK for Python:

    pip install azure-iot-device
    
  2. 텍스트 편집기를 사용하여 SimulatedDevice.py 파일을 만듭니다.Using a text editor, create a file named SimulatedDevice.py.

  3. SimulatedDevice.py 파일의 시작 부분에 다음 import 문 및 변수를 추가합니다.Add the following import statements and variables at the start of the SimulatedDevice.py file:

    import threading
    import time
    from azure.iot.device import IoTHubDeviceClient
    
    RECEIVED_MESSAGES = 0
    
  4. 다음 코드를 SimulatedDevice.py 파일에 추가합니다.Add the following code to SimulatedDevice.py file. {deviceConnectionString} 자리 표시자 값을 디바이스에서 IoT Hub로 원격 분석 데이터 보내기 빠른 시작에서 만든 디바이스에 대한 디바이스 연결 문자열로 바꿉니다.Replace the {deviceConnectionString} placeholder value with the device connection string for the device you created in the Send telemetry from a device to an IoT hub quickstart:

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. 다음 함수를 추가하여 수신한 메시지를 콘솔에 인쇄합니다.Add the following function to print received messages to the console:

    def message_listener(client):
        global RECEIVED_MESSAGES
        while True:
            message = client.receive_message()
            RECEIVED_MESSAGES += 1
            print("\nMessage received:")
    
            #print data and both system and application (custom) properties
            for property in vars(message).items():
                print ("    {0}".format(property))
    
            print( "Total calls received: {}".format(RECEIVED_MESSAGES))
            print()
    
  6. 다음 코드를 추가하여 클라이언트를 초기화하고 클라우드-디바이스 메시지를 수신하기 위해 대기합니다.Add the following code to initialize the client and wait to receive the cloud-to-device message:

    def iothub_client_sample_run():
        try:
            client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
            message_listener_thread = threading.Thread(target=message_listener, args=(client,))
            message_listener_thread.daemon = True
            message_listener_thread.start()
    
            while True:
                time.sleep(1000)
    
        except KeyboardInterrupt:
            print ( "IoT Hub C2D Messaging device sample stopped" )
    
  7. 다음 main 함수를 추가합니다.Add the following main function:

    if __name__ == '__main__':
        print ( "Starting the Python IoT Hub C2D Messaging device sample..." )
        print ( "Waiting for C2D messages, press Ctrl-C to exit" )
    
        iothub_client_sample_run()
    
  8. SimulatedDevice.py 파일을 저장하고 닫습니다.Save and close the SimulatedDevice.py file.

IoT Hub 연결 문자열 가져오기Get the IoT hub connection string

이 문서에서는 디바이스에서 IoT Hub로 원격 분석 데이터 보내기에서 만든 IoT Hub를 통해 클라우드-디바이스 메시지를 보내는 백 엔드 서비스를 만듭니다.In this article, you create a backend service to send cloud-to-device messages through the IoT hub you created in Send telemetry from a device to an IoT hub. 클라우드-디바이스 메시지를 보내려면 서비스에 서비스 연결 권한이 있어야 합니다.To send cloud-to-device messages, your service needs the service connect permission. 기본적으로 모든 IoT Hub는 이 사용 권한을 부여하는 service 라는 공유 액세스 정책을 사용하여 만듭니다.By default, every IoT Hub is created with a shared access policy named service that grants this permission.

service 정책에 대한 IoT Hub 연결 문자열을 가져오려면 다음 단계를 수행합니다.To get the IoT Hub connection string for the service policy, follow these steps:

  1. Azure Portal에서 리소스 그룹 을 선택합니다.In the Azure portal, select Resource groups. 허브가 있는 리소스 그룹을 선택한 다음, 리소스 목록에서 허브를 선택합니다.Select the resource group where your hub is located, and then select your hub from the list of resources.

  2. IoT Hub의 왼쪽 창에서 공유 액세스 정책 을 선택합니다.On the left-side pane of your IoT hub, select Shared access policies.

  3. 정책 목록에서 ervice 정책을 선택합니다.From the list of policies, select the service policy.

  4. 공유 액세스 키 에서 연결 문자열 -- 기본 키 에 대한 복사 아이콘을 선택하고 값을 저장합니다.Under Shared access keys, select the copy icon for the Connection string -- primary key and save the value.

    연결 문자열을 검색하는 방법 표시

IoT Hub 공유 액세스 정책 및 사용 권한에 대한 자세한 내용은 액세스 제어 및 권한을 참조하세요.For more information about IoT Hub shared access policies and permissions, see Access control and permissions.

클라우드-디바이스 메시지 보내기Send a cloud-to-device message

이 섹션에서는 클라우드-디바이스 메시지를 시뮬레이션된 디바이스 앱으로 보내는 Python 콘솔 응용 프로그램을 만듭니다.In this section, you create a Python console app that sends cloud-to-device messages to the simulated device app. 디바이스에서 IoT Hub로 원격 분석 데이터 보내기 빠른 시작에서 추가한 디바이스의 디바이스 ID가 필요합니다.You need the device ID of the device you added in the Send telemetry from a device to an IoT hub quickstart. 이전에 IoT Hub 연결 문자열 가져오기에서 복사한 IoT Hub 연결 문자열도 필요합니다.You also need the IoT hub connection string you copied previously in Get the IoT hub connection string.

  1. 작업 디렉터리에서 명령 프롬프트를 열고 Python용 Azure IoT Hub 서비스 SDK 를 설치합니다.In your working directory, open a command prompt and install the Azure IoT Hub Service SDK for Python.

    pip install azure-iot-hub
    
  2. 텍스트 편집기를 사용하여 SendCloudToDeviceMessage.py 파일을 만듭니다.Using a text editor, create a file named SendCloudToDeviceMessage.py.

  3. SendCloudToDeviceMessage.py 파일 앞에 다음 import 문 및 변수를 추가합니다.Add the following import statements and variables at the start of the SendCloudToDeviceMessage.py file:

    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 파일에 다음 코드를 추가합니다.Add the following code to SendCloudToDeviceMessage.py file. {iot hub connection string}{device id} 자리 표시자 값을 앞에서 기록해 둔 IoT Hub 연결 문자열 및 디바이스 ID로 바꿉니다.Replace the {iot hub connection string} and {device id} placeholder values with the IoT hub connection string and device ID you noted previously:

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
  5. 다음 코드를 추가하여 디바이스에 메시지를 보냅니다.Add the following code to send messages to your device:

    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 함수를 추가합니다.Add the following main function:

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

애플리케이션 실행Run the applications

이제 애플리케이션을 실행할 준비가 되었습니다.You are now ready to run the applications.

  1. 작업 디렉터리의 명령 프롬프트에서 다음 명령을 실행하여 클라우드-디바이스 메시지를 수신 대기합니다.At the command prompt in your working directory, run the following command to listen for cloud-to-device messages:

    python SimulatedDevice.py
    

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

  2. 작업 디렉터리에서 새 명령 프롬프트를 열고 다음 명령을 실행하여 클라우드-디바이스 메시지를 보냅니다.Open a new command prompt in your working directory and run the following command to send cloud-to-device messages:

    python SendCloudToDeviceMessage.py
    

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

  3. 디바이스에서 수신한 메시지를 기록해 둡니다.Note the messages received by the device.

    수신된 메시지

다음 단계Next steps

이 자습서에서 클라우드-디바이스 메시지를 보내고 받는 방법을 알아보았습니다.In this tutorial, you learned how to send and receive cloud-to-device messages.

IoT Hub를 사용하는 완전한 엔드투엔드 솔루션의 예를 보려면 Azure IoT 원격 모니터링 솔루션 가속기를 참조하세요.To see examples of complete end-to-end solutions that use IoT Hub, see Azure IoT Remote Monitoring solution accelerator.

IoT Hub를 사용하여 솔루션을 개발하는 방법에 대한 자세한 내용은 IoT Hub 개발자 가이드를 참조하세요.To learn more about developing solutions with IoT Hub, see the IoT Hub developer guide.