본문 바로가기

AWS IoT/펌웨어

[AWS LED Button] ESP32 (1) : 시스템 흐름

시스템 흐름

 

 

 

 

 

 

ESP32는 AWS IoT에서 생성된 인증서와 개인키를 생성/다운로드한 후 바이너리 파일을 내부 플래시(non-volatile memory)에 저장합니다. AWS IoT에서 인증서를 생성하는 방법은 여기에나와 있습니다. 인증서를 생성하고 나면 <인증서 ID>-certificate.pem.crt(인증서), <인증서 ID>-private.pem.key(개인키), <인증서 ID>-public.pem.key(공용키)를 받을 수 있습니다. 하지만 공용키는 필요 없으니 무시하고, 인증서와 개인키만 다운받아서 파일 이름의 "<인증서 ID>-" 지운 다음 certs 폴더에 넣으면 컴파일할 때 자동으로 이미지에 삽입됩니다.

 

사실 개인키와 공용키의 확장자 .crt와 .key는 단순 문자열입니다. 따라서 텍스트 에디터로도 오류없이 내용을 확인할 수 있습니다. 그리고 이 문자열 파일들을 makefile에서 COMPONENT_EMBED_TEXTFILES 변수로 정의해 주면 xtensa-esp32-elf(edit)가 알아서 null이 없는 문자열로 변환합니다. 변환된 문자열의 주소는 파일이름에서 _binary_가 추가되고 - _ .가 모두 _로 바뀐 라벨로써 인라인 어셈블리를 통해 C코드에서 참조할 수 있습니다. 설명을 보는 것 보다 소스코드를 보는게 더 빠르겠네요. 이 링크에 소스코드와 설명이 나와있습니다. 또한 소스 코드의 main/component.mk와 main/led_button.c에서도 확인할 수 있습니다.

 

이렇게 인증서와 개인키가 이미지에 포함되면, 이것은 ESP32가 AWS IoT와 통신할 때 SSL(Secure Socket Layer) 프로토콜을 사용하여 통신을 암호화, 복호화하고 AWS IoT를 인증하기 위해 사용됩니다. SSL에 대한 자세한 내용은 이 링크에 있습니다. 인증서가 이미지에 포함되어 유출되는 것을 걱정할 수도 있지만, 해커는 플래시에 저장된 이미지 파일을 뽑아내는 1차적 문제, 바이너리파일로 변환된 이미지 파일을 리버스하는 2차적 문제에 직면하게 됩니다. 또한 ESP32는 플래시 암호화 기능을 제공하기 때문에 플래시에 저장된 이미지 조차 뽑아내기 어려울 것입니다. 이 때문에 안드로이드 어플리케이션과 달리 ESP32에 별다른 의심 없이 인증서와 개인키를 그대로 내장했습니다.

 

인증서는 AWS IoT 내에서 사용자가 만든 정책에 연결됩니다. 그리고 이 정책에 포함되어 있는 권한에 대한 동작만 수행할 수 있습니다. AWS IoT 내에서 정책을 만들고 인증서에 부착하는 방법은 아래 링크에 설명되어 있습니다.

 

  1. AWS IoT 정책 생성
  2. 인증서에 AWS IoT 정책 연결

마지막으로 AWS IoT Console > Setting > Custom endpoint를 ESP32의 menuconfig > Component config > Amazon Web Services IoT Platform > AWS IoT Endpoint Hostname에 붙여넣습니다.

 

여기까지 설정이 완료되면 ESP32가 AWS IoT와 통신할 수 있습니다. AWS IoT는 MQTT 프로토콜을 사용하며, 데이터는 JSON 포맷을 이용합니다.

 

그리고 버튼을 누르면 사물은 AWS IoT의 섀도우를 업데이트합니다. 업데이트가 완료되면 LED를 토글하고 안드로이드 앱 클라이언트에 결과를 발행(Publish)합니다. 또한 항상 LEDButton<Device Serial Number>/command 토픽을 구독하여 안드로이드 앱 클라이언트로 부터 명령을 기다립니다.

 

다음 포스트에서 MQTT 프로토콜과 정책 설정, JSON 포맷에 대해 자세히 알아보겠습니다.