Azure IoT Edge 모듈 트윈 활용으로 회로 상태 관리하기
도커 컨테이너에서 실행되는 Johnny 5에 모듈 트윈을 통해 도메인 특화 언어를 적용하여 라즈베리 파이에서 LED 깜빡이기.
시작하며
개요:
Azure IoT Edge는 간헐적으로 연결된 디바이스가 "모듈 트윈"을 통해 원하는 속성을 얻도록 허용합니다. 이 트윈은 Edge 모듈 내 특정 동작을 구동하는 원하는 상태 구성으로 사용될 수 있습니다. Edge 모듈은 컨테이너 워크로드로 실행되어 지속적인 연결 필요 없이 자가 치유와 신속한 배포를 허용. 인터넷 사용 가능 시 디바이스는 클라우드 서비스를 활용해 모듈 내 메서드 호출 가능.
이 프로젝트에서는 Azure IoT NodeJS SDK를 사용해 IoT Edge 모듈을 개발합니다. 이 모듈은 클라우드에서 원하는 상태를 얻어 라즈베리 파이의 GPIO 핀을 구성하여 Johnny 5로 연결된 회로에서 원하는 연산 수행.
이 접근법으로 흥미로운 사용 사례 가능:
* 단일 회로에 서로 다른 상태 구성 적용으로 다중 운영 모드 허용
* 쿠버네티스로 오케스트레이션되고 적절히 구성된 경우, 동일한 회로에 연결된 두 디바이스로 하드웨어 장애 조치
배경:
원하는 상태 구성은 서버 최초 프로비저닝 시와 실행 중인 시스템의 준수 강제에 자주 사용되는 인기 개념. 우리는 이 개념을 회로로 확장하며, 네트워크 연결이 간헐적일 수 있는 영역에서 회복력과 건전한 작동을 위해 설계된 서비스를 사용. 이 접근법으로 연결된 회로의 동작을 런타임에 변경 가능하고 하드웨어 중복을 포함한 흥미로운 시나리오 허용.
Microsoft의 Azure IoT Edge 런타임이 프로젝트의 견고한 기반 제공. 이 런타임은 로컬 하드웨어에서 서비스로 실행되며 Azure 클라우드에서 디바이스별로 구성되는 컨테이너화된 "모듈" 오케스트레이션 허용. 두 시스템 모듈이 항상 사용됨: 배포 구성을 얻고 적용하는 edge-agent, 클라우드에 캐시된 메시징과 모듈 간 통신 허용하는 edge-hub.
Azure IoT NodeJS SDK로 Azure IoT Edge 모듈 생성으로 시작. 이 모듈은 주어진 디바이스에 대한 원하는 속성과 보고된 속성을 지정하는 트윈 구성을 수신. 도메인 특화 언어를 Johnny 5 구성으로 파싱. 이를 통해 클라우드에서 회로 기능을 정의하고 IoT Edge 모듈에 적용.
예제 구성:
"config": "{\\"peripherals\\":[{\\"type\\":\\"Led\\",\\"name\\":\\"alarm\\",\\"settings\\"
:\\{\\"pin\\":\\"GPIO18\\"\\},\\"initialState\\": {\\"method\\":\\"blink\\",\\"period\\":500},\\
\\"outputAlias\\":\\"alias2\\"},{\\"type\\":\\"Button\\",\\"name\\":\\"button\\",\\"settings\\":
{\\"pin\\":\\"GPIO20\\"\\},\\"outputAlias\\":\\"alias1\\}]}",
이 예제는 GPIO18의 LED 장치를 정의하며 500ms마다 깜빡이는 initialState 가짐. LED 상태는 outputAlias로 다른 모듈에 전파 가능. 버튼도 GPIO20에 사용하여 상태 변경을 alias1로 발행. 이런 구성으로 outputAlias 라우팅으로 추가 모듈에서 상태 변화에 독립적으로 반응 가능.
현재 이 메커니즘으로 온도계, LED, 버튼 장치 구성 지원.
재현 단계:
시작하려면 배포된 IoT Hub가 있는 Microsoft Azure 구독 필요.
다음으로 하드웨어 구성 시작: LED를 라즈베리 파이 GPIO18에 연결. 이 과정 지침은 여기 참조.
회로와 클라우드 서비스 준비 후, 이 가이드 따라 라즈베리 파이에 Azure IoT Edge 런타임 설치. 런타임 설치 후 수동으로 디바이스 프로비저닝(이 지침 참조).
다음으로 Azure에서 특수 배포 생성하여 LED 깜빡이게 함.
아래와 같이 배포 생성:
이미지 URL:
toolboc/johnny5onedge:0.0.981-arm32v7
컨테이너 생성 옵션:
{"ExposedPorts":{"9229/tcp":{}},"HostConfig":{"PortBindings":{"9229/tcp":[{"HostPort":"9229"}]},"Privileged":true,"Devices":[{"PathOnHost":"/dev/i2c-1","PathInContainer":"/dev/i2c-1","CgroupPermissions":"rwm"},{"PathOnHost":"/dev/gpiomem","PathInContainer":"/dev/gpiomem","CgroupPermissions":"rwm"}],"Mounts":[{"Type":"bind","Source":"/lib/modules/","Target":"/lib/modules/"}]}}
모듈 트윈의 원하는 속성:
{
"properties.desired": {
"config": "{\\"peripherals\\":[{\\"type\\":\\"Led\\",\\"name\\":\\"alarm\\",\\"settings\\":{\\"pin\\":\\"GPIO18\\"},\\"initialState\\": {\\"method\\":\\"blink\\",\\"period\\":500},\\"outputAlias\\":\\"alias2\\"},{\\"type\\":\\"Button\\",\\"name\\":\\"on\\",\\"settings\\":{\\"pin\\":\\"GPIO20\\"},\\"outputAlias\\":\\"alias1\\}]}"
}
}
완료 후 저장. "Specify Routes"와 "Specify Metrics" 섹션 건너뛰고 "Target Devices"까지 진행.
Priority를 10으로 설정하고 타겟 조건을 tags.environment='blinK로 추가.
Read More Information…..
Desired State Configuration for Circuits