#include <ArduinoJson.h>
DynamicJsonDocument doc(49152); //12288
doc["channel"] = 11;
doc["auth_code"] = "wvgnju";
JsonArray data = doc.createNestedArray("data");
for(int i=0; i<2048; i++){
esp_random();
// strTemp = String(random(0, 1023));
data.add(random(0, 1023));
}
serializeJson(doc, value);
Serial.println(value);
Serial.println("탄");
간단하게 위의 코드 돌리면 json에 {data : [배열 몇천개]} 이런식으로 나와야 하는데 data:null 로 계속 뜨는것이었다.
(아 물론 JsonArray data가 아니라 doc["data"] 이런식으로 object형식으로 만들었기에 value는 "숫자 숫자 ... "
해서 용량이 더 컸다. )
ArduinoJson 홈페이지에서 발견했는데, 메모리 할당을 적게 주면 Null이 나올 수 있단다. 나도 메모리 수치를 좀더 올리면서 테스트 해봤는데 안됬던게 그보다 더 훨씬 올렸어야 하는거임. 내가 데이터가 2048개를 담아야 하는데 실수로 dummy data만들때 for문에 2048번 돌려야 하는데 1024번 돌려서 할당값을 1/2나 적게 착각했던 것이다.
결국 doc()메모리 할당 수치 올림으로써 해결했다
메모리 사용 줄이는 법
1. deserializer 할때..즉 parsing한다면
char[] json ="할당" 은 괜찮은데
const cahr* json 이나 String json = "{.."
아래 자료형은 피하라. read-only라서 copy해야하므로 메모리 더 먹음
3.전역 변수를 피하라
전역 변수는 많은 레벨들에서 나쁘다. 왜냐? 전체 실행 과정에서 계속 살아있으니까!! 다시 말해 항상 RAM을 소비하게 한다.(피곤한 녀석들)
4.String 중복 방지
String클래스는 항상 생성자에 전달 된 문자열의 복사본을 만듭니다.
아래 String s는 생성자임.
String s = "hello" //이러면 한번 복사가 일어난다.
const char* s = "hello" //복사가 아니다. hello 메모리 값을 주는 것이다.