원격 모니터링 솔루션 가속기에 Raspberry Pi 디바이스 연결(C)Connect your Raspberry Pi device to the Remote Monitoring solution accelerator (C)

이 자습서에서는 원격 모니터링 솔루션 가속기에 다음과 같은 원격 분석을 보내는 냉각기 디바이스를 구현합니다.In this tutorial, you implement a Chiller device that sends the following telemetry to the Remote Monitoring solution accelerator:

  • 온도Temperature
  • 압력Pressure
  • 습도Humidity

간단히 하기 위해 코드는 냉각기에 대한 샘플 원격 분석 값을 생성합니다.For simplicity, the code generates sample telemetry values for the Chiller. 실제 센서를 디바이스에 연결하고 실제 원격 분석을 보내 샘플을 확장할 수 있습니다.You could extend the sample by connecting real sensors to your device and sending real telemetry.

샘플 디바이스는 또한:The sample device also:

  • 솔루션에 메타데이터를 보내 해당 기능을 설명합니다.Sends metadata to the solution to describe its capabilities.
  • 솔루션의 디바이스 페이지에서 트리거된 작업에 응답합니다.Responds to actions triggered from the Devices page in the solution.
  • 솔루션의 디바이스 페이지에서 보내는 구성 변경 내용에 응답합니다.Responds to configuration changes send from the Devices page in the solution.

이 자습서를 완료하려면 활성 Azure 계정이 필요합니다.To complete this tutorial, you need an active Azure account. 계정이 없는 경우 몇 분 만에 평가판 계정을 만들 수 있습니다.If you don't have an account, you can create a free trial account in just a couple of minutes. 자세한 내용은 Azure 무료 체험을 참조하세요.For details, see Azure Free Trial.

시작하기 전에Before you start

디바이스에 대한 코드를 작성하기 전에 원격 모니터링 솔루션 가속기를 배포하고 이 솔루션에 새 실제 디바이스를 추가합니다.Before you write any code for your device, deploy your Remote Monitoring solution accelerator and add a new real device to the solution.

원격 모니터링 솔루션 가속기 배포Deploy your Remote Monitoring solution accelerator

이 자습서에서 만드는 냉각기 디바이스는 원격 모니터링 솔루션 가속기의 인스턴스에 데이터를 전송합니다.The Chiller device you create in this tutorial sends data to an instance of the Remote Monitoring solution accelerator. Azure 계정에서 원격 모니터링 솔루션 가속기를 미리 프로비전하지 않은 경우 원격 모니터링 솔루션 가속기 배포를 참조하세요.If you haven't already provisioned the Remote Monitoring solution accelerator in your Azure account, see Deploy the Remote Monitoring solution accelerator

원격 모니터링 솔루션의 배포 프로세스가 완료되면 시작을 클릭하여 브라우저에서 솔루션 대시보드를 엽니다.When the deployment process for the Remote Monitoring solution finishes, click Launch to open the solution dashboard in your browser.

솔루션 대시보드

디바이스를 원격 모니터링 솔루션에 추가Add your device to the Remote Monitoring solution

참고

솔루션에 디바이스가 이미 추가되어 있으면 이 단계를 건너뜁니다.If you have already added a device in your solution, you can skip this step. 그러나 다음 단계에서는 디바이스 연결 문자열이 필요합니다.However, the next step requires your device connection string. Azure Portal에서 검색하거나 az iot CLI 도구를 사용하여 디바이스 연결 문자열을 검색할 수 있습니다.You can retrieve a device's connection string from the Azure portal or using the az iot CLI tool.

솔루션 가속기에 연결하는 디바이스는 유효한 자격 증명을 사용하여 IoT Hub에 자신을 식별할 수 있어야 합니다.For a device to connect to the solution accelerator, it must identify itself to IoT Hub using valid credentials. 솔루션에 디바이스를 추가할 때 자격 증명이 포함된 디바이스 연결 문자열을 저장할 기회가 있습니다.You have the opportunity to save the device connection string that contains these credentials when you add the device to the solution. 이 자습서의 뒷부분에서는 클라이언트 애플리케이션에 장치 연결 문자열을 포함시킵니다.You include the device connection string in your client application later in this tutorial.

장치를 원격 모니터링 솔루션에 추가 하려면 다음 단계를 완료 합니다 Device Explorer 솔루션의 페이지:To add a device to your Remote Monitoring solution, complete the following steps on the Device Explorer page in the solution:

  1. 선택할 + 새 장치를 선택한 후 실제 으로 장치 유형:Choose + New device, and then choose Real as the Device type:

    실제 디바이스 추가

  2. 디바이스 ID로 물리적 냉각기를 입력합니다.Enter Physical-chiller as the Device ID. 대칭 키자동 생성 키 옵션을 선택합니다.Choose the Symmetric Key and Auto generate keys options:

    디바이스 옵션 선택

  3. 적용을 선택합니다.Choose Apply. 그런 다음, 디바이스 ID, 기본 키, 연결 문자열 기본 키 값을 메모합니다.Then make a note of the Device ID, Primary Key, and Connection string primary key values:

    자격 증명 검색

이제 실제 디바이스를 원격 모니터링 솔루션 가속기에 추가하고 해당 디바이스 연결 문자열을 적어 두었습니다.You've now added a real device to the Remote Monitoring solution accelerator and noted its device connection string. 다음 섹션에서는 장치 연결 문자열을 사용하여 솔루션에 연결하는 클라이언트 애플리케이션을 구현합니다.In the following sections, you implement the client application that uses the device connection string to connect to your solution.

클라이언트 애플리케이션은 기본 제공 냉각기 장치 모델을 구현합니다.The client application implements the built-in Chiller device model. 솔루션 가속기 디바이스 모델은 디바이스에 대해 다음을 지정합니다.A solution accelerator device model specifies the following about a device:

  • 디바이스가 솔루션에 보고하는 속성The properties the device reports to the solution. 예를 들어, 냉각기 디바이스는 해당 펌웨어 및 위치에 대한 정보를 보고합니다.For example, a Chiller device reports information about its firmware and location.
  • 디바이스가 솔루션에 보내는 원격 분석의 유형The types of telemetry the device sends to the solution. 예를 들어, 냉각기 디바이스는 온도, 습도 및 압력 값을 보냅니다.For example, a Chiller device sends temperature, humidity, and pressure values.
  • 디바이스에서 실행되도록 솔루션에서 예약할 수 있는 메서드The methods you can schedule from the solution to run on the device. 예를 들어, 냉각기 디바이스는 Reboot, FirmwareUpdate, EmergencyValveReleaseIncreasePressure 메서드를 구현해야 합니다.For example, a Chiller device must implement Reboot, FirmwareUpdate, EmergencyValveRelease, and IncreasePressure methods.

이 자습서는 원격 모니터링 솔루션 가속기에 실제 디바이스를 연결하는 방법을 보여 줍니다.This tutorial shows you how to connect a real device to the Remote Monitoring solution accelerator. 제한된 장치에서 실행되는 포함된 애플리케이션과 마찬가지로 Raspberry Pi 장치 애플리케이션에 대한 클라이언트 코드는 C에서 작성되었습니다. 이 자습서에서는 Raspbian OS를 실행 중인 Raspberry Pi에서 애플리케이션을 빌드합니다.As with most embedded applications that run on constrained devices, the client code for the Raspberry Pi device application is written in C. In this tutorial, you build the application on a Raspberry Pi running the Raspbian OS.

디바이스를 시뮬레이션하려면 새 시뮬레이션된 디바이스 만들기 및 테스트를 참조하세요.If you prefer to simulate a device, see Create and test a new simulated device.

필수 하드웨어Required hardware

Raspberry Pi의 명령줄에 원격으로 연결할 수 있는 데스크톱 컴퓨터이며A desktop computer to enable you to connect remotely to the command line on the Raspberry Pi.

Raspberry Pi 3용 Microsoft IoT 시작 키트 또는 동등한 구성 요소입니다.Microsoft IoT Starter Kit for Raspberry Pi 3 or equivalent components. 이 자습서에서는 키트에서 다음 항목을 사용합니다.This tutorial uses the following items from the kit:

  • Raspberry Pi 3Raspberry Pi 3
  • MicroSD 카드(NOOBS 포함)MicroSD Card (with NOOBS)
  • USB 미니 케이블A USB Mini cable
  • 이더넷 케이블An Ethernet cable

필수 데스크톱 소프트웨어Required desktop software

Raspberry Pi의 명령줄에 원격으로 액세스할 수 있도록 데스크톱 컴퓨터에 SSH 클라이언트가 필요합니다.You need SSH client on your desktop machine to enable you to remotely access the command line on the Raspberry Pi.

  • Windows에서는 SSH 클라이언트를 포함하지 않습니다.Windows does not include an SSH client. PuTTY를 사용하는 것이 좋습니다.We recommend using PuTTY.
  • 대부분의 Linux 배포판 및 Mac OS는 명령줄 SSH 유틸리티를 포함합니다.Most Linux distributions and Mac OS include the command-line SSH utility. 자세한 내용은 Linux 또는 Mac OS를 사용하는 SSH를 참조하세요.For more information, see SSH Using Linux or Mac OS.

필수 Raspberry Pi 소프트웨어Required Raspberry Pi software

이 문서에서는 Raspberry Pi에 Raspbian OS의 최신 버전을 설치했다고 가정합니다.This article assumes you have installed the latest version of the Raspbian OS on your Raspberry Pi.

다음 단계는 솔루션 가속기에 연결하는 C 애플리케이션을 빌드하기 위해 Raspberry Pi를 준비하는 방법을 보여줍니다.The following steps show you how to prepare your Raspberry Pi for building a C application that connects to the solution accelerator:

  1. ssh를 사용하여 Raspberry Pi에 연결합니다.Connect to your Raspberry Pi using ssh. 자세한 내용은 Raspberry Pi 웹 사이트에서 SSH(Secure Shell)를 참조하세요.For more information, see SSH (Secure Shell) on the Raspberry Pi website.

  2. 다음 명령을 사용하여 Raspberry Pi를 업데이트합니다.Use the following command to update your Raspberry Pi:

    sudo apt-get update
    
  3. 이 방법 가이드의 단계를 완료하려면 Linux 개발 환경 설정의 단계에 따라 필요한 개발 도구 및 라이브러리를 Raspberry Pi에 추가합니다.To complete the steps in this how-to guide follow the steps in set up your Linux development environment to add the required development tools and libraries to your Raspberry Pi.

코드 보기View the code

이 가이드에서 사용되는 샘플 코드는 Azure IoT C SDK GitHub 리포지토리에서 제공됩니다.The sample code used in this guide is available in the Azure IoT C SDKs GitHub repository.

소스 코드 다운로드 및 프로젝트 준비Download the source code and prepare the project

프로젝트를 준비하려면 GitHub에서 Azure IoT C SDK 리포지토리를 복제하거나 다운로드합니다.To prepare the project, clone or download the Azure IoT C SDKs repository from GitHub.

샘플은 samples/solutions/remote_monitoring_client 폴더에 있습니다.The sample is located in the samples/solutions/remote_monitoring_client folder.

samples/solutions/remote_monitoring_client 폴더의 remote_monitoring.c 파일을 텍스트 편집기에서 엽니다.Open the remote_monitoring.c file in the samples/solutions/remote_monitoring_client folder in a text editor.

코드 연습Code walkthrough

이 섹션에서는 샘플 코드의 몇 가지 주요 부분 및 원격 모니터링 솔루션 가속기와의 관계에 대해 설명합니다.This section describes some of the key parts of the sample code and explains how they relate to the Remote Monitoring solution accelerator.

다음 코드 조각은 디바이스의 기능을 설명하는 보고된 속성이 정의된 방식을 보여 줍니다.The following snippet shows how the reported properties that describe the capabilities of the device are defined. 이러한 속성은 다음과 같습니다.These properties include:

  • 솔루션 가속기가 디바이스를 맵에 추가할 수 있도록 하는 디바이스의 위치입니다.The location of the device to enable the solution accelerator to add the device to the map.
  • 현재 펌웨어 버전입니다.The current firmware version.
  • 디바이스에서 지원하는 메서드 목록입니다.The list of methods the device supports.
  • 디바이스에서 보낸 원격 분석 메시지의 스키마입니다.The schema of the telemetry messages sent by the device.
typedef struct MESSAGESCHEMA_TAG
{
    char* name;
    char* format;
    char* fields;
} MessageSchema;

typedef struct TELEMETRYSCHEMA_TAG
{
    MessageSchema messageSchema;
} TelemetrySchema;

typedef struct TELEMETRYPROPERTIES_TAG
{
    TelemetrySchema temperatureSchema;
    TelemetrySchema humiditySchema;
    TelemetrySchema pressureSchema;
} TelemetryProperties;

typedef struct CHILLER_TAG
{
    // Reported properties
    char* protocol;
    char* supportedMethods;
    char* type;
    char* firmware;
    FIRMWARE_UPDATE_STATUS firmwareUpdateStatus;
    char* location;
    double latitude;
    double longitude;
    TelemetryProperties telemetry;

    // Manage firmware update process
    char* new_firmware_version;
    char* new_firmware_URI;
} Chiller;

샘플에는 Parson 라이브러리를 사용하여 이 데이터 구조를 직렬화하는 serializeToJson 함수가 포함되어 있습니다.The sample includes a serializeToJson function that serializes this data structure using the Parson library.

샘플에는 클라이언트가 솔루션 가속기와 상호 작용할 때 정보를 콘솔에 출력하는 몇 가지 콜백 함수가 포함되어 있습니다.The sample includes several callback functions that print information to the console as the client interacts with the solution accelerator:

  • connection_status_callbackconnection_status_callback
  • send_confirm_callbacksend_confirm_callback
  • reported_state_callbackreported_state_callback
  • device_method_callbackdevice_method_callback

다음 코드 조각은 device_method_callback 함수를 보여 줍니다.The following snippet shows the device_method_callback function. 이 함수는 솔루션 가속기에서 메서드 호출이 수신될 때 수행할 작업을 결정합니다.This function determines the action to take when a method call is received from the solution accelerator. 함수는 userContextCallback 매개 변수에서 Chiller 데이터 구조에 대한 참조를 받습니다.The function receives a reference to the Chiller data structure in the userContextCallback parameter. userContextCallback의 값은 main 함수에서 콜백 함수를 구성할 때 설정됩니다.The value of userContextCallback is set when the callback function is configured in the main function:

static int device_method_callback(const char* method_name, const unsigned char* payload, size_t size, unsigned char** response, size_t* response_size, void* userContextCallback)
{
    Chiller *chiller = (Chiller *)userContextCallback;

    int result;

    (void)printf("Direct method name:    %s\r\n", method_name);

    (void)printf("Direct method payload: %.*s\r\n", (int)size, (const char*)payload);

    if (strcmp("Reboot", method_name) == 0)
    {
        MESSAGERESPONSE(201, "{ \"Response\": \"Rebooting\" }")
    }
    else if (strcmp("EmergencyValveRelease", method_name) == 0)
    {
        MESSAGERESPONSE(201, "{ \"Response\": \"Releasing emergency valve\" }")
    }
    else if (strcmp("IncreasePressure", method_name) == 0)
    {
        MESSAGERESPONSE(201, "{ \"Response\": \"Increasing pressure\" }")
    }
    else if (strcmp("FirmwareUpdate", method_name) == 0)
    {
        if (chiller->firmwareUpdateStatus != IDLE)
        {
            (void)printf("Attempt to invoke firmware update out of order\r\n");
            MESSAGERESPONSE(400, "{ \"Response\": \"Attempting to initiate a firmware update out of order\" }")
        }
        else
        {
            getFirmwareUpdateValues(chiller, payload);

            if (chiller->new_firmware_version != NULL && chiller->new_firmware_URI != NULL)
            {
                // Create a thread for the long-running firmware update process.
                THREAD_HANDLE thread_apply;
                THREADAPI_RESULT t_result = ThreadAPI_Create(&thread_apply, do_firmware_update, chiller);
                if (t_result == THREADAPI_OK)
                {
                    (void)printf("Starting firmware update thread\r\n");
                    MESSAGERESPONSE(201, "{ \"Response\": \"Starting firmware update thread\" }")
                }
                else
                {
                    (void)printf("Failed to start firmware update thread\r\n");
                    MESSAGERESPONSE(500, "{ \"Response\": \"Failed to start firmware update thread\" }")
                }
            }
            else
            {
                (void)printf("Invalid method payload\r\n");
                MESSAGERESPONSE(400, "{ \"Response\": \"Invalid payload\" }")
            }
        }
    }
    else
    {
        // All other entries are ignored.
        (void)printf("Method not recognized\r\n");
        MESSAGERESPONSE(400, "{ \"Response\": \"Method not recognized\" }")
    }

    return result;
}

솔루션 가속기가 펌웨어 업데이트 메서드를 호출할 때 샘플은 JSON 페이로드를 deserialize하고 백그라운드 스레드를 시작하여 업데이트 프로세스를 완료합니다.When the solution accelerator calls the firmware update method, the sample deserializes the JSON payload and starts a background thread to complete the update process. 다음 코드 조각은 스레드에서 실행되는 do_firmware_update를 보여 줍니다.The following snippet shows the do_firmware_update that runs on the thread:

/*
 This is a thread allocated to process a long-running device method call.
 It uses device twin reported properties to communicate status values
 to the Remote Monitoring solution accelerator.
*/
static int do_firmware_update(void *param)
{
    Chiller *chiller = (Chiller *)param;
    printf("Running simulated firmware update: URI: %s, Version: %s\r\n", chiller->new_firmware_URI, chiller->new_firmware_version);

    printf("Simulating download phase...\r\n");
    chiller->firmwareUpdateStatus = DOWNLOADING;
    sendChillerReportedProperties(chiller);

    ThreadAPI_Sleep(5000);

    printf("Simulating apply phase...\r\n");
    chiller->firmwareUpdateStatus = APPLYING;
    sendChillerReportedProperties(chiller);

    ThreadAPI_Sleep(5000);

    printf("Simulating reboot phase...\r\n");
    chiller->firmwareUpdateStatus = REBOOTING;
    sendChillerReportedProperties(chiller);

    ThreadAPI_Sleep(5000);

    size_t size = strlen(chiller->new_firmware_version) + 1;
    (void)memcpy(chiller->firmware, chiller->new_firmware_version, size);

    chiller->firmwareUpdateStatus = IDLE;
    sendChillerReportedProperties(chiller);

    return 0;
}

다음 코드 조각은 클라이언트가 솔루션 가속기에 원격 분석 메시지를 보내는 방법을 보여 줍니다.The following snippet shows how the client sends a telemetry message to the solution accelerator. 메시지 속성에는 솔루션 가속기가 대시보드에 원격 분석을 표시하는 데 도움이 되는 메시지 스키마가 포함됩니다.The message properties include the message schema to help the solution accelerator display the telemetry on the dashboard:

static void send_message(IOTHUB_DEVICE_CLIENT_HANDLE handle, char* message, char* schema)
{
    IOTHUB_MESSAGE_HANDLE message_handle = IoTHubMessage_CreateFromString(message);

    // Set system properties
    (void)IoTHubMessage_SetMessageId(message_handle, "MSG_ID");
    (void)IoTHubMessage_SetCorrelationId(message_handle, "CORE_ID");
    (void)IoTHubMessage_SetContentTypeSystemProperty(message_handle, "application%2fjson");
    (void)IoTHubMessage_SetContentEncodingSystemProperty(message_handle, "utf-8");

    // Set application properties
    MAP_HANDLE propMap = IoTHubMessage_Properties(message_handle);
    (void)Map_AddOrUpdate(propMap, "$$MessageSchema", schema);
    (void)Map_AddOrUpdate(propMap, "$$ContentType", "JSON");

    time_t now = time(0);
    struct tm* timeinfo;
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4996) /* Suppress warning about possible unsafe function in Visual Studio */
#endif
    timeinfo = gmtime(&now);
#ifdef _MSC_VER
#pragma warning(pop)
#endif
    char timebuff[50];
    strftime(timebuff, 50, "%Y-%m-%dT%H:%M:%SZ", timeinfo);
    (void)Map_AddOrUpdate(propMap, "$$CreationTimeUtc", timebuff);

    IoTHubDeviceClient_SendEventAsync(handle, message_handle, send_confirm_callback, NULL);

    IoTHubMessage_Destroy(message_handle);
}

샘플의 main 함수는 다음을 수행합니다.The main function in the sample:

  • SDK 하위 시스템을 초기화하고 종료합니다.Initializes and shuts down the SDK subsystem.
  • Chiller 데이터 구조를 초기화합니다.Initializes the Chiller data structure.
  • 보고된 속성을 솔루션 가속기에 보냅니다.Sends the reported properties to the solution accelerator.
  • 디바이스 메서드 콜백 함수를 구성합니다.Configures the device method callback function.
  • 시뮬레이션된 원격 분석값을 솔루션 가속기에 보냅니다.Sends simulated telemetry values to the solution accelerator.
int main(void)
{
    srand((unsigned int)time(NULL));
    double minTemperature = 50.0;
    double minPressure = 55.0;
    double minHumidity = 30.0;
    double temperature = 0;
    double pressure = 0;
    double humidity = 0;

    (void)printf("This sample simulates a Chiller device connected to the Remote Monitoring solution accelerator\r\n\r\n");

    // Used to initialize sdk subsystem
    (void)IoTHub_Init();

    (void)printf("Creating IoTHub handle\r\n");
    // Create the iothub handle here
    device_handle = IoTHubDeviceClient_CreateFromConnectionString(connectionString, MQTT_Protocol);
    if (device_handle == NULL)
    {
        (void)printf("Failure creating Iothub device.  Hint: Check you connection string.\r\n");
    }
    else
    {
        // Setting connection status callback to get indication of connection to iothub
        (void)IoTHubDeviceClient_SetConnectionStatusCallback(device_handle, connection_status_callback, NULL);

        Chiller chiller;
        memset(&chiller, 0, sizeof(Chiller));
        chiller.protocol = "MQTT";
        chiller.supportedMethods = "Reboot,FirmwareUpdate,EmergencyValveRelease,IncreasePressure";
        chiller.type = "Chiller";
        size_t size = strlen(initialFirmwareVersion) + 1;
        chiller.firmware = malloc(size);
        memcpy(chiller.firmware, initialFirmwareVersion, size);
        chiller.firmwareUpdateStatus = IDLE;
        chiller.location = "Building 44";
        chiller.latitude = 47.638928;
        chiller.longitude = -122.13476;
        chiller.telemetry.temperatureSchema.messageSchema.name = "chiller-temperature;v1";
        chiller.telemetry.temperatureSchema.messageSchema.format = "JSON";
        chiller.telemetry.temperatureSchema.messageSchema.fields = "{\"temperature\":\"Double\",\"temperature_unit\":\"Text\"}";
        chiller.telemetry.humiditySchema.messageSchema.name = "chiller-humidity;v1";
        chiller.telemetry.humiditySchema.messageSchema.format = "JSON";
        chiller.telemetry.humiditySchema.messageSchema.fields = "{\"humidity\":\"Double\",\"humidity_unit\":\"Text\"}";
        chiller.telemetry.pressureSchema.messageSchema.name = "chiller-pressure;v1";
        chiller.telemetry.pressureSchema.messageSchema.format = "JSON";
        chiller.telemetry.pressureSchema.messageSchema.fields = "{\"pressure\":\"Double\",\"pressure_unit\":\"Text\"}";

        sendChillerReportedProperties(&chiller);

        (void)IoTHubDeviceClient_SetDeviceMethodCallback(device_handle, device_method_callback, &chiller);

        while (1)
        {
            temperature = minTemperature + ((rand() % 10) + 5);
            pressure = minPressure + ((rand() % 10) + 5);
            humidity = minHumidity + ((rand() % 20) + 5);

            if (chiller.firmwareUpdateStatus == IDLE)
            {
                (void)printf("Sending sensor value Temperature = %f %s,\r\n", temperature, "F");
                (void)sprintf_s(msgText, sizeof(msgText), "{\"temperature\":%.2f,\"temperature_unit\":\"F\"}", temperature);
                send_message(device_handle, msgText, chiller.telemetry.temperatureSchema.messageSchema.name);


                (void)printf("Sending sensor value Pressure = %f %s,\r\n", pressure, "psig");
                (void)sprintf_s(msgText, sizeof(msgText), "{\"pressure\":%.2f,\"pressure_unit\":\"psig\"}", pressure);
                send_message(device_handle, msgText, chiller.telemetry.pressureSchema.messageSchema.name);


                (void)printf("Sending sensor value Humidity = %f %s,\r\n", humidity, "%");
                (void)sprintf_s(msgText, sizeof(msgText), "{\"humidity\":%.2f,\"humidity_unit\":\"%%\"}", humidity);
                send_message(device_handle, msgText, chiller.telemetry.humiditySchema.messageSchema.name);
            }

            ThreadAPI_Sleep(5000);
        }

        (void)printf("\r\nShutting down\r\n");

        // Clean up the iothub sdk handle and free resources
        IoTHubDeviceClient_Destroy(device_handle);
        free(chiller.firmware);
        free(chiller.new_firmware_URI);
        free(chiller.new_firmware_version);
    }
    // Shutdown the sdk subsystem
    IoTHub_Deinit();

    return 0;
}

애플리케이션 빌드 및 실행Build and run the application

다음 단계에서는 CMake를 사용하여 클라이언트 응용 프로그램을 빌드하는 방법을 설명합니다.The following steps describe how to use CMake to build the client application. 원격 모니터링 클라이언트 애플리케이션은 SDK 빌드 프로세스의 일부로 빌드됩니다.The remote monitoring client application is built as part of the build process for the SDK.

  1. remote_monitoring.c 파일을 편집하여 <connectionstring>을 이 방법 가이드 시작 부분에서 솔루션 가속기에 디바이스를 추가할 때 적어 둔 디바이스 연결 문자열로 바꿉니다.Edit the remote_monitoring.c file to replace <connectionstring> with the device connection string you noted at the start of this how-to guide when you added a device to the solution accelerator.

  2. Azure IoT C SDK 리포지토리의 복제된 복사본 루트로 이동한 후에 다음 명령을 실행하여 클라이언트 응용 프로그램을 빌드합니다.Navigate to root of your cloned copy of the Azure IoT C SDKs repository repository and run the following commands to build the client application:

    mkdir cmake
    cd cmake
    cmake ../
    make
    
  3. 클라이언트 애플리케이션을 실행하고 IoT Hub에 원격 분석을 전송합니다.Run the client application and send telemetry to IoT Hub:

    ./samples/solutions/remote_monitoring_client/remote_monitoring_client
    

    다음과 같은 경우 콘솔에 메시지가 표시됩니다.The console displays messages as:

    • 애플리케이션이 샘플 원격 분석 데이터를 솔루션 가속기에 보낼 때.The application sends sample telemetry to the solution accelerator.
    • 솔루션 대시보드에서 호출된 메서드에 응답할 때.Responds to methods invoked from the solution dashboard.

디바이스 원격 분석 보기View device telemetry

장치에서 보낸 원격 분석을 볼 수 있습니다 합니다 Device Explorer 솔루션에는 페이지입니다.You can view the telemetry sent from your device on the Device Explorer page in the solution.

  1. 장치 목록에서 프로 비전 한 장치를 선택 합니다 Device Explorer 페이지입니다.Select the device you provisioned in the list of devices on the Device Explorer page. 패널은 디바이스 원격 분석의 그림을 포함한 디바이스에 대한 정보를 표시합니다.A panel displays information about your device including a plot of the device telemetry:

    디바이스 세부 정보 보기

  2. 압력을 선택하여 원격 분석 표시를 변경합니다.Choose Pressure to change the telemetry display:

    압력 원격 분석 보기

  3. 디바이스에 대한 진단 정보를 보려면 진단 아래로 스크롤합니다.To view diagnostic information about your device, scroll down to Diagnostics:

    디바이스 진단 보기

디바이스에서 작동Act on your device

장치에서 메서드를 호출 하려면 사용 합니다 Device Explorer 원격 모니터링 솔루션에서 페이지입니다.To invoke methods on your devices, use the Device Explorer page in the Remote Monitoring solution. 원격 모니터링 솔루션의 예를 들어 냉각기 구현 하는 장치를 재부팅 메서드.For example, in the Remote Monitoring solution Chiller devices implement a Reboot method.

  1. 선택 장치 으로 이동 하는 Device Explorer 솔루션에는 페이지입니다.Choose Devices to navigate to the Device Explorer page in the solution.

  2. 장치 목록에서 프로 비전 한 장치를 선택 합니다 Device Explorer 페이지:Select the device you provisioned in the list of devices on the Device Explorer page:

    실제 디바이스 선택

  3. 장치에서 호출 하 여 메서드의 목록을 표시 하려면 선택 작업, 한 다음 메서드합니다.To display a list of the methods you can call on your device, choose Jobs, then Methods. 여러 디바이스에서 작업이 실행되도록 예약하려면 목록에서 여러 디바이스를 선택하면 됩니다.To schedule a job to run on multiple devices, you can select multiple devices in the list. 작업 패널에 선택한 모든 디바이스에 공통된 메서드 형식이 표시됩니다.The Jobs panel shows the types of method common to all the devices you selected.

  4. 선택 다시 부팅, 작업 이름으로 설정할 RebootPhysicalChiller 를 선택한 후 적용:Choose Reboot, set the job name to RebootPhysicalChiller and then choose Apply:

    펌웨어 업데이트 예약

  5. 시뮬레이션된 디바이스가 메서드를 처리하는 동안 디바이스 코드를 실행하는 콘솔에 메시지 시퀀스가 표시됩니다.A sequence of messages displays in the console running your device code while the simulated device handles the method.

참고

솔루션에서 작업의 상태를 추적 하려면 선택할 작업 상태 보기합니다.To track the status of the job in the solution, choose View Job Status.

다음 단계Next steps

원격 모니터링 솔루션 가속기 사용자 지정 문서에서는 솔루션 가속기를 사용자 지정하는 몇 가지 방법에 대해 설명합니다.The article Customize the Remote Monitoring solution accelerator describes some ways to customize the solution accelerator.