ESP8266에서 잠시 실행하면 JsonData 크기가 0이 됩니다. (JsonData size becomes zero after awhile of running in ESP8266)


문제 설명

ESP8266에서 잠시 실행하면 JsonData 크기가 0이 됩니다. (JsonData size becomes zero after awhile of running in ESP8266)

데이터를 읽어 Json Object로 파싱하고 MQTT를 통해 rpi로 객체를 전송하는 nodemcu 1.0(ESP‑12E Module) 관련 프로젝트를 구축 중입니다. 내 문제는 실행 1~2분 후에 Json 개체가 손상되고 jsonData.size()가 json의 예상 크기에서 0으로 출력된다는 것입니다.

제 코드는 다음과 같습니다.

#include <ArduinoJson.h>
#include "Adafruit_MQTT.h" 
#include "Adafruit_MQTT_Client.h" 
#include <Wire.h>
#include <MCP3008.h>

//define pin connections
#define CS_PIN D8
#define CLOCK_PIN D5
#define MOSI_PIN D7
#define MISO_PIN D6

// WiFi
// Make sure to update this for your own WiFi network!
const char* ssid = "NameOfNetwork";
const char* wifi_password = "walakokabalohaha";

// MQTT
// Make sure to update this for your own MQTT Broker!
const char* mqtt_server = "192.168.4.1";
const char* mqtt_topic = "test";
const char* mqtt_username = "username";
const char* mqtt_password = "Kakkakka123";
// The client id identifies the ESP8266 device. Think of it a bit like a hostname (Or just a name, like Greg).
const char* clientID = "Client ID";

MCP3008 adc(CLOCK_PIN, MOSI_PIN, MISO_PIN, CS_PIN);

// Initialise the WiFi and MQTT Client objects
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, mqtt_server, 1883, mqtt_username, mqtt_password);
Adafruit_MQTT_Publish sensorPub = Adafruit_MQTT_Publish(&mqtt, "test");
//Adafruit_MQTT_Subscribe sensorSub = Adafruit_MQTT_Subscribe(&mqtt, "sensor");
DynamicJsonBuffer jsonBuffer;

void setup(void)
{
Serial.begin(115200);
WiFi.mode(WIFI_STA);
setupWifi();
// Connect to MQTT Broker
MQTT_connect();
delay(500);
}

void loop(void)
{
  transmitJsonData(getSensorData());

delay(300);
}
void setupWifi(){
  Serial.print("Connecting to ");
  Serial.println(ssid);

  // Connect to the WiFi
  WiFi.begin(ssid, wifi_password);

  // Wait until the connection has been confirmed before continuing
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  // Debugging ‑ Output the IP Address of the ESP8266
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

}

void MQTT_connect(){
  uint8_t retries = 3; 
  int8_t ret; 
  while((ret = mqtt.connect()) !=0 ) {
    Serial.println("Connection to MQTT Broker failed...");
    mqtt.disconnect();
    delay(5000);
    retries‑‑;
    if(retries == 0){
      ESP.wdtDisable();
      while(1);
    }
  }
  Serial.println("Connected to MQTT Broker!");
}

JsonObject& getSensorData(){
    float index_data = adc.readADC(0);
    float ring_data = adc.readADC(1);
    float middle_data = adc.readADC(2);
    float point_data = adc.readADC(3);
    float thumb_data = adc.readADC(4);

//    StaticJsonBuffer<300> jsonBuffer;
    JsonObject& sensorData = jsonBuffer.createObject();
    sensorData["index_finger"] = String (index_data);
    sensorData["ring_finger"] = String (ring_data);
    sensorData["middle_finger"] = String (middle_data);
    sensorData["point_finger"] = String (point_data);
    sensorData["thumb_finger"] = String(thumb_data);

    Serial.println(sensorData["index_finger"].as<char*>());
    Serial.println(sensorData["ring_finger"].as<char*>());
    Serial.println(sensorData["middle_finger"].as<char*>());
    Serial.println(sensorData["point_finger"].as<char*>());
    Serial.println(sensorData["thumb_finger"].as<char*>());
    Serial.println(sensorData.size());

    return sensorData;
}

void transmitJsonData(JsonObject& data){
//    Serial.println("Transmitting data...");

    String sPayload = "";
    data.printTo(sPayload);
    char* cPayload = &sPayload[0u];

    if(!sensorPub.publish(cPayload))
        Serial.println("Transmit failed!");
    else
        Serial.println("Transmit successful.");
}

저는 nodemcu 빌드에 처음이고 문제의 원인을 모릅니다.


참조 솔루션

방법 1:

clearing jsonBuffer by calling jsonBuffer.clear() fixed the problem as what Mr. Maxim suggested.

(by Klien MenardKlien Menard)

참조 문서

  1. JsonData size becomes zero after awhile of running in ESP8266 (CC BY‑SA 2.5/3.0/4.0)

#C++ #esp8266 #Arduino #arduino-esp8266






관련 질문

파일의 암호화/복호화? (Encryption/ Decryption of a file?)

이상한 범위 확인 연산자가 있는 C++ typedef (C++ typedef with strange scope resolution operator)

개체 배열 매개변수--오류: '문자' 필드에 불완전한 유형이 있습니다. (Object array parameter--error: field ‘letters’ has incomplete type)

C++에서 메모리 삭제 (Deleting memory in c++)

C++ 프로그램을 실행할 수 없습니다. No se ejecuta el programa (C++ i can't run a program. No se ejecuta el programa)

컴파일 시 변수의 이름과 수명 (Name and lifetime of variables at compile time)

control-c 후 Visual Studio 콘솔 프로그램 충돌 (visual studio console program crashes after control-c)

멤버 변수에 std::enable_if 또는 유사한 메서드 사용 (Using std::enable_if or similar method on member variable)

ifstream input_file(filename); (I am receiving an error "no matching function to call" in the line ifstream input_file(filename);)

ESP8266에서 잠시 실행하면 JsonData 크기가 0이 됩니다. (JsonData size becomes zero after awhile of running in ESP8266)

합에 대한 속도 문제(제수의 합) (Speed problem for summation (sum of divisors))

벡터 벡터에서 하위 벡터의 첫 번째 값을 찾기 위해 begin() 및 end() 반복기의 범위를 지정하는 방법은 무엇입니까? (How to specify a range for begin() and end() iterators to find first value of sub vector in a vector of vectors?)







코멘트