자습서: Eclipse ThreadX를 사용하여 MXCHIP AZ3166 개발 키트를 IoT Hub에 연결
이 자습서에서는 Eclipse ThreadX를 사용하여 MXCHIP AZ3166 IoT DevKit(이제부터 MXCHIP DevKit)를 Azure IoT에 연결합니다.
다음 작업을 완료합니다.
- C에서 MXChip DevKit를 프로그래밍하기 위한 임베디드 개발 도구 세트 설치
- 이미지를 빌드하고 MXCHIP DevKit로 플래시
- Azure CLI를 사용하여 MXCHIP DevKit가 안전하게 연결할 Azure IoT Hub를 만들고 관리
- Azure IoT Explorer를 사용하여 IoT Hub에 디바이스를 등록하고, 디바이스 속성을 보고, 디바이스 원격 분석을 보고, 디바이스에서 직접 명령 호출
필수 조건
Windows 10 또는 Windows 11을 실행하는 PC
활성화된 Azure 구독. Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.
리포지토리를 복제하기 위한 Git
Azure CLI 이 자습서에는 Azure CLI 명령을 실행하기 위한 두 가지 옵션이 있습니다.
- 브라우저에서 CLI 명령을 실행하는 대화형 셸인 Azure Cloud Shell을 사용합니다. 이 옵션은 아무 것도 설치할 필요가 없으므로 권장됩니다. 처음으로 Cloud Shell을 사용하는 경우 Azure Portal에 로그인합니다. Cloud Shell 빠른 시작의 단계를 따라 Cloud Shell을 시작하고 Bash 환경을 선택합니다.
- 선택적으로 로컬 컴퓨터에서 Azure CLI를 실행합니다. Azure CLI가 이미 설치된 경우
az upgrade
를 실행하여 CLI 및 확장을 현재 버전으로 업그레이드합니다. Azure CLI를 설치하는 방법은 Azure CLI 2.0 설치를 참조하세요.
하드웨어
- MXCHIP AZ3166 IoT DevKit(MXCHIP DevKit)
- Wi-Fi 2.4GHz
- USB 2.0 A~마이크로 USB 수 케이블
개발 환경 준비
개발 환경을 설정하려면 먼저 자습서에 필요한 모든 자산이 포함되어 있는 GitHub 리포지토리를 복제합니다. 그런 다음, 프로그래밍 도구 세트를 설치합니다.
리포지토리 복제
모든 샘플 디바이스 코드, 설치 스크립트 및 오프라인 버전 설명서를 다운로드하려면 다음 리포지토리를 복제합니다. 이전에 다른 자습서에서 이 리포지토리를 복제한 경우 다시 복제할 필요가 없습니다.
리포지토리를 복제하려면 다음 명령을 실행합니다.
git clone --recursive https://github.com/eclipse-threadx/getting-started.git
도구 설치
복제된 리포지토리에는 필요한 도구를 설치하고 구성하는 설치 스크립트가 포함되어 있습니다. 다른 포함된 디바이스 자습서에서 이러한 도구를 설치한 경우 다시 설치할 필요가 없습니다.
도구를 설치하려면
리포지토리에서 다음 경로로 이동하고 get-toolchain.bat이라는 설치 스크립트를 실행합니다.
getting-started\tools\get-toolchain.bat
새 콘솔 창을 열어 설치 스크립트의 구성 변경 내용을 인식합니다. 이 콘솔을 사용하여 자습서의 나머지 프로그래밍 작업을 완료합니다. Windows용 Windows CMD, PowerShell 또는 Git Bash를 사용할 수 있습니다.
다음 코드를 실행하여 CMake 버전 3.14 이상이 설치되어 있는지 확인합니다.
cmake --version
클라우드 구성 요소 만들기
IoT Hub 만들기
Azure CLI를 사용하여 디바이스에 대한 이벤트 및 메시징을 처리하는 IoT Hub를 만들 수 있습니다.
IoT Hub를 만듭니다.
CLI 앱을 시작합니다. 이 빠른 시작의 나머지 부분에서 CLI 명령을 실행하려면 명령 구문을 복사하고 CLI 애플리케이션에 붙여넣은 후 변수 값을 편집하고 Enter 키를 누릅니다.
- Cloud Shell을 사용하는 경우 Cloud Shell에 대한 링크를 마우스 오른쪽 단추로 클릭하고 새 탭에서 열기 옵션을 선택합니다.
- Azure CLI를 로컬에서 사용하고 있는 경우 CLI 콘솔 앱을 시작하고 Azure CLI에 로그인합니다.
az extension add를 실행하여 azure-iot 확장을 현재 버전으로 설치하거나 업그레이드합니다.
az extension add --upgrade --name azure-iot
az group create를 실행하여 리소스 그룹을 만듭니다. 다음 명령을 사용하면 centralus 지역에 MyResourceGroup이라는 리소스 그룹을 만듭니다.
참고 항목
선택적으로 대체
location
을 설정할 수 있습니다. 사용 가능한 위치를 보려면 az account list-locations를 실행합니다.az group create --name MyResourceGroup --location centralus
az iot hub create 명령을 사용하여 IoT Hub를 만듭니다. IoT Hub를 만드는 데 몇 분 정도 걸릴 수 있습니다.
YourIotHubName. 코드에서 이 자리 표시자를 IoT 허브용으로 선택한 이름으로 바꿉니다. IoT Hub 이름은 Azure에서 전역적으로 고유해야 합니다. 이 자리 표시자는 이 빠른 시작의 나머지 부분에서 고유한 IoT Hub 이름을 표시하는 데 사용됩니다.
--sku F1
매개 변수는 무료 계층에 IoT Hub를 만듭니다. 무료 계층 허브에는 제한된 기능 세트가 있으며 개념 증명 애플리케이션에 사용됩니다. IoT Hub 계층, 기능 및 가격 책정에 대한 자세한 내용은 Azure IoT Hub 가격 책정을 참조하세요.az iot hub create --resource-group MyResourceGroup --name {YourIoTHubName} --sku F1 --partition-count 2
IoT Hub를 만든 후 콘솔에서 JSON 출력을 보고, 이후 단계에서 사용할
hostName
값을 복사합니다.hostName
값은 다음 예제와 같습니다.{Your IoT hub name}.azure-devices.net
IoT Explorer 구성
이 빠른 시작의 나머지 단계에서는 IoT Explorer를 사용하여 IoT Hub에 디바이스를 등록하고, 디바이스 속성 및 원격 분석을 보고, 디바이스에 명령을 보냅니다. 이 섹션에서는 만든 IoT Hub에 연결하고 퍼블릭 모델 리포지토리에서 플러그 앤 플레이 모델을 읽도록 IoT Explorer를 구성합니다.
IoT Hub에 대한 연결을 추가하려면
Azure IoT Explorer를 설치합니다. 이 도구는 Azure IoT 리소스를 모니터링하고 관리하는 플랫폼 간 유틸리티입니다.
CLI 앱에서 az iot hub connection-string show 명령을 실행하여 IoT Hub에 대한 연결 문자열을 가져옵니다.
az iot hub connection-string show --hub-name {YourIoTHubName}
따옴표 문자로 묶지 말고 연결 문자열을 복사합니다.
Azure IoT Explorer의 왼쪽 메뉴에서 IoT Hub를 선택합니다.
+ 연결 추가를 클릭합니다.
연결 문자열을 연결 문자열 상자에 붙여넣습니다.
저장을 선택합니다.
연결에 성공하면 IoT Explorer가 디바이스 보기로 전환됩니다.
퍼블릭 모델 리포지토리를 추가하려면
IoT Explorer에서 홈을 선택하여 홈 보기로 돌아갑니다.
왼쪽 메뉴에서 IoT 플러그 앤 플레이 설정을 선택합니다.
엔드포인트가 있는 기존 공용 리포지토리 항목이 있는지 확인합니다
https://devicemodels.azure.com
.참고 항목
퍼블릭 리포지토리 항목이 없는 경우 +추가를 선택하고 드롭다운 메뉴에서 공용 리포지토리를 선택하고 엔드포인트 값을 지정
https://devicemodels.azure.com
한 다음 저장을 선택합니다.퍼블릭 리포지토리 대한 완료된 항목은 다음 스크린샷과 같습니다.
디바이스 등록
이 섹션에서는 새 디바이스 인스턴스를 만들고 만든 IoT Hub에 등록합니다. 이후 섹션에서 새로 등록한 디바이스에 대한 연결 정보를 사용하여 물리적 디바이스를 안전하게 연결합니다.
디바이스를 등록하려면
IoT Explorer의 홈 보기에서 IoT Hub를 선택합니다.
이전에 추가한 연결이 표시됩니다. 연결 속성 아래에서 이 허브의 디바이스 보기를 선택합니다.
+ 새로 만들기를 선택하고 디바이스의 디바이스 ID를 입력합니다(예:
mydevice
). 다른 모든 속성은 동일하게 유지합니다.만들기를 실행합니다.
복사 단추를 사용하여 디바이스 ID 및 기본 키 필드를 복사합니다.
다음 섹션을 계속하기 전에 이전 단계에서 검색한 다음의 각 값을 안전한 위치에 저장합니다. 다음 섹션에서 이러한 값을 사용하여 디바이스를 구성합니다.
hostName
deviceId
primaryKey
디바이스 준비
MXCHIP DevKit를 Azure에 연결하려면 Wi-Fi 및 Azure IoT 설정에 대한 구성 파일을 수정하고, 이미지를 다시 빌드하고, 해당 이미지를 디바이스로 플래시합니다.
구성 추가
텍스트 편집기에서 다음 파일을 엽니다.
getting-started\MXChip\AZ3166\app\azure_config.h
표시된 것처럼 파일 위쪽에 있는 다음 줄을 주석으로 처리합니다.
// #define ENABLE_DPS
Wi-Fi 상수를 로컬 환경의 다음 값으로 설정합니다.
상수 이름 값 WIFI_SSID
{사용자의 Wi-Fi SSID} WIFI_PASSWORD
{사용자의 Wi-Fi 암호} WIFI_MODE
{파일에 열거된 Wi-Fi 모드 값 중 하나} Azure IoT 디바이스 정보 상수를 Azure 리소스를 만든 후에 저장한 값으로 설정합니다.
상수 이름 값 IOT_HUB_HOSTNAME
{호스트 이름 값} IOT_HUB_DEVICE_ID
{사용자의 디바이스 ID 값} IOT_DEVICE_SAS_KEY
{사용자의 기본 키 값} 파일을 저장 후 닫습니다.
이미지 빌드
콘솔 또는 파일 탐색기에서 다음 경로에 있는 rebuild.bat 스크립트를 실행하여 이미지를 빌드합니다.
getting-started\MXChip\AZ3166\tools\rebuild.bat
빌드가 완료되면 이진 파일이 다음 경로에 만들어졌는지 확인합니다.
getting-started\MXChip\AZ3166\build\app\mxchip_azure_iot.bin
이미지 플래시
MXCHIP DevKit에서 다시 설정 단추 및 마이크로 USB 포트를 찾습니다. 이러한 구성 요소는 다음 단계에서 사용합니다. 다음 그림에는 두 가지 구성 요소가 모두 강조 표시되어 있습니다.
마이크로 USB 케이블을 MXCHIP DevKit의 마이크로 USB 포트에 연결한 다음, 컴퓨터에 연결합니다.
파일 탐색기에서 이전 섹션에서 만든 이진 파일을 찾습니다.
mxchip_azure_iot.bin 이진 파일을 복사합니다.
파일 탐색기에서 컴퓨터에 연결된 MXCHIP DevKit 디바이스를 찾습니다. 디바이스는 드라이브 레이블이 AZ3166인 드라이브로 시스템에 표시됩니다.
이진 파일을 MXCHIP DevKit의 루트 폴더에 붙여넣습니다. 깜박임이 자동으로 시작되고 몇 초 후에 완료됩니다.
참고 항목
깜박임 프로세스 중에 녹색 LED에서 MXCHIP DevKit를 켭니다.
디바이스 연결 세부 정보 확인
Termite 앱을 사용하여 통신을 모니터링하고 디바이스가 올바르게 설정되었는지 확인할 수 있습니다.
Termite를 시작합니다.
팁
Termite를 DevKit에 연결할 수 없는 경우 ST-LINK 드라이버를 설치하고 다시 시도합니다. 추가 단계는 문제 해결을 참조하세요.
설정을 선택합니다.
직렬 포트 설정 대화 상자에서 다음 설정을 확인하고, 필요한 경우 업데이트합니다.
- 전송 속도: 115,200
- 포트: MXCHIP DevKit가 연결된 포트입니다. 드롭다운에 여러 포트 옵션이 있는 경우 사용할 올바른 포트를 찾을 수 있습니다. Windows 디바이스 관리자를 열고, 포트를 확인하여 사용할 포트를 식별합니다.
확인을 선택합니다.
디바이스의 다시 설정 단추를 누릅니다. 이 단추는 디바이스에 대한 레이블을 표시하고 마이크로 USB 커넥터 근처에 있습니다.
Termite 앱에서 다음 검사점 값을 확인하여 디바이스가 초기화되고 Azure IoT에 연결되었는지 확인합니다.
Starting Azure thread Initializing WiFi MAC address: ****************** SUCCESS: WiFi initialized Connecting WiFi Connecting to SSID 'iot' Attempt 1... SUCCESS: WiFi connected Initializing DHCP IP address: 192.168.0.49 Mask: 255.255.255.0 Gateway: 192.168.0.1 SUCCESS: DHCP initialized Initializing DNS client DNS address: 192.168.0.1 SUCCESS: DNS client initialized Initializing SNTP time sync SNTP server 0.pool.ntp.org SNTP time update: Jan 4, 2023 22:57:32.658 UTC SUCCESS: SNTP initialized Initializing Azure IoT Hub client Hub hostname: ***.azure-devices.net Device id: mydevice Model id: dtmi:eclipsethreadx:devkit:gsgmxchip;2 SUCCESS: Connected to IoT Hub Receive properties: {"desired":{"$version":1},"reported":{"deviceInformation":{"__t":"c","manufacturer":"MXCHIP","model":"AZ3166","swVersion":"1.0.0","osName":"Eclipse ThreadX","processorArchitecture":"Arm Cortex M4","processorManufacturer":"STMicroelectronics","totalStorage":1024,"totalMemory":128},"ledState":false,"telemetryInterval":{"ac":200,"av":1,"value":10},"$version":4}} Sending property: $iothub/twin/PATCH/properties/reported/?$rid=3{"deviceInformation":{"__t":"c","manufacturer":"MXCHIP","model":"AZ3166","swVersion":"1.0.0","osName":"Eclipse ThreadX","processorArchitecture":"Arm Cortex M4","processorManufacturer":"STMicroelectronics","totalStorage":1024,"totalMemory":128}} Sending property: $iothub/twin/PATCH/properties/reported/?$rid=5{"ledState":false} Sending property: $iothub/twin/PATCH/properties/reported/?$rid=7{"telemetryInterval":{"ac":200,"av":1,"value":10}} Starting Main loop Telemetry message sent: {"humidity":31.01,"temperature":25.62,"pressure":927.3}. Telemetry message sent: {"magnetometerX":177,"magnetometerY":-36,"magnetometerZ":-346.5}. Telemetry message sent: {"accelerometerX":-22.5,"accelerometerY":0.54,"accelerometerZ":1049.01}. Telemetry message sent: {"gyroscopeX":0,"gyroscopeY":0,"gyroscopeZ":0}.
다음 단계에서 디바이스 출력을 모니터링하려면 Termite를 열어 둡니다.
디바이스 속성 보기
Azure IoT Explorer를 사용하여 디바이스의 속성을 보고 관리할 수 있습니다. 이 섹션 및 다음 섹션에서는 IoT Explorer에 표시되는 플러그 앤 플레이 기능을 사용하여 MXCHIP DevKit를 관리하고 상호 작용합니다. 이러한 기능은 퍼블릭 모델 리포지토리에서 MXCHIP DevKit에 대해 게시된 디바이스 모델을 사용합니다. 이 자습서의 앞부분에서 이 리포지토리에서 디바이스 모델을 검색하도록 IoT Explorer를 구성했습니다. IoT Explorer에 있는 디바이스 창의 왼쪽 메뉴에서 작업을 선택하여 플러그 앤 플레이를 사용하지 않고도 많은 작업을 수행할 수 있습니다. 그러나 플러그 앤 플레이를 사용하면 대개 향상된 환경이 제공됩니다. IoT Explorer는 플러그 앤 플레이 디바이스에서 지정된 디바이스 모델을 읽고 해당 디바이스와 관련된 정보를 제공할 수 있습니다.
Iot Explorer에서 디바이스에 대한 IoT 플러그 앤 플레이 구성 요소에 액세스하려면
IoT Explorer의 홈 보기에서 IoT Hub를 선택한 다음, 이 허브의 디바이스 보기를 선택합니다.
디바이스를 선택합니다.
IoT 플러그 앤 플레이 구성 요소를 참조하세요.
기본 구성 요소를 선택합니다. IoT Explorer에는 디바이스에 구현된 IoT 플러그 앤 플레이 구성 요소가 표시됩니다.
인터페이스 탭에서 디바이스 모델 설명에 있는 JSON 콘텐츠를 확인합니다. JSON에는 디바이스 모델의 각 IoT 플러그 앤 플레이 구성 요소에 대한 구성 정보가 포함되어 있습니다.
IoT Explorer의 각 탭은 디바이스 모델의 IoT 플러그 앤 플레이 구성 요소 중 하나에 해당합니다.
Tab Type 입력 설명 인터페이스 인터페이스 MXCHIP Getting Started Guide
MXCHIP DevKit에 대한 예제 모델 속성(읽기 전용) 속성 ledState
LED의 현재 상태 속성(쓰기 가능) 속성 telemetryInterval
디바이스에서 원격 분석을 전송하는 간격 명령 명령 setLedState
LED 켜기 또는 끄기
Azure IoT Explorer를 사용하여 디바이스 속성을 보려면
속성(쓰기 가능) 탭을 선택합니다. 원격 분석이 전송되는 간격이 표시됩니다.
telemetryInterval
을 5로 변경한 후 원하는 값 업데이트를 선택합니다. 이제 디바이스에서 이 간격을 사용하여 원격 분석을 보냅니다.IoT Explorer는 알림으로 응답합니다. Termite에서 업데이트를 확인할 수도 있습니다.
원격 분석 간격을 10으로 다시 설정합니다.
Azure CLI를 사용하여 디바이스 속성을 보려면
az iot hub device-twin show 명령을 실행합니다.
az iot hub device-twin show --device-id mydevice --hub-name {YourIoTHubName}
콘솔 출력에서 디바이스의 속성을 검사합니다.
원격 분석 데이터 보기
Azure IoT Explorer를 사용하면 디바이스에서 클라우드로의 원격 분석 흐름을 볼 수 있습니다. 필요에 따라 Azure CLI를 사용하여 동일한 작업을 수행할 수 있습니다.
Azure IoT Explorer에서 원격 분석을 보려면
IoT Explorer의 디바이스에 대한 IoT 플러그 앤 플레이 구성 요소(기본 구성 요소) 창에서 원격 분석 탭을 선택합니다. 기본 제공 이벤트 허브 사용이 예로 설정되어 있는지 확인합니다.
시작을 선택합니다.
디바이스에서 메시지를 클라우드에 보낼 때 원격 분석을 봅니다.
참고 항목
Termite 앱을 사용하여 디바이스에서 원격 분석을 모니터링할 수도 있습니다.
디바이스 모델에서 지정한 데이터 형식으로 이벤트를 보려면 모델링된 이벤트 표시 확인란을 선택합니다.
중지를 선택하여 수신 이벤트를 종료합니다.
Azure CLI를 사용하여 디바이스 원격 분석을 보려면
az iot hub monitor-events 명령을 실행합니다. 이전에 디바이스 및 IoT Hub에 대해 Azure IoT에서 만든 이름을 사용합니다.
az iot hub monitor-events --device-id mydevice --hub-name {YourIoTHubName}
콘솔에서 JSON 출력을 봅니다.
{ "event": { "origin": "mydevice", "module": "", "interface": "dtmi:eclipsethreadx:devkit:gsgmxchip;1", "component": "", "payload": "{\"humidity\":41.21,\"temperature\":31.37,\"pressure\":1005.18}" } }
Ctrl+C를 선택하여 모니터링을 종료합니다.
디바이스에서 직접 메서드 호출
Azure IoT Explorer를 사용하여 디바이스에서 구현한 직접 메서드를 호출할 수도 있습니다. 직접 메서드에는 이름이 있으며, 필요에 따라 JSON 페이로드, 구성 가능한 연결 및 메서드 시간 제한이 있을 수 있습니다. 이 섹션에서는 LED를 설정하거나 해제하는 메서드를 호출합니다. 필요에 따라 Azure CLI를 사용하여 동일한 작업을 수행할 수 있습니다.
Azure IoT 탐색기에서 메서드를 호출하려면
IoT Explorer의 디바이스에 대한 IoT 플러그 앤 플레이 구성 요소(기본 구성 요소) 창에서 명령 탭을 선택합니다.
setLedState 명령의 경우 상태를 true로 설정합니다.
명령 보내기를 선택합니다. IoT Explorer에 알림이 표시되고 디바이스의 노란색 사용자 LED 표시등이 켜집니다.
상태를 false로 설정한 다음, 명령 보내기를 선택합니다. 노란색 사용자 LED 표시등이 꺼집니다.
필요에 따라 Termite에서 출력을 확인하여 메서드의 상태를 모니터링할 수 있습니다.
Azure CLI를 사용하여 메서드를 호출하려면
az iot hub invoke-device-method 명령을 실행하고 메서드 이름과 페이로드를 지정합니다. 이 메서드의 경우 LED를 켜려면
method-payload
를true
로 설정하고, LED를 끄려면false
로 설정합니다.az iot hub invoke-device-method --device-id mydevice --method-name setLedState --method-payload true --hub-name {YourIoTHubName}
CLI 콘솔은 디바이스에서 메서드 호출의 상태를 표시합니다. 여기서
204
는 성공을 나타냅니다.{ "payload": {}, "status": 200 }
디바이스에서 LED 상태를 확인합니다.
Termite 터미널을 보고 출력 메시지를 확인합니다.
Receive direct method: setLedState Payload: true LED is turned ON Device twin property sent: {"ledState":true}
문제 해결 및 디버그
디바이스 코드 빌드, 디바이스 플래시 또는 연결에 문제가 발생하는 경우 문제 해결을 참조하세요.
애플리케이션 디버깅에 대한 자세한 내용은 Visual Studio Code를 사용하여 디버깅을 참조하세요.
리소스 정리
이 빠른 시작에서 만든 Azure 리소스가 더 이상 필요하지 않은 경우 Azure CLI를 사용하여 리소스 그룹 및 모든 리소스를 삭제할 수 있습니다.
Important
리소스 그룹을 삭제하면 다시 되돌릴 수 없습니다. 리소스 그룹 및 그 안에 포함된 모든 리소스가 영구적으로 삭제됩니다. 잘못된 리소스 그룹 또는 리소스를 자동으로 삭제하지 않도록 해야 합니다.
리소스 그룹을 이름으로 삭제하려면:
az group delete 명령을 실행합니다. 이 명령을 실행하면 만든 리소스 그룹, IoT Hub 및 디바이스 등록이 제거됩니다.
az group delete --name MyResourceGroup
az group list 명령을 실행하여 리소스 그룹을 삭제했는지 확인합니다.
az group list
다음 단계
이 자습서에서는 Eclipse ThreadX 샘플 코드가 포함된 사용자 지정 이미지를 빌드한 다음 해당 이미지를 MXCHIP DevKit 디바이스에 플래시했습니다. 또한 Azure CLI 및/또는 IoT Explorer를 사용하여 Azure 리소스를 만들고, MXCHIP DevKit를 Azure에 안전하게 연결하고, 원격 분석을 보고, 메시지를 보냈습니다.
다음 단계로 다음 문서를 탐색하여 포함된 개발 옵션에 대해 자세히 알아봅니다.
Eclipse ThreadX는 기본 MCU/MPU 하드웨어 보호 메커니즘을 사용하여 통신을 보호하고 코드 및 데이터 격리를 만드는 구성 요소를 OEM에 제공합니다. 그러나 각 OEM은 궁극적으로 디바이스에서 진화하는 보안 요구 사항을 충족하는지 확인해야 합니다.