본문 바로가기

AWS IoT/펌웨어

[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 char * op_key);
char * get_opkey();

 

2. serialize_payload 함수

AWS IoT에 대한 한번만 사용되는 동작(초기화), 독립적인 동작을 하나로 묶어서 aws_iot_helper 모듈을 만들었습니다. 이 모듈중 serialize_payload 함수에 대해서만 알아보겠습니다.

이전 포스트에서 JSON 포맷의 문자열을 분석하기 위해 cJSON을 사용한다고 했습니다. 하지만 cJSON_Parse 함수는 문자열에 탭('\t') 또는 개행문자('\n', '\r')가 있으면 사람이 보기엔 완벽한 JSON 문서라도 분석하지 못하고 NULL을 반환합니다. ESP32(Thing)가 구독(Subscribe) 중인 토픽을 AWS IoT가 해당 클라이언트(ESP32, Thing)에 발행(Publish)했을 때  호출되는 iot_subscribe_callback_handler 함수가 반환하는 JSON 포맷 문자열은 아래 그림과 같습니다.

탭과 개행문자가 포함되어 있습니다. 이것들을 지우는 함수입니다. 그리고 수정된 문자열을 위해 공간을 새로 만들지 않고 입력된 문자열 공간을 그대로 사용합니다.

/** @brief Remove ' ', '\t', '\n', '\r' in the payload string.
 *
 * @param payload Target string
 * @param len Length of payload except of '\0';
 *
 * @return Length of new string except of '\0'
 * */
size_t serialize_payload(char * payload, size_t len) {
	esp_err_t err = ESP_FAIL;
	size_t original_index = 0;
	size_t new_index = 0;

	for(; original_index < len; original_index++) {
		if(payload[original_index] != ' '
				&& payload[original_index] != '\t'
						&& payload[original_index] != '\n'
								&& payload[original_index] != '\r') {
			payload[new_index] = payload[original_index];
			new_index++;
		}
	}
	payload[new_index] = '\0';
	return new_index;
}

위 함수를 실행하면 아래와 같이 변환됩니다.

 

 

Copyright (c) 2018, JoonDong

All rights reserved.

Copyright holder's blog : http://joondong.tistory.com

 

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

소스와 바이너리 형태로 재배포와 사용은 다음 조건들을 만족한 경우에만 허용됩니다.

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    소스 코드의 재배포는 위의 저작권 표시, 조건 목록, 다음의 면책 조항을 포함시켜야합니다.

  2. Copyright holder's blog address must be located under the copyright notice.
    저작권자의 블로그 주소가 반드시 저작권 표시 아래 위치해야 합니다.

  3. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    바이너리 형태로 재배포는 반드시 위의 저작권 표시, 조건 목록, 다음의 면책 조항을 배포시 제공된 설명서 및 / 또는 기타 자료에 포함시켜야합니다.

  4. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
    사전 서면 허가없이이 소프트웨어에서 파생 된 제품을 보증하거나 홍보하기 위해 저작권 소유자의 이름이나 기여자의 이름을 사용할 수 없습니다.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

이 소프트웨어는 저작권 소유자 및 기여자가 "있는 그대로"제공되며, 상품성 및 특정 목적에의 적합성에 대한 묵시적인 보증을 포함하여 (단, 이에 한하지 않음) 명시 적 또는 묵시적 보증이 배제됩니다. 저작권 소유자 또는 기여자는 어떠한 경우에도 직접, 간접, 우발적, 우발적, 특수 또는 우발적 인 손해 (대체 상품 또는 서비스의 조달, 사용, 데이터 또는 이익의 손실 또는 비즈니스 중단을 포함하되 이에 국한되지 않음)에 대해 책임을지지 않습니다. 계약 위반, 엄격한 책임 또는 불법 행위 (태만 또는 기타 포함)에 관계없이 책임을지지 않습니다. 단, 이러한 경우에는 그러한 손해의 가능성을 사전에 알고 있던 경우에도 마찬가지입니다.