자습서: Linux 또는 Windows에서 실행되는 IoT 플러그 앤 플레이 다중 구성 요소 디바이스 애플리케이션을 IoT Hub에 연결
이 자습서에서는 구성 요소를 사용하여 샘플 IoT 플러그 앤 플레이 디바이스 애플리케이션을 빌드하고, IoT 허브에 연결하고, Azure IoT 탐색기 도구를 사용하여 허브로 전송된 정보를 확인하는 방법을 보여 줍니다. 샘플 애플리케이션은 C로 작성되었으며 C용 Azure IoT 디바이스 SDK에 포함되어 있습니다. 솔루션 빌더는 디바이스 코드를 볼 필요 없이 Azure IoT 탐색기 도구를 사용하여 IoT 플러그 앤 플레이 디바이스의 기능을 이해할 수 있습니다.
이 자습서에서는 다음을 수행합니다.
- 샘플 코드를 다운로드합니다.
- 샘플 코드를 빌드합니다.
- 샘플 디바이스 애플리케이션을 실행하고 IoT 허브에 연결되는지 확인합니다.
- 소스 코드를 검토합니다.
필수 조건
계속하기 전에 IoT 허브를 포함하여 환경을 설정했는지 확인합니다.
Linux 또는 Windows에서 이 자습서를 완료할 수 있습니다. 이 자습서의 셸 명령은 '/
' 경로 구분 기호에 대한 Linux 규칙을 따릅니다. Windows에서 계속 실행 중인 경우 '\
'에 대해 이러한 구분 기호를 교환해야 합니다.
필수 구성 요소는 운영 체제에 따라 다릅니다.
Linux
이 자습서에서는 Ubuntu Linux를 사용하고 있다고 가정합니다. 이 자습서의 단계는 Ubuntu 18.04를 사용하여 테스트했습니다.
Linux에서 이 자습서를 완료하려면 로컬 Linux 환경에 다음 소프트웨어를 설치해야 합니다.
apt-get
명령을 사용하여 GCC, Git, cmake 및 필요한 모든 종속성을 설치합니다.
sudo apt-get update
sudo apt-get install -y git cmake build-essential curl libcurl4-openssl-dev libssl-dev uuid-dev
cmake
버전이 2.8.12보다 크고, GCC 버전이 4.4.7보다 큰지 확인합니다.
cmake --version
gcc --version
Windows
Windows에서 이 자습서를 완료하려면 로컬 Windows 환경에 다음 소프트웨어를 설치합니다.
- Visual Studio(Community, Professional 또는 Enterprise) - Visual Studio를 설치할 때 C++를 사용한 데스크톱 개발 워크로드를 포함해야 합니다.
- Git
- CMake
코드 다운로드
자습서: Linux 또는 Windows에서 실행되는 샘플 IoT 플러그 앤 플레이 디바이스 애플리케이션을 IoT Hub(C)에 연결을 완료한 경우 이미 코드를 다운로드한 것입니다.
이 자습서에서는 Azure IoT Hub Device C SDK를 복제하고 빌드하는 데 사용할 수 있는 개발 환경을 준비합니다.
선택한 폴더에서 명령 프롬프트를 엽니다. 다음 명령을 실행하여 Azure IoT C SDK 및 라이브러리 GitHub 리포지토리를 이 위치에 복제합니다.
git clone https://github.com/Azure/azure-iot-sdk-c.git
cd azure-iot-sdk-c
git submodule update --init
이 작업을 완료하는 데 몇 분 정도가 걸립니다.
코드 빌드 및 실행
Visual Studio를 사용하거나 명령줄에서 cmake
를 사용하여 코드를 빌드하고 실행할 수 있습니다.
Visual Studio 사용
복제된 리포지토리의 루트 폴더를 엽니다. 몇 초 후에 Visual Studio에서 CMake 지원은 프로젝트를 실행하고 디버그하는 데 필요한 모든 작업을 만듭니다.
Visual Studio가 준비되면 솔루션 탐색기에서 iothub_client/samples/pnp/pnp_temperature_controller/ 샘플로 이동합니다.
pnp_temperature_controller.c 파일을 마우스 오른쪽 단추로 클릭하고 디버그 구성 추가를 선택합니다. 기본값을 선택합니다.
Visual Studio에서 launch.vs.json 파일을 엽니다. 필요한 환경 변수를 설정하려면 다음 코드 조각에 나와 있는 것처럼 이 파일을 편집합니다. IoT 플러그 앤 플레이 빠른 시작 및 자습서에 대한 환경 설정을 완료할 때 범위 ID 및 등록 기본 키를 적어 두었습니다.
{ "version": "0.2.1", "defaults": {}, "configurations": [ { "type": "default", "project": "iothub_client\\samples\\pnp\\pnp_temperature_controller\\pnp_temperature_controller.c", "projectTarget": "", "name": "pnp_temperature_controller.c", "env": { "IOTHUB_DEVICE_SECURITY_TYPE": "DPS", "IOTHUB_DEVICE_DPS_ID_SCOPE": "<Your ID scope>", "IOTHUB_DEVICE_DPS_DEVICE_ID": "my-pnp-device", "IOTHUB_DEVICE_DPS_DEVICE_KEY": "<Your enrollment primary key>" } } ] }
pnp_temperature_controller.c 파일을 마우스 오른쪽 단추로 클릭하고 시작 항목으로 설정을 선택합니다.
Visual Studio에서 코드 실행을 추적하려면 pnp_temperature_controller.c 파일의
main
함수에 중단점을 추가합니다.이제 디버그 메뉴에서 샘플을 실행하고 디버그할 수 있습니다.
이제 디바이스가 명령 및 속성 업데이트를 받을 준비가 되었으며, 허브로 원격 분석 데이터를 보내기 시작했습니다. 다음 단계를 완료하는 동안 샘플을 계속 실행하세요.
명령줄에서 cmake
를 사용합니다.
샘플을 빌드하려면
복제된 디바이스 SDK의 루트 폴더에 cmake 하위 폴더를 만들고 해당 폴더로 이동합니다.
cd azure-iot-sdk-c mkdir cmake cd cmake
SDK 및 샘플에 대한 프로젝트 파일을 생성하고 빌드하려면 다음 명령을 실행합니다.
cmake .. cmake --build .
환경 설정에서 DPS(Device Provisioning Service)를 사용하여 IoT 허브에 연결하도록 샘플을 구성하는 네 가지 환경 변수를 만들었습니다.
- 값이
DPS
인 IOTHUB_DEVICE_SECURITY_TYPE - IOTHUB_DEVICE_DPS_ID_SCOPE(DPS ID 범위 포함).
- 값이
my-pnp-device
인 IOTHUB_DEVICE_DPS_DEVICE_ID. - IOTHUB_DEVICE_DPS_DEVICE_KEY(등록 기본 키 포함).
- 값이
global.azure-devices-provisioning.net
인 IOTHUB_DEVICE_DPS_ENDPOINT.
샘플 구성에 대해 자세히 알아보려면 샘플 추가 정보를 참조하세요.
샘플을 실행하려면:
cmake 폴더에서 실행 파일이 있는 폴더로 이동하여 실행합니다.
# Bash cd iothub_client/samples/pnp/pnp_temperature_controller ./pnp_temperature_controller
REM Windows cd iothub_client\samples\pnp\pnp_temperature_controller\Debug pnp_temperature_controller.exe
이제 디바이스가 명령 및 속성 업데이트를 받을 준비가 되었으며, 허브로 원격 분석 데이터를 보내기 시작했습니다. 다음 단계를 완료하는 동안 샘플을 계속 실행하세요.
Azure IoT 탐색기를 사용하여 코드의 유효성을 검사합니다.
디바이스 클라이언트 샘플이 시작되면 Azure IoT 탐색기 도구를 사용하여 작동하는지 확인합니다.
Azure IoT 탐색기를 엽니다.
IoT 허브에 대한 연결을 아직 추가하지 않은 경우 IoT 허브 페이지에서 + 연결 추가를 선택합니다. 이전에 만든 IoT 허브에 대한 연결 문자열을 입력하고 저장을 선택합니다.
IoT 플러그 앤 플레이 설정 페이지에서 + 추가 > 로컬 폴더를 선택하고 모델 파일을 저장한 로컬 models 폴더를 선택합니다.
IoT 허브 페이지에서 작업하려는 허브의 이름을 클릭합니다. IoT 허브에 등록된 디바이스 목록이 표시됩니다.
이전에 만든 디바이스의 디바이스 ID를 클릭합니다.
왼쪽의 메뉴에는 디바이스에 사용할 수 있는 다양한 유형의 정보가 표시됩니다.
IoT 플러그 앤 플레이 구성 요소를 선택하여 디바이스에 대한 모델 정보를 확인합니다.
디바이스의 다양한 구성 요소를 볼 수 있습니다. 기본 구성 요소 및 추가 구성 요소입니다. 작업할 구성 요소를 선택합니다.
원격 분석 페이지를 선택한 다음, 시작을 선택하여 이 구성 요소에 대해 디바이스에서 보내는 원격 분석 데이터를 살펴봅니다.
속성(읽기 전용) 페이지를 선택하여 이 구성 요소에 대해 보고된 읽기 전용 속성을 살펴봅니다.
속성(쓰기 가능) 페이지를 선택하여 이 구성 요소에 대해 업데이트할 수 있는 쓰기 가능 속성을 살펴봅니다.
해당 이름으로 속성을 선택하고, 새 값을 입력하고, 원하는 값 업데이트를 선택합니다.
새 값 표시를 보려면 새로 고침 단추를 선택합니다.
명령 페이지를 선택하여 이 구성 요소에 대한 모든 명령을 살펴봅니다.
테스트하려는 명령을 선택하여 매개 변수를 설정합니다. 명령 보내기를 선택하여 디바이스에서 명령을 호출합니다. 샘플 코드가 실행되고 있는 명령 프롬프트 창에서 디바이스가 명령에 응답하는 것을 볼 수 있습니다.
코드 검토
이 샘플은 IoT 플러그 앤 플레이 온도 컨트롤러 디바이스를 구현합니다. 이 샘플에서는 여러 구성 요소를 사용하여 모델을 구현합니다. 온도 디바이스용 DTDL(Digital Twins Definition Language) 모델 파일은 디바이스에서 구현하는 원격 분석, 속성, 명령을 정의합니다.
IoT 플러그 앤 플레이 도우미 함수
이 샘플의 경우 코드는 /common 폴더의 일부 도우미 함수를 사용합니다.
pnp_device_client_ll에는 매개 변수로 포함된 model-id
를 사용하여 IoT 플러그 앤 플레이에 대한 connect 메서드가 포함되어 있습니다. PnP_CreateDeviceClientLLHandle
pnp_protocol: IoT 플러그 앤 플레이 도우미 함수를 포함합니다.
PnP_CreateReportedProperty
PnP_CreateReportedPropertyWithStatus
PnP_ParseCommandName
PnP_CreateTelemetryMessageHandle
PnP_ProcessTwinData
PnP_CopyPayloadToString
PnP_CreateDeviceClientLLHandle_ViaDps
이러한 도우미 함수는 고유한 프로젝트에서 사용할 수 있을 만큼 일반적입니다. 이 샘플은 모델의 각 구성 요소에 해당하는 세 개의 파일에서 이를 사용합니다.
- pnp_deviceinfo_component
- pnp_temperature_controller
- pnp_thermostat_component
예를 들어 pnp_deviceinfo_component 파일에서 SendReportedPropertyForDeviceInformation
함수는 두 도우미 함수를 사용합니다.
if ((jsonToSend = PnP_CreateReportedProperty(componentName, propertyName, propertyValue)) == NULL)
{
LogError("Unable to build reported property response for propertyName=%s, propertyValue=%s", propertyName, propertyValue);
}
else
{
const char* jsonToSendStr = STRING_c_str(jsonToSend);
size_t jsonToSendStrLen = strlen(jsonToSendStr);
if ((iothubClientResult = IoTHubDeviceClient_LL_SendReportedState(deviceClientLL, (const unsigned char*)jsonToSendStr, jsonToSendStrLen, NULL, NULL)) != IOTHUB_CLIENT_OK)
{
LogError("Unable to send reported state for property=%s, error=%d", propertyName, iothubClientResult);
}
else
{
LogInfo("Sending device information property to IoTHub. propertyName=%s, propertyValue=%s", propertyName, propertyValue);
}
}
샘플의 각 구성 요소는 이 패턴을 따릅니다.
코드 흐름
main
함수는 연결을 초기화하고 모델 ID를 보냅니다.
deviceClient = CreateDeviceClientAndAllocateComponents();
이 코드는 PnP_CreateDeviceClientLLHandle
을 사용하여 IoT 허브에 연결하고, modelId
를 옵션으로 설정하고, 직접 메서드 및 디바이스 쌍 업데이트에 대한 디바이스 메서드와 디바이스 쌍 콜백 처리기를 설정합니다.
g_pnpDeviceConfiguration.deviceMethodCallback = PnP_TempControlComponent_DeviceMethodCallback;
g_pnpDeviceConfiguration.deviceTwinCallback = PnP_TempControlComponent_DeviceTwinCallback;
g_pnpDeviceConfiguration.modelId = g_temperatureControllerModelId;
...
deviceClient = PnP_CreateDeviceClientLLHandle(&g_pnpDeviceConfiguration);
&g_pnpDeviceConfiguration
에는 연결 정보도 포함되어 있습니다. 환경 변수 IOTHUB_DEVICE_SECURITY_TYPE은 샘플에서 연결 문자열 또는 디바이스 프로비저닝 서비스를 사용하여 IoT 허브에 연결하는지 여부를 결정합니다.
디바이스에서 모델 ID를 보내면 해당 디바이스는 IoT 플러그 앤 플레이 디바이스가 됩니다.
콜백 처리기가 준비되면 디바이스는 쌍 업데이트 및 직접 메서드 호출에 반응합니다.
디바이스 쌍 콜백의 경우
PnP_TempControlComponent_DeviceTwinCallback
은PnP_ProcessTwinData
함수를 호출하여 데이터를 처리합니다.PnP_ProcessTwinData
는 방문자 패턴을 사용하여 JSON을 구문 분석한 다음, 각 요소에 대해PnP_TempControlComponent_ApplicationPropertyCallback
을 호출하여 각 속성을 방문합니다.명령 콜백의 경우
PnP_TempControlComponent_DeviceMethodCallback
함수는 도우미 함수를 사용하여 명령 및 구성 요소 이름을 구문 분석합니다.PnP_ParseCommandName(methodName, &componentName, &componentNameSize, &pnpCommandName);
그런 다음,
PnP_TempControlComponent_DeviceMethodCallback
함수는 구성 요소에 대해 명령을 호출합니다.LogInfo("Received PnP command for component=%.*s, command=%s", (int)componentNameSize, componentName, pnpCommandName); if (strncmp((const char*)componentName, g_thermostatComponent1Name, g_thermostatComponent1Size) == 0) { result = PnP_ThermostatComponent_ProcessCommand(g_thermostatHandle1, pnpCommandName, rootValue, response, responseSize); } else if (strncmp((const char*)componentName, g_thermostatComponent2Name, g_thermostatComponent2Size) == 0) { result = PnP_ThermostatComponent_ProcessCommand(g_thermostatHandle2, pnpCommandName, rootValue, response, responseSize); } else { LogError("PnP component=%.*s is not supported by TemperatureController", (int)componentNameSize, componentName); result = PNP_STATUS_NOT_FOUND; }
main
함수는 IoT 허브로 전송되는 읽기 전용 속성을 초기화합니다.
PnP_TempControlComponent_ReportSerialNumber_Property(deviceClient);
PnP_DeviceInfoComponent_Report_All_Properties(g_deviceInfoComponentName, deviceClient);
PnP_TempControlComponent_Report_MaxTempSinceLastReboot_Property(g_thermostatHandle1, deviceClient);
PnP_TempControlComponent_Report_MaxTempSinceLastReboot_Property(g_thermostatHandle2, deviceClient);
main
함수는 각 구성 요소에 대한 이벤트 및 원격 분석 데이터를 업데이트하는 루프를 입력합니다.
while (true)
{
PnP_TempControlComponent_SendWorkingSet(deviceClient);
PnP_ThermostatComponent_SendTelemetry(g_thermostatHandle1, deviceClient);
PnP_ThermostatComponent_SendTelemetry(g_thermostatHandle2, deviceClient);
}
PnP_ThermostatComponent_SendTelemetry
함수는 PNP_THERMOSTAT_COMPONENT
구조체를 사용하는 방법을 보여 줍니다. 샘플에서는 이 구조체를 사용하여 온도 컨트롤러의 두 자동 온도 조절기에 대한 정보를 저장합니다. 이 코드는 PnP_CreateTelemetryMessageHandle
함수를 사용하여 메시지를 준비하고 보냅니다.
messageHandle = PnP_CreateTelemetryMessageHandle(pnpThermostatComponent->componentName, temperatureStringBuffer);
...
iothubResult = IoTHubDeviceClient_LL_SendEventAsync(deviceClientLL, messageHandle, NULL, NULL);
main
함수는 마지막으로 다른 구성 요소를 삭제하고 허브에 대한 연결을 닫습니다.
이 자습서에서는 구성 요소를 사용하여 샘플 IoT 플러그 앤 플레이 디바이스 애플리케이션을 빌드하고, IoT 허브에 연결하고, Azure IoT 탐색기 도구를 사용하여 허브로 전송된 정보를 확인하는 방법을 보여 줍니다. 샘플 애플리케이션은 C#으로 작성되었으며 C#용 Azure IoT 디바이스 SDK에 포함되어 있습니다. 솔루션 빌더는 디바이스 코드를 볼 필요 없이 Azure IoT 탐색기 도구를 사용하여 IoT 플러그 앤 플레이 디바이스의 기능을 이해할 수 있습니다.
이 자습서에서는 다음을 수행합니다.
- 샘플 코드를 다운로드합니다.
- 샘플 코드를 빌드합니다.
- 샘플 디바이스 애플리케이션을 실행하고 IoT 허브에 연결되는지 확인합니다.
- 소스 코드를 검토합니다.
필수 조건
계속하기 전에 IoT 허브를 포함하여 환경을 설정했는지 확인합니다.
Linux 또는 Windows에서 이 자습서를 실행할 수 있습니다. 이 자습서의 셸 명령은 '/
' 경로 구분 기호에 대한 Linux 규칙을 따릅니다. Windows에서 계속 실행 중인 경우 '\
'에 대해 이러한 구분 기호를 교환해야 합니다.
샘플 코드를 사용하여 SDK 리포지토리 복제
자습서: Windows에서 실행되는 샘플 IoT 플러그 앤 플레이 디바이스 애플리케이션을 IoT Hub(C#)에 연결을 완료한 경우 이미 리포지토리를 복제한 것입니다.
C#용 Azure IoT 샘플 GitHub 리포지토리에서 샘플을 복제합니다. 선택한 폴더에서 명령 프롬프트를 엽니다. 다음 명령을 실행하여 .NET용 Microsoft Azure IoT SDK GitHub 리포지토리를 복제합니다.
git clone https://github.com/Azure/azure-iot-sdk-csharp.git
코드 빌드
이제 샘플을 빌드하고 실행할 수 있습니다. 다음 명령을 실행하여 샘플을 빌드합니다.
cd azure-iot-sdk-csharp/iothub/device/samples/solutions/PnpDeviceSamples/TemperatureController
dotnet build
디바이스 샘플 실행
샘플을 실행하려면 다음 명령을 실행합니다.
dotnet run
이제 디바이스가 명령 및 속성 업데이트를 받을 준비가 되었으며, 허브로 원격 분석 데이터를 보내기 시작했습니다. 다음 단계를 완료하는 동안 샘플을 계속 실행하세요.
Azure IoT 탐색기를 사용하여 코드 유효성 검사
디바이스 클라이언트 샘플이 시작되면 Azure IoT 탐색기 도구를 사용하여 작동하는지 확인합니다.
Azure IoT 탐색기를 엽니다.
IoT 허브에 대한 연결을 아직 추가하지 않은 경우 IoT 허브 페이지에서 + 연결 추가를 선택합니다. 이전에 만든 IoT 허브에 대한 연결 문자열을 입력하고 저장을 선택합니다.
IoT 플러그 앤 플레이 설정 페이지에서 + 추가 > 로컬 폴더를 선택하고 모델 파일을 저장한 로컬 models 폴더를 선택합니다.
IoT 허브 페이지에서 작업하려는 허브의 이름을 클릭합니다. IoT 허브에 등록된 디바이스 목록이 표시됩니다.
이전에 만든 디바이스의 디바이스 ID를 클릭합니다.
왼쪽의 메뉴에는 디바이스에 사용할 수 있는 다양한 유형의 정보가 표시됩니다.
IoT 플러그 앤 플레이 구성 요소를 선택하여 디바이스에 대한 모델 정보를 확인합니다.
디바이스의 다양한 구성 요소를 볼 수 있습니다. 기본 구성 요소 및 추가 구성 요소입니다. 작업할 구성 요소를 선택합니다.
원격 분석 페이지를 선택한 다음, 시작을 선택하여 이 구성 요소에 대해 디바이스에서 보내는 원격 분석 데이터를 살펴봅니다.
속성(읽기 전용) 페이지를 선택하여 이 구성 요소에 대해 보고된 읽기 전용 속성을 살펴봅니다.
속성(쓰기 가능) 페이지를 선택하여 이 구성 요소에 대해 업데이트할 수 있는 쓰기 가능 속성을 살펴봅니다.
해당 이름으로 속성을 선택하고, 새 값을 입력하고, 원하는 값 업데이트를 선택합니다.
새 값 표시를 보려면 새로 고침 단추를 선택합니다.
명령 페이지를 선택하여 이 구성 요소에 대한 모든 명령을 살펴봅니다.
테스트하려는 명령을 선택하여 매개 변수를 설정합니다. 명령 보내기를 선택하여 디바이스에서 명령을 호출합니다. 샘플 코드가 실행되고 있는 명령 프롬프트 창에서 디바이스가 명령에 응답하는 것을 볼 수 있습니다.
코드 검토
이 샘플은 IoT 플러그 앤 플레이 온도 컨트롤러 디바이스를 구현합니다. 이 샘플에서 구현하는 모델은 여러 구성 요소를 사용합니다. 온도 디바이스용 DTDL(Digital Twins Definition Language) 모델 파일은 디바이스에서 구현하는 원격 분석, 속성, 명령을 정의합니다.
디바이스 코드는 표준 CreateFromConnectionString
메서드를 사용하여 IoT 허브에 연결합니다. 디바이스는 연결 요청에서 구현하는 DTDL 모델의 모델 ID를 보냅니다. 모델 ID를 보내는 디바이스는 IoT 플러그 앤 플레이 디바이스입니다.
private static DeviceClient InitializeDeviceClient(string hostname, IAuthenticationMethod authenticationMethod)
{
var options = new ClientOptions
{
ModelId = ModelId,
};
var deviceClient = DeviceClient.Create(hostname, authenticationMethod, TransportType.Mqtt, options);
deviceClient.SetConnectionStatusChangesHandler((status, reason) =>
{
s_logger.LogDebug($"Connection status change registered - status={status}, reason={reason}.");
});
return deviceClient;
}
모델 ID는 다음 코드 조각과 같이 코드에 저장됩니다.
private const string ModelId = "dtmi:com:example:TemperatureController;1";
디바이스가 IoT 허브에 연결되면 코드에 명령 처리기를 등록합니다. reboot
명령은 기본 구성 요소에 정의되어 있습니다. getMaxMinReport
명령은 두 개의 온도 조절기 구성 요소 각각에 정의되어 있습니다.
await _deviceClient.SetMethodHandlerAsync("reboot", HandleRebootCommandAsync, _deviceClient, cancellationToken);
await _deviceClient.SetMethodHandlerAsync("thermostat1*getMaxMinReport", HandleMaxMinReportCommandAsync, Thermostat1, cancellationToken);
await _deviceClient.SetMethodHandlerAsync("thermostat2*getMaxMinReport", HandleMaxMinReportCommandAsync, Thermostat2, cancellationToken);
두 개의 온도 조절기 구성 요소에 원하는 속성 업데이트에 대한 별도의 처리기가 있습니다.
_desiredPropertyUpdateCallbacks.Add(Thermostat1, TargetTemperatureUpdateCallbackAsync);
_desiredPropertyUpdateCallbacks.Add(Thermostat2, TargetTemperatureUpdateCallbackAsync);
샘플 코드는 각 자동 온도 조절기 구성 요소에서 원격 분석을 보냅니다.
await SendTemperatureAsync(Thermostat1, cancellationToken);
await SendTemperatureAsync(Thermostat2, cancellationToken);
SendTemperatureTelemetryAsync
메서드는 PnpHhelper
클래스를 사용하여 각 구성 요소에 대한 메시지를 만듭니다.
using Message msg = PnpHelper.CreateIothubMessageUtf8(telemetryName, JsonConvert.SerializeObject(currentTemperature), componentName);
PnpHelper
클래스에는 여러 구성 요소 모델에서 사용할 수 있는 다른 예제 메서드가 포함되어 있습니다.
Azure IoT 탐색기 도구를 사용하여 두 가지 자동 온도 조절기 구성 요소의 원격 분석 및 속성을 볼 수 있습니다.
Azure IoT 탐색기 도구를 사용하여 두 가지 자동 온도 조절기 구성 요소 중 하나 또는 기본 구성 요소에서 명령을 호출할 수도 있습니다.
이 자습서에서는 구성 요소를 사용하여 샘플 IoT 플러그 앤 플레이 디바이스 애플리케이션을 빌드하고, IoT 허브에 연결하고, Azure IoT 탐색기 도구를 사용하여 허브로 전송된 정보를 확인하는 방법을 보여 줍니다. 샘플 애플리케이션은 Java로 작성되었으며 Java용 Azure IoT 디바이스 SDK에 포함되어 있습니다. 솔루션 빌더는 디바이스 코드를 볼 필요 없이 Azure IoT 탐색기 도구를 사용하여 IoT 플러그 앤 플레이 디바이스의 기능을 이해할 수 있습니다.
이 자습서에서는 다음을 수행합니다.
- 샘플 코드를 다운로드합니다.
- 샘플 코드를 빌드합니다.
- 샘플 디바이스 애플리케이션을 실행하고 IoT 허브에 연결되는지 확인합니다.
- 소스 코드를 검토합니다.
필수 조건
계속하기 전에 IoT 허브를 포함하여 환경을 설정했는지 확인합니다.
Linux 또는 Windows에서 이 자습서를 실행할 수 있습니다. 이 자습서의 셸 명령은 '/
' 경로 구분 기호에 대한 Linux 규칙을 따릅니다. Windows에서 계속 실행 중인 경우 '\
'에 대해 이러한 구분 기호를 교환해야 합니다.
이 자습서를 완료하려면 로컬 개발 환경에 다음 소프트웨어를 설치합니다.
코드 다운로드
자습서: 샘플 IoT 플러그 앤 플레이 디바이스 애플리케이션을 IoT Hub에 연결(Java)을 완료한 경우 이미 리포지토리를 복제한 것입니다.
선택한 디렉터리에서 명령 프롬프트를 엽니다. 다음 명령을 실행하여 Azure IoT Java SDK 및 라이브러리 GitHub 리포지토리를 이 위치에 복제합니다.
git clone https://github.com/Azure/azure-iot-sdk-java.git
이 작업을 완료하는 데 몇 분 정도가 걸립니다.
코드 빌드
복제된 Java SDK 리포지토리에서 온도 컨트롤러 샘플의 루트 폴더로 이동하고 샘플을 빌드합니다.
cd azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample
mvn clean package
디바이스 샘플 실행
환경 설정에서 DPS(Device Provisioning Service)를 사용하여 IoT 허브에 연결하도록 샘플을 구성하는 네 가지 환경 변수를 만들었습니다.
- 값이
DPS
인 IOTHUB_DEVICE_SECURITY_TYPE - IOTHUB_DEVICE_DPS_ID_SCOPE(DPS ID 범위 포함).
- 값이
my-pnp-device
인 IOTHUB_DEVICE_DPS_DEVICE_ID. - IOTHUB_DEVICE_DPS_DEVICE_KEY(등록 기본 키 포함).
- 값이
global.azure-devices-provisioning.net
인 IOTHUB_DEVICE_DPS_ENDPOINT.
샘플 애플리케이션을 실행하려면 /device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample 폴더로 이동하고 다음 명령을 실행합니다.
mvn exec:java -Dexec.mainClass="samples.com.microsoft.azure.sdk.iot.device.TemperatureController"
이제 디바이스가 명령 및 속성 업데이트를 받을 준비가 되었으며, 허브로 원격 분석 데이터를 보내기 시작했습니다. 다음 단계를 완료하는 동안 샘플을 계속 실행하세요.
Azure IoT 탐색기를 사용하여 코드 유효성 검사
디바이스 클라이언트 샘플이 시작되면 Azure IoT 탐색기 도구를 사용하여 작동하는지 확인합니다.
Azure IoT 탐색기를 엽니다.
IoT 허브에 대한 연결을 아직 추가하지 않은 경우 IoT 허브 페이지에서 + 연결 추가를 선택합니다. 이전에 만든 IoT 허브에 대한 연결 문자열을 입력하고 저장을 선택합니다.
IoT 플러그 앤 플레이 설정 페이지에서 + 추가 > 로컬 폴더를 선택하고 모델 파일을 저장한 로컬 models 폴더를 선택합니다.
IoT 허브 페이지에서 작업하려는 허브의 이름을 클릭합니다. IoT 허브에 등록된 디바이스 목록이 표시됩니다.
이전에 만든 디바이스의 디바이스 ID를 클릭합니다.
왼쪽의 메뉴에는 디바이스에 사용할 수 있는 다양한 유형의 정보가 표시됩니다.
IoT 플러그 앤 플레이 구성 요소를 선택하여 디바이스에 대한 모델 정보를 확인합니다.
디바이스의 다양한 구성 요소를 볼 수 있습니다. 기본 구성 요소 및 추가 구성 요소입니다. 작업할 구성 요소를 선택합니다.
원격 분석 페이지를 선택한 다음, 시작을 선택하여 이 구성 요소에 대해 디바이스에서 보내는 원격 분석 데이터를 살펴봅니다.
속성(읽기 전용) 페이지를 선택하여 이 구성 요소에 대해 보고된 읽기 전용 속성을 살펴봅니다.
속성(쓰기 가능) 페이지를 선택하여 이 구성 요소에 대해 업데이트할 수 있는 쓰기 가능 속성을 살펴봅니다.
해당 이름으로 속성을 선택하고, 새 값을 입력하고, 원하는 값 업데이트를 선택합니다.
새 값 표시를 보려면 새로 고침 단추를 선택합니다.
명령 페이지를 선택하여 이 구성 요소에 대한 모든 명령을 살펴봅니다.
테스트하려는 명령을 선택하여 매개 변수를 설정합니다. 명령 보내기를 선택하여 디바이스에서 명령을 호출합니다. 샘플 코드가 실행되고 있는 명령 프롬프트 창에서 디바이스가 명령에 응답하는 것을 볼 수 있습니다.
코드 검토
이 샘플은 IoT 플러그 앤 플레이 온도 컨트롤러 디바이스를 구현합니다. 이 샘플에서 구현하는 모델은 여러 구성 요소를 사용합니다. 온도 디바이스용 DTDL(Digital Twins Definition Language) 모델 파일은 디바이스에서 구현하는 원격 분석, 속성, 명령을 정의합니다.
디바이스 코드는 표준 DeviceClient
클래스를 사용하여 IoT 허브에 연결합니다. 디바이스는 연결 요청에서 구현하는 DTDL 모델의 모델 ID를 보냅니다. 모델 ID를 보내는 디바이스는 IoT 플러그 앤 플레이 디바이스입니다.
private static void initializeDeviceClient() throws URISyntaxException, IOException {
ClientOptions options = new ClientOptions();
options.setModelId(MODEL_ID);
deviceClient = new DeviceClient(deviceConnectionString, protocol, options);
deviceClient.registerConnectionStatusChangeCallback((status, statusChangeReason, throwable, callbackContext) -> {
log.debug("Connection status change registered: status={}, reason={}", status, statusChangeReason);
if (throwable != null) {
log.debug("The connection status change was caused by the following Throwable: {}", throwable.getMessage());
throwable.printStackTrace();
}
}, deviceClient);
deviceClient.open();
}
모델 ID는 다음 코드 조각과 같이 코드에 저장됩니다.
private static final String MODEL_ID = "dtmi:com:example:Thermostat;1";
디바이스가 IoT 허브에 연결되면 코드에 명령 처리기를 등록합니다.
deviceClient.subscribeToDeviceMethod(new MethodCallback(), null, new MethodIotHubEventCallback(), null);
두 개의 온도 조절기 구성 요소에 원하는 속성 업데이트에 대한 별도의 처리기가 있습니다.
deviceClient.startDeviceTwin(new TwinIotHubEventCallback(), null, new GenericPropertyUpdateCallback(), null);
Map<Property, Pair<TwinPropertyCallBack, Object>> desiredPropertyUpdateCallback = Stream.of(
new AbstractMap.SimpleEntry<Property, Pair<TwinPropertyCallBack, Object>>(
new Property(THERMOSTAT_1, null),
new Pair<>(new TargetTemperatureUpdateCallback(), THERMOSTAT_1)),
new AbstractMap.SimpleEntry<Property, Pair<TwinPropertyCallBack, Object>>(
new Property(THERMOSTAT_2, null),
new Pair<>(new TargetTemperatureUpdateCallback(), THERMOSTAT_2))
).collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue));
deviceClient.subscribeToTwinDesiredProperties(desiredPropertyUpdateCallback);
샘플 코드는 각 자동 온도 조절기 구성 요소에서 원격 분석을 보냅니다.
sendTemperatureReading(THERMOSTAT_1);
sendTemperatureReading(THERMOSTAT_2);
sendTemperatureReading
메서드는 PnpHhelper
클래스를 사용하여 각 구성 요소에 대한 메시지를 만듭니다.
Message message = PnpHelper.createIotHubMessageUtf8(telemetryName, currentTemperature, componentName);
PnpHelper
클래스에는 여러 구성 요소 모델에서 사용할 수 있는 다른 예제 메서드가 포함되어 있습니다.
Azure IoT 탐색기 도구를 사용하여 두 가지 자동 온도 조절기 구성 요소의 원격 분석 및 속성을 볼 수 있습니다.
Azure IoT 탐색기 도구를 사용하여 두 가지 자동 온도 조절기 구성 요소 중 하나 또는 기본 구성 요소에서 명령을 호출할 수도 있습니다.
이 자습서에서는 구성 요소를 사용하여 샘플 IoT 플러그 앤 플레이 디바이스 애플리케이션을 빌드하고, IoT 허브에 연결하고, Azure IoT 탐색기 도구를 사용하여 허브로 전송된 정보를 확인하는 방법을 보여 줍니다. 샘플 애플리케이션은 Node.js용으로 작성되었으며 Node.js용 Azure IoT Hub 디바이스 SDK에 포함되어 있습니다. 솔루션 빌더는 디바이스 코드를 볼 필요 없이 Azure IoT 탐색기 도구를 사용하여 IoT 플러그 앤 플레이 디바이스의 기능을 이해할 수 있습니다.
이 자습서에서는 다음을 수행합니다.
- 샘플 코드를 다운로드합니다.
- 샘플 디바이스 애플리케이션을 실행하고 IoT 허브에 연결되는지 확인합니다.
- 소스 코드를 검토합니다.
필수 조건
계속하기 전에 IoT 허브를 포함하여 환경을 설정했는지 확인합니다.
이 자습서를 완료하려면 개발 머신에 Node.js가 필요합니다. nodejs.org에서 여러 플랫폼에 권장하는 최신 버전을 다운로드할 수 있습니다.
다음 명령을 사용하여 개발 컴퓨터에서 Node.js의 현재 버전을 확인할 수 있습니다.
node --version
코드 다운로드
자습서: Windows에서 실행되는 샘플 IoT 플러그 앤 플레이 디바이스 애플리케이션을 IoT Hub(노드)에 연결을 완료한 경우 이미 리포지토리를 복제한 것입니다.
선택한 디렉터리에서 명령 프롬프트를 엽니다. 다음 명령을 실행하여 Node.js용 Microsoft Azure IoT SDK GitHub 리포지토리를 다음 위치에 복제합니다.
git clone https://github.com/Azure/azure-iot-sdk-node
필수 라이브러리 설치
디바이스 SDK를 사용하여 포함된 샘플 코드를 빌드합니다. 빌드하는 애플리케이션은 IoT 허브에 연결하는 여러 구성 요소를 사용하여 플러그 앤 플레이 디바이스를 시뮬레이션합니다. 이 애플리케이션은 원격 분석 데이터 및 속성을 보내고 명령을 수신합니다.
- 로컬 터미널 창에서, 복제된 리포지토리의 폴더로 이동하여 /azure-iot-sdk-node/device/samples/javascript 폴더를 찾습니다. 그런 다음, 다음 명령을 실행하여 필요한 라이브러리를 설치합니다.
npm install
이 명령은 폴더의 샘플을 실행하는 데 필요한 관련 npm 파일을 설치합니다.
코드 검토
azure-iot-sdk-node/device/samples/javascript 폴더로 이동합니다.
azure-iot-sdk-node/device/samples/javascript 폴더에는 IoT 플러그 앤 플레이 온도 컨트롤러 디바이스에 대한 샘플 코드가 포함되어 있습니다.
pnp_temperature_controller.js 파일의 코드는 IoT 플러그 앤 플레이 온도 컨트롤러 디바이스를 구현합니다. 이 샘플에서 구현하는 모델은 여러 구성 요소를 사용합니다. 온도 디바이스용 DTDL(Digital Twins Definition Language) 모델 파일은 디바이스에서 구현하는 원격 분석, 속성, 명령을 정의합니다.
선택한 코드 편집기에서 pnp_temperature_controller.js 파일을 엽니다. 샘플 코드는 다음 작업을 수행하는 방법을 보여줍니다.
구현하고 있는 디바이스의 DTMI인
modelId
를 정의합니다. 이 DTMI는 사용자 정의되며 온도 컨트롤러 DTDL 모델의 DTMI와 일치해야 합니다.온도 컨트롤러 DTDL 모델에 정의된 구성 요소를 구현합니다. 실제 온도 컨트롤러의 구성 요소는 이러한 두 인터페이스를 구현해야 합니다. 이러한 두 인터페이스는 중앙 리포지토리에 이미 게시되어 있습니다. 이 샘플의 두 인터페이스는 다음과 같습니다.
- 자동 온도 조절기
- Azure에서 개발한 디바이스 정보
구성 요소 이름을 정의합니다. 이 샘플에는 두 개의 자동 온도 조절기와 하나의 디바이스 정보 구성 요소가 있습니다.
디바이스가 응답하는 명령의 명령 이름을 정의합니다.
serialNumber
상수를 정의합니다.serialNumber
는 고정된 특정 디바이스입니다.명령 처리기를 정의합니다.
명령 응답을 보낼 함수를 정의합니다.
명령 요청을 기록하는 도우미 함수를 정의합니다.
속성을 만드는 도우미 함수를 정의합니다.
속성 업데이트 수신기를 정의합니다.
이 디바이스의 원격 분석 데이터를 전송하는 함수를 정의합니다. 자동 온도 조절기와 기본 구성 요소 둘 다 원격 분석 데이터를 전송합니다. 이 함수는 구성 요소 이름을 매개 변수로 수신합니다.
다음과 같은 작업을 수행하는
main
함수를 정의합니다.디바이스 SDK를 사용하여 디바이스 클라이언트를 만들고 IoT 허브에 연결합니다. 디바이스에서
modelId
를 제공합니다. 그러면 IoT Hub가 디바이스를 IoT 플러그 앤 플레이 디바이스로 식별할 수 있습니다.onDeviceMethod
함수를 사용하여 명령 요청 수신 대기를 시작합니다. 이 함수는 다음과 같이 서비스의 명령 요청에 대한 수신기를 설정합니다.- 디바이스 DTDL은
reboot
및getMaxMinReport
명령을 정의합니다. commandHandler
함수는 디바이스가 명령에 응답하는 방법을 정의합니다.
- 디바이스 DTDL은
setInterval
및sendTelemetry
를 사용하여 원격 분석 보내기를 시작합니다.helperCreateReportedPropertiesPatch
함수를 사용하여 속성을 만들고updateComponentReportedProperties
함수를 사용하여 속성을 업데이트합니다.desiredPropertyPatchListener
를 사용하여 속성 업데이트를 수신 대기합니다.Q 또는 q를 누르면 모든 수신기 및 작업을 사용하지 않도록 설정하고 루프를 종료합니다.
환경 설정에서 DPS(Device Provisioning Service)를 사용하여 IoT 허브에 연결하도록 샘플을 구성하는 네 가지 환경 변수를 만들었습니다.
- 값이
DPS
인 IOTHUB_DEVICE_SECURITY_TYPE - IOTHUB_DEVICE_DPS_ID_SCOPE(DPS ID 범위 포함).
- 값이
my-pnp-device
인 IOTHUB_DEVICE_DPS_DEVICE_ID. - IOTHUB_DEVICE_DPS_DEVICE_KEY(등록 기본 키 포함).
- 값이
global.azure-devices-provisioning.net
인 IOTHUB_DEVICE_DPS_ENDPOINT.
샘플 구성에 대해 자세히 알아보려면 샘플 추가 정보를 참조하세요.
코드를 살펴보았으면 다음 명령을 사용하여 샘플을 실행합니다.
node pnp_temperature_controller.js
디바이스가 허브로 원격 분석 데이터를 보내기 시작했으며, 이제 명령 및 속성 업데이트를 받을 준비가 되었다는 것을 나타내는 다음 출력이 표시됩니다.
다음 단계를 완료하는 동안 샘플을 계속 실행하세요.
Azure IoT 탐색기를 사용하여 코드 유효성 검사
디바이스 클라이언트 샘플이 시작되면 Azure IoT 탐색기 도구를 사용하여 작동하는지 확인합니다.
Azure IoT 탐색기를 엽니다.
IoT 허브에 대한 연결을 아직 추가하지 않은 경우 IoT 허브 페이지에서 + 연결 추가를 선택합니다. 이전에 만든 IoT 허브에 대한 연결 문자열을 입력하고 저장을 선택합니다.
IoT 플러그 앤 플레이 설정 페이지에서 + 추가 > 로컬 폴더를 선택하고 모델 파일을 저장한 로컬 models 폴더를 선택합니다.
IoT 허브 페이지에서 작업하려는 허브의 이름을 클릭합니다. IoT 허브에 등록된 디바이스 목록이 표시됩니다.
이전에 만든 디바이스의 디바이스 ID를 클릭합니다.
왼쪽의 메뉴에는 디바이스에 사용할 수 있는 다양한 유형의 정보가 표시됩니다.
IoT 플러그 앤 플레이 구성 요소를 선택하여 디바이스에 대한 모델 정보를 확인합니다.
디바이스의 다양한 구성 요소를 볼 수 있습니다. 기본 구성 요소 및 추가 구성 요소입니다. 작업할 구성 요소를 선택합니다.
원격 분석 페이지를 선택한 다음, 시작을 선택하여 이 구성 요소에 대해 디바이스에서 보내는 원격 분석 데이터를 살펴봅니다.
속성(읽기 전용) 페이지를 선택하여 이 구성 요소에 대해 보고된 읽기 전용 속성을 살펴봅니다.
속성(쓰기 가능) 페이지를 선택하여 이 구성 요소에 대해 업데이트할 수 있는 쓰기 가능 속성을 살펴봅니다.
해당 이름으로 속성을 선택하고, 새 값을 입력하고, 원하는 값 업데이트를 선택합니다.
새 값 표시를 보려면 새로 고침 단추를 선택합니다.
명령 페이지를 선택하여 이 구성 요소에 대한 모든 명령을 살펴봅니다.
테스트하려는 명령을 선택하여 매개 변수를 설정합니다. 명령 보내기를 선택하여 디바이스에서 명령을 호출합니다. 샘플 코드가 실행되고 있는 명령 프롬프트 창에서 디바이스가 명령에 응답하는 것을 볼 수 있습니다.
이 자습서에서는 구성 요소를 사용하여 샘플 IoT 플러그 앤 플레이 디바이스 애플리케이션을 빌드하고, IoT 허브에 연결하고, Azure IoT 탐색기 도구를 사용하여 허브로 전송된 정보를 확인하는 방법을 보여 줍니다. 샘플 애플리케이션은 Python으로 작성되었으며 Python용 Azure IoT 디바이스 SDK에 포함되어 있습니다. 솔루션 빌더는 디바이스 코드를 볼 필요 없이 Azure IoT 탐색기 도구를 사용하여 IoT 플러그 앤 플레이 디바이스의 기능을 이해할 수 있습니다.
이 자습서에서는 다음을 수행합니다.
- 샘플 코드를 다운로드합니다.
- 샘플 디바이스 애플리케이션을 실행하고 IoT 허브에 연결되는지 확인합니다.
- 소스 코드를 검토합니다.
필수 조건
계속하기 전에 IoT 허브를 포함하여 환경을 설정했는지 확인합니다.
Linux 또는 Windows에서 이 자습서를 실행할 수 있습니다. 이 자습서의 셸 명령은 '/
' 경로 구분 기호에 대한 Linux 규칙을 따릅니다. Windows에서 계속 실행 중인 경우 '\
'에 대해 이러한 구분 기호를 교환해야 합니다.
이 자습서를 완료하려면 개발 컴퓨터에 Python이 설치되어 있어야 합니다. 현재 Python 버전 요구 사항에 대해서는 Azure IoT Python SDK를 확인합니다. 다음 명령을 사용하여 현재 Python 버전을 확인할 수 있습니다.
python --version
python.org에서 여러 플랫폼에 권장되는 최신 버전을 다운로드할 수 있습니다.
코드 다운로드
azure-iot-device 패키지가 PIP로 게시됩니다.
로컬 Python 환경에서 다음과 같이 패키지를 설치합니다.
pip install azure-iot-device
자습서: Windows에서 실행되는 샘플 IoT 플러그 앤 플레이 디바이스 애플리케이션을 IoT Hub(Python)에 연결을 완료한 경우 이미 리포지토리를 복제한 것입니다.
Python SDK IoT 리포지토리를 복제합니다.
git clone --branch v2 https://github.com/Azure/azure-iot-sdk-python
코드 검토
이 샘플은 IoT 플러그 앤 플레이 온도 컨트롤러 디바이스를 구현합니다. 이 샘플에서 구현하는 모델은 여러 구성 요소를 사용합니다. 온도 디바이스용 DTDL(Digital Twins Definition Language) 모델 파일은 디바이스에서 구현하는 원격 분석, 속성, 명령을 정의합니다.
azure-iot-sdk-python/samples/pnp 폴더에는 IoT 플러그 앤 플레이 디바이스에 대한 샘플 코드가 포함되어 있습니다. 온도 컨트롤러 샘플의 파일은 다음과 같습니다.
- temp_controller_with_thermostats.py
- pnp_helper.py
온도 컨트롤러에는 온도 컨트롤러 DTDL 모델을 기반으로 하는 여러 구성 요소와 기본 구성 요소가 있습니다.
선택한 편집기에서 temp_controller_with_thermostats.py 파일을 엽니다. 이 파일의 코드는 다음과 같습니다.
도우미 메서드에 대한 액세스 권한을 얻기 위해
pnp_helper.py
를 가져옵니다.DTDL 모델에 정의된 두 개의 서로 다른 인터페이스를 고유하게 나타내는 DTMI(디지털 쌍 모델 식별자) 두 개를 정의합니다. 실제 온도 컨트롤러의 구성 요소는 이러한 두 인터페이스를 구현해야 합니다. 이러한 두 인터페이스는 중앙 리포지토리에 이미 게시되어 있습니다. 이러한 DTMI는 사용자에게 알려져야 하며 디바이스 구현 시나리오에 따라 달라집니다. 현재 샘플의 경우 두 인터페이스가 다음을 나타냅니다.
- 자동 온도 조절기
- Azure에서 개발한 디바이스 정보입니다.
구현되는 디바이스의 DTMI
model_id
를 정의합니다. DTMI는 사용자 정의되며 DTDL 모델 파일의 DTMI와 일치해야 합니다.DTDL 파일의 구성 요소에 지정된 이름을 정의합니다. DTDL에는 두 개의 자동 온도 조절기와 하나의 디바이스 정보 구성 요소가 있습니다. 또한
serial_number
라는 상수가 기본 구성 요소에 정의됩니다. 디바이스의serial_number
를 변경할 수 없습니다.명령 처리기 구현을 정의합니다. 이 핸들러는 디바이스가 명령 요청을 수신할 때 수행하는 작업을 정의합니다.
명령 응답을 만드는 함수를 정의합니다. 이 함수는 디바이스가 명령 요청에 응답하는 방법을 정의합니다. 명령에서 사용자 지정 응답을 다시 IoT 허브로 보내야 하는 경우 명령 응답 함수를 만듭니다. 명령에 대한 응답 함수를 제공하지 않으면 일반 응답이 전송됩니다. 이 샘플에서는 getMaxMinReport 명령에만 사용자 지정 응답이 있습니다.
이 디바이스의 원격 분석 데이터를 전송하는 함수를 정의합니다. 자동 온도 조절기와 기본 구성 요소 둘 다 원격 분석 데이터를 전송합니다. 이 함수에서는 선택적 구성 요소 이름 매개 변수를 사용하여 원격 분석을 보낸 구성 요소를 식별할 수 있습니다.
명령 요청의 수신기를 정의합니다.
desired 속성 업데이트에 대한 수신기를 정의합니다.
다음과 같은
main
함수를 갖고 있습니다.디바이스 SDK를 사용하여 디바이스 클라이언트를 만들고 IoT 허브에 연결합니다. 디바이스에서
model_id
를 보냅니다. 그러면 IoT 허브가 디바이스를 IoT 플러그 앤 플레이 디바이스로 식별할 수 있습니다.도우미 파일의
create_reported_properties
함수를 사용하여 속성을 만듭니다. 구성 요소 이름과 속성을 이 함수에 키 값 쌍으로 전달합니다.patch_twin_reported_properties
를 호출하여 해당 구성 요소의 읽기 가능 속성을 업데이트합니다.execute_command_listener
함수를 사용하여 명령 요청 수신 대기를 시작합니다. 이 함수는 서비스의 명령 요청에 대한 수신기를 설정합니다. 수신기를 설정할 때method_name
,user_command_handler
및 선택적create_user_response_handler
를 매개 변수로 제공합니다.method_name
은 명령 요청을 정의합니다. 이 샘플의 모델은 reboot 및 getMaxMinReport 명령을 정의합니다.user_command_handler
함수는 디바이스가 명령을 수신할 때 수행할 작업을 정의합니다.create_user_response_handler
함수는 명령이 성공적으로 실행될 때 IoT 허브로 전송할 응답을 만듭니다. 포털에서 이 응답을 볼 수 있습니다. 이 함수를 제공하지 않으면 일반 응답이 서비스로 전송됩니다.
execute_property_listener
를 사용하여 속성 업데이트를 수신 대기합니다.send_telemetry
를 사용하여 원격 분석 보내기를 시작합니다. 샘플 코드는 루프를 사용하여 세 가지 원격 분석 보내기 함수를 호출합니다. 각 함수는 8초마다 호출됩니다.Q 또는 q를 누르면 모든 수신기 및 작업을 사용하지 않도록 설정하고 루프를 종료합니다.
환경 설정에서 DPS(Device Provisioning Service)를 사용하여 IoT 허브에 연결하도록 샘플을 구성하는 네 가지 환경 변수를 만들었습니다.
- 값이
DPS
인 IOTHUB_DEVICE_SECURITY_TYPE - IOTHUB_DEVICE_DPS_ID_SCOPE(DPS ID 범위 포함).
- 값이
my-pnp-device
인 IOTHUB_DEVICE_DPS_DEVICE_ID. - IOTHUB_DEVICE_DPS_DEVICE_KEY(등록 기본 키 포함).
- 값이
global.azure-devices-provisioning.net
인 IOTHUB_DEVICE_DPS_ENDPOINT.
샘플 구성에 대해 자세히 알아보려면 샘플 추가 정보를 참조하세요.
다음 명령을 사용하여 샘플을 실행합니다.
python temp_controller_with_thermostats.py
샘플 디바이스는 몇 초마다 원격 분석 메시지를 IoT 허브로 보냅니다.
디바이스가 허브로 원격 분석 데이터를 보내고 있으며, 이제 명령 및 속성 업데이트를 받을 준비가 되었다는 것을 나타내는 다음 출력이 표시됩니다.
다음 단계를 완료하는 동안 샘플을 계속 실행하세요.
Azure IoT 탐색기를 사용하여 코드 유효성 검사
디바이스 클라이언트 샘플이 시작되면 Azure IoT 탐색기 도구를 사용하여 작동하는지 확인합니다.
Azure IoT 탐색기를 엽니다.
IoT 허브에 대한 연결을 아직 추가하지 않은 경우 IoT 허브 페이지에서 + 연결 추가를 선택합니다. 이전에 만든 IoT 허브에 대한 연결 문자열을 입력하고 저장을 선택합니다.
IoT 플러그 앤 플레이 설정 페이지에서 + 추가 > 로컬 폴더를 선택하고 모델 파일을 저장한 로컬 models 폴더를 선택합니다.
IoT 허브 페이지에서 작업하려는 허브의 이름을 클릭합니다. IoT 허브에 등록된 디바이스 목록이 표시됩니다.
이전에 만든 디바이스의 디바이스 ID를 클릭합니다.
왼쪽의 메뉴에는 디바이스에 사용할 수 있는 다양한 유형의 정보가 표시됩니다.
IoT 플러그 앤 플레이 구성 요소를 선택하여 디바이스에 대한 모델 정보를 확인합니다.
디바이스의 다양한 구성 요소를 볼 수 있습니다. 기본 구성 요소 및 추가 구성 요소입니다. 작업할 구성 요소를 선택합니다.
원격 분석 페이지를 선택한 다음, 시작을 선택하여 이 구성 요소에 대해 디바이스에서 보내는 원격 분석 데이터를 살펴봅니다.
속성(읽기 전용) 페이지를 선택하여 이 구성 요소에 대해 보고된 읽기 전용 속성을 살펴봅니다.
속성(쓰기 가능) 페이지를 선택하여 이 구성 요소에 대해 업데이트할 수 있는 쓰기 가능 속성을 살펴봅니다.
해당 이름으로 속성을 선택하고, 새 값을 입력하고, 원하는 값 업데이트를 선택합니다.
새 값 표시를 보려면 새로 고침 단추를 선택합니다.
명령 페이지를 선택하여 이 구성 요소에 대한 모든 명령을 살펴봅니다.
테스트하려는 명령을 선택하여 매개 변수를 설정합니다. 명령 보내기를 선택하여 디바이스에서 명령을 호출합니다. 샘플 코드가 실행되고 있는 명령 프롬프트 창에서 디바이스가 명령에 응답하는 것을 볼 수 있습니다.
리소스 정리
더 많은 디바이스 개발자 문서를 계속할 계획이라면 이 문서에서 사용한 리소스를 유지하고 재사용할 수 있습니다. 그렇지 않으면 이 문서에서 만든 리소스를 삭제하여 추가 요금을 방지할 수 있습니다.
다음 Azure CLI 명령을 사용하여 전체 리소스 그룹을 삭제하면 허브와 등록된 디바이스를 한 번에 삭제할 수 있습니다. 이러한 리소스가 유지하려는 다른 리소스와 리소스 그룹을 공유하는 경우에는 이 명령을 사용하지 마세요.
az group delete --name <YourResourceGroupName>
IoT 허브만 삭제하려면 Azure CLI을 사용하여 다음 명령을 실행합니다.
az iot hub delete --name <YourIoTHubName>
IoT 허브에 등록한 디바이스 ID만 삭제하려면 Azure CLI를 사용하여 다음 명령을 실행합니다.
az iot hub device-identity delete --hub-name <YourIoTHubName> --device-id <YourDeviceID>
개발 머신에서 복제된 샘플 파일을 제거할 수도 있습니다.
다음 단계
이 자습서에서는 IoT 플러그 앤 플레이 디바이스를 구성 요소와 IoT 허브에 연결하는 방법을 알아보았습니다. IoT 플러그 앤 플레이 디바이스 모델에 대한 자세한 내용은 다음을 참조하세요.