본문 바로가기

프로젝트/AWS LED Button (WIFI, AWS)

[AWS IoT 프로젝트] AWS LED Button 개요 / 목차 / 동영상

개요

결론적으로는 안드로이드 앱으로 ESP32와 연결된 LED를 켜고 끄는 아주 간단한 프로젝트입니다. 이번 프로젝트의 목표는 하드웨어를 제어하는 것이 아니라, 안드로이드 앱과 임베디드 시스템이 암호화된 웹 클라우드를 매개로 비동기적 통신 시스템을 구현하는 것이기 때문에 제어할 하드웨어 영역을 의도적으로 줄였습니다.

 

또한 단순한 장거리 통신은 WIFI를 사용하고 ESP32에서 HTTP 서버를 구축하여 구현할 수도 있지만, 아마존 웹 서비스(AWS)를 사용한 이유는 SDK에 보안과 통신을 담당하는 API가 이미 구현되어 있고, 또한 주요 언어, 플랫폼에 대해 제공되기 때문입니다. AWS C언어 SDK는 리눅스용이지만 ESP32 SDK에서 이미 포팅해서 제공하고 있었습니다. Android SDK 링크

 

제 블로그의 프로젝트 관련 포스트들은 모두 이용하는 제품이나 서비스에 대한 기본적인 이해를 가정하고 실제 구현을 목표로 하므로 기초적인 부분은 직접 공부해야 합니다.

 

처음엔 AWS IoT만 공부하면 될 줄 알았는데, AWS를 제대로 이용하려면 몇개의 서비스를 통합해야 하기 때문에, Cognito, IAM 등에 대해서도 공부하느라 약간 지연됐습니다. 이조차도 아직 잘 몰라서 계속 공부하는 중입니다.

 

어쨌든 전체적인 프로세스는 다음과 같습니다.

 

 

 

 

 

 

 

 

구성요소

1. ESP32-WROOM-32

2. 안드로이드 앱

3. 아마존 웹 서비스

 

1. ESP32 (Thing)

제어 대상에 연결되어 있고, 제어 대상의 최근 변경 상태를 자신의 non-volatile memory와 AWS IoT의 Thing Shadow에 저장합니다. 또한 Device Serial Number 기반의 토픽을 통해 명령을 수신(Subscribe)하고 결과를 송신(Publish)합니다. Shadow 업데이트, Publish, Subscribe는 모두 MQTT 프로토콜을 통해 수행됩니다. 

 

2. 안드로이드 앱 (클라이언트)

회원가입->로그인->이메일 인증을 통해 가입된 사용가 ESP32 고유의 DSN과 default operation key를 등록했을 때만 AWS IoT를 통해 Thing에 접근할 수 있습니다. ESP32와는 반대로 DSN 기반의 토픽을 통해 명령을 송신(Publish)하고 결과를 수신(Subscribe)합니다. 역시 MQTT 프로토콜을 사용합니다.

 

3. 아마존 웹 서비스 (AWS)

Thing과 클라이언트 사이의 중재 역할을 합니다. 사실 Thing과 클라이언트는 서로 직접 연결되는 것이 아니라 AWS를 통해 비동기적으로 연결됩니다. 각 포스트에서 좀 더 자세히 설명하겠지만, 각 주체에 허용된 정책에 따라 토픽을 필터링 하여 적절한 주체에게 전달하는 역할을 합니다. 

 

개발 순서

동영상(주목해야할 점) 이메일 인증하고 회원가입하는 영상은 찍기 힘들어 뺐습니다.

  1. 최초 AWS IoT 서비스에서 사물 섀도우의 LED 상태를 true로 설정한 상태에서, LED Button(ESP32)과 컨트롤러(안드로이드 앱)는 AWS IoT에서 섀도우의 내용을 읽어온 후에 그 내용을 바탕으로 초기화를 수행한다.
  2. LED Button의 boot button을 누르면 LED가 토글되면서 AWS IoT의 사물 섀도우를 업데이트하고, 그 결과를 컨트롤러에게 발행(Publish)한다.
  3. LED Button 컨트롤러에서 ON/OFF 버튼을 누르면 LED Button이 토글되면서 AWS IoT의 사물 섀도우를 업데이트하고, 그 결과를 컨트롤러에게 발행(Publish)한다.
  4. LED Button 컨트롤러에서 operation key를 잘못 입력하면 LED Button는 구독한 명령을 무시해 버린다. 터미널과 LED Button 컨트롤러 메세지 창에서 확인 가능
  5. LED Button 컨트롤러에서 operation key 변경 과정