본문 바로가기

AWS IoT/펌웨어

(6)
[AWS LED Button] ESP32 (6) : 소스 코드 및 기타 기능 GitHub 1. key store 모듈과 operation key ESP32(Thing)의 non-volatile memory에 operation key를 저장하고 가져오기 위해 ESP32 SDK의 non-volatile storage(이하 nvs) 라이브러리가 사용됩니다. 하지만 nvs는 operation key에 대해서만 사용되고, 필요한 동작도 "초기화, 저장, 불러오기"뿐이므로 nvs 관련된 모든 동작을 미리 정의한 key_store 모듈을 따로 만들었습니다. 결과적으로 nvs 기능을 사용할 때마다 핸들과 key 값을 입력하거나 NULL을 검사할 필요 없이 아래 3개 함수만 사용하면 됩니다. esp_err_t opkey_store_init(); esp_err_t set_opkey(const ch..
[AWS LED Button] ESP32 (5) : 콜백을 받기 위한 yield 함수 아래 함수들은 콜백 함수를 입력할 수 있습니다. aws_iot_mqtt_subscribe aws_iot_shadow_update aws_iot_shadow_get aws_iot_shadow_regitster_delta(구조체 매개 변수의 맴버 변수에 콜백 함수 입력) 하지만 위 함수들에 콜백 함수를 입력했다고, AWS IoT에서 메세지가 도착했을 때 콜백 함수가 실행되는 것은 아닙니다. 아래 함수들로 MQTT 모듈(aws_iot_mqtt 또는 aws_iot_shadow 모듈)에 스래드를 넘겨주어야 합니다. 스래드를 전달 받은 MQTT 모듈은 매개변수로 입력된 timeout 시간 동안 TCP 상태를 모니터하기 위해 MQTT 핑을 관리하고, AWS IoT에 대한 수신 소켓을 점검합니다. 스래드를 넘겨주기 때..
[AWS LED Button] ESP32 (4) : AWS_IoT_Client 객체 C언어에서 객체라니..? 자바 공부를 하기 전이었으면 당황스러웠겠지만 자바와 RTOS를 공부하고나니 객체 지향 프로그래밍이라는 것이 특정 언어에 종속되는 개념이 아니라는 것을 알았습니다. 태생이 객체 지향 프로그래밍을 위해 개발된 자바나 C# 보다 약간 번거롭지만, C언어로도 객체 지향을 어느정도 흉내낼 수 있습니다. 간단하게 RTOS를 예로 들면 "테스크 함수"가 클래스 역할, "테스크 핸들"이 객체 역할을 한다고 볼 수 있습니다. "테스크 함수 A"를 사용하여 "테스크 1", "테스크 2"를 만들고 "테스크 핸들 1", "테스크 핸들 2"를 할당 받았을 때, "테스크 1"과 "테스크 2"는 동일한 "테스크 함수 A"를 참조하지만, 다른 메모리 공간을 리소스로 사용합니다. 그리고 그 공간을 각각 "테스..
[AWS LED Button] ESP32 (3) : C언어에서 JSON 문서 분석하기 C언어에서 문자열로 된 JSON 문서를 분석해주는 라이브러리로 cJSON과 jsmn이 있습니다. 전 cJSON을 사용했습니다. cJSON 사용법은 간단합니다. 인스턴스를 가지고 모듈을 초기화할 필요도 없고, (내부에서 malloc 함수가 쓰이긴 하지만)반환 값을 위해 malloc 함수로 따로 공간을 할당할 필요도 없습니다. 먼저 JSON 포맷의 문자열을 cJSON_Parse 함수에 파라미터로 넣어주면, cJSON 타입 체인의 시작 주소를 반환합니다. cJSON 구조체는 다음과 같습니다. /* The cJSON structure: */ typedef struct cJSON { struct cJSON *next,*prev;/* next/prev allow you to walk array/object chai..
[AWS LED Button] ESP32 (2) : MQTT 프로토콜과 정책, JSON 포맷 MQTT 프로토콜 클라이언트와 사물이 통신을 할 땐 항상 AWS IoT를 매개로 MQTT 프로토콜을 사용하여 통신합니다. 이것은 섀도우 접근도 마찬가지 입니다. 통신 주체는 클라이언트와 브로커가 있습니다. 모든 클라이언트는 브로커에 연결되고, 클라이언트끼리는 직접적인 연결이 없습니다. 그리고 모든 데이터는 브로커에 모인 후 필터링되어 다시 적절한 클라이언트들에게 뿌려집니다. 심지어 자기가 보낸 패킷도 조건만 충족되면 다시 돌아옵니다. 모든 데이터는 토픽 단위로 움직입니다. 클라이언트는 데이터를 전송하기 위해 토픽과 이 토픽에 대한 데이터를 브로커에게 발행(Publish)하고, 데이터를 수신하기 위해 브로커로 부터 수신할 토픽을 구독(Subscribe)합니다. 모든 클라이언트는 발행, 구독을 할 수 있습니..
[AWS LED Button] ESP32 (1) : 시스템 흐름 시스템 흐름 ESP32는 AWS IoT에서 생성된 인증서와 개인키를 생성/다운로드한 후 바이너리 파일을 내부 플래시(non-volatile memory)에 저장합니다. AWS IoT에서 인증서를 생성하는 방법은 여기에나와 있습니다. 인증서를 생성하고 나면 -certificate.pem.crt(인증서), -private.pem.key(개인키), -public.pem.key(공용키)를 받을 수 있습니다. 하지만 공용키는 필요 없으니 무시하고, 인증서와 개인키만 다운받아서 파일 이름의 "-" 지운 다음 certs 폴더에 넣으면 컴파일할 때 자동으로 이미지에 삽입됩니다. 사실 개인키와 공용키의 확장자 .crt와 .key는 단순 문자열입니다. 따라서 텍스트 에디터로도 오류없이 내용을 확인할 수 있습니다. 그리고 ..