Hello. I wrote this code, and I get a kernel error. This is most likely due to a buffer overflow, but I don't know how to fix it. Help me please.
#include <WiFi.h>
#include <PubSubClient.h>
#include <ezButton.h>
#include "FS.h"
#include <SPIFFS.h>
#include <ArduinoJson.h>
#include <GyverPortal.h>
////////////////////////////////////////////////
//WiFi_MQTT
struct config_wifi_struct {
char* ssid;
char* pass;
bool DHCP;
char* ip;
char* gt;
char* mac;
char* dns;
};
struct config_mqtt_struct {
char* mqtt_server;
int mqtt_port;
char* mqtt_username;
char* mqtt_password;
};
config_wifi_struct str_wifi;
config_mqtt_struct str_mqtt;
WiFiClient wifiClient;
PubSubClient MQTTclient(wifiClient);
SemaphoreHandle_t sema_MQTT_KeepAlive;
/// button_relay
const int BUTTON_PIN_1 = 27;
const int BUTTON_PIN_2 = 26;
const int LED_PIN_1 = 4;
const int LED_PIN_2 = 2;
ezButton button_1(BUTTON_PIN_1);
ezButton button_2(BUTTON_PIN_2);
int ledState_1 = LOW;
int ledState_2 = LOW;
/// json
#define FORMAT_SPIFFS_IF_FAILED true
////////////////////////////////////////////
void setup()
{
Serial.begin(115200);
Serial.println("Start");
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
button_1.setDebounceTime(50);
button_2.setDebounceTime(50);
if(!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)){
Serial.println("SPIFFS Mount Failed");
return;
}
Serial.println(read_config_wifi_mqtt(readFile(SPIFFS, "/config_wifi_mqtt.json")));
if(button_1.isPressed()) {
loginPortal();
}
sema_MQTT_KeepAlive = xSemaphoreCreateBinary();
xSemaphoreGive(sema_MQTT_KeepAlive);
xTaskCreatePinnedToCore(MQTTkeepalive, "MQTTkeepalive", 20000, NULL, 3, NULL, 1);
}
void loop() {
button_1.loop();
button_2.loop();
if(button_1.isPressed()) {
ledState_1 = !ledState_1;
digitalWrite(LED_PIN_1, ledState_1);
char val[5];
itoa(ledState_1, val, 10);
MQTTclient.publish("esp32/led1_st", val);
}
if(button_2.isPressed()) {
ledState_2 = !ledState_2;
digitalWrite(LED_PIN_2, ledState_2);
char val[5];
itoa(ledState_2, val, 10);
MQTTclient.publish("esp32/led2_st", val);
}
}
///////////_____MQTT_WIFI_SETTINGS
void MQTTkeepalive( void *pvParameters )
{
MQTTclient.setKeepAlive( 90 );
for (;;)
{
if ((wifiClient.connected()) && (WiFi.status() == WL_CONNECTED))
{
xSemaphoreTake(sema_MQTT_KeepAlive, portMAX_DELAY);
MQTTclient.loop();
xSemaphoreGive( sema_MQTT_KeepAlive );
}
else {
Serial.print("MQTT keep alive found MQTT status: ");
Serial.println(String(wifiClient.connected()));
Serial.print("WiFi status: ");
Serial.println(String(WiFi.status()));
if (!(WiFi.status() == WL_CONNECTED))
{
connectToWiFi();
}
connectToMQTT();
}
vTaskDelay( 250 );
}
vTaskDelete ( NULL );
}
void connectToMQTT()
{
String client_id = "esp32-client-";
client_id += String(WiFi.macAddress());
Serial.print("Connect to MQTT as client: ");
Serial.println(client_id);
MQTTclient.setServer(str_mqtt.mqtt_server, str_mqtt.mqtt_port);
MQTTclient.setCallback(callback);
while (!MQTTclient.connected())
{
MQTTclient.connect(client_id.c_str(), str_mqtt.mqtt_username, str_mqtt.mqtt_password);
Serial.println("Connecting to MQTT");
vTaskDelay(250);
}
Serial.println("MQTT Connected");
}
void connectToWiFi()
{
Serial.println("Connect to WiFi");
while ( WiFi.status() != WL_CONNECTED )
{
WiFi.disconnect();
WiFi.begin( str_wifi.ssid, str_wifi.pass );
("waiting on wifi connection");
vTaskDelay( 4000 );
}
Serial.println("Connected to WiFi");
Serial.print("mac address: ");
Serial.println(WiFi.macAddress());
WiFi.onEvent(WiFiEvent);
}
void WiFiEvent(WiFiEvent_t event)
{
switch (event) {
case SYSTEM_EVENT_STA_CONNECTED:
Serial.println("Connected to access point");
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("Disconnected from WiFi access point");
break;
case SYSTEM_EVENT_AP_STADISCONNECTED:
Serial.println("WiFi client disconnected");
break;
default: break;
}
}
void callback(char* topic, byte* message, unsigned int length) {
String messageTemp;
for (int i = 0; i < length; i++) {
messageTemp += (char)message[i];
}
Serial.println(messageTemp);
}
///////////_____WEB_Portal
void build_login() {
BUILD_BEGIN();
GP.THEME(GP_DARK);
GP.FORM_BEGIN("/login");
GP.TEXT("lg", "Login", str_wifi.ssid);
GP.BREAK();
GP.TEXT("ps", "Password", str_wifi.pass);
GP.BREAK();
GP.LABEL("DHCP: ");
GP.BREAK();
GP.CHECK("DHCP", str_wifi.DHCP);
GP.BREAK();
GP.TEXT("ip", "ip", str_wifi.ip);
GP.BREAK();
GP.TEXT("gt", "gt", str_wifi.gt);
GP.BREAK();
GP.TEXT("mac", "mac", str_wifi.mac);
GP.BREAK();
GP.TEXT("dns", "dns", str_wifi.dns);
GP.BREAK();
GP.TEXT("mqtt_server", "mqtt_server", str_mqtt.mqtt_server);
GP.BREAK();
GP.NUMBER("mqtt_port", "mqtt_port", str_mqtt.mqtt_port);
GP.BREAK();
GP.TEXT("mqtt_username", "mqtt_username", str_mqtt.mqtt_username);
GP.BREAK();
GP.TEXT("mqtt_password", "mqtt_password", str_mqtt.mqtt_password);
GP.BREAK();
GP.SUBMIT("Submit");
GP.FORM_END();
BUILD_END();
}
void action_login(GyverPortal& p) {
if (p.form("/login")) {
p.copyStr("lg", str_wifi.ssid);
p.copyStr("ps", str_wifi.pass);
str_wifi.DHCP = p.getCheck("DHCP");
p.copyStr("ip", str_wifi.ip);
p.copyStr("gt", str_wifi.gt);
p.copyStr("mac", str_wifi.mac);
p.copyStr("dns", str_wifi.dns);
p.copyStr("mqtt_server", str_mqtt.mqtt_server);
str_mqtt.mqtt_port = p.getInt("mqtt_port");
p.copyStr("mqtt_username", str_mqtt.mqtt_username);
p.copyStr("mqtt_password", str_mqtt.mqtt_password);
WiFi.softAPdisconnect();
load_config_wifi_mqtt();
}
}
void loginPortal() {
Serial.println("Portal start");
// запускаем точку доступа
WiFi.mode(WIFI_AP);
WiFi.softAP("WiFi Config");
// запускаем портал
Serial.println("Запуск портала");
GyverPortal portal;
portal.attachBuild(build_login);
Serial.println("Запуск build_login");
portal.start(WIFI_AP);
Serial.println("Запуск WIFI_AP");
portal.attach(action_login);
Serial.println("Запуск action_login");
// работа портала
while (portal.tick());
}
///////////_____SPIFFS
void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
Serial.printf("Listing directory: %s\r\n", dirname);
File root = fs.open(dirname);
if(!root){
Serial.println("- failed to open directory");
return;
}
if(!root.isDirectory()){
Serial.println(" - not a directory");
return;
}
File file = root.openNextFile();
while(file){
if(file.isDirectory()){
Serial.print(" DIR : ");
Serial.println(file.name());
if(levels){
listDir(fs, file.name(), levels -1);
}
} else {
Serial.print(" FILE: ");
Serial.print(file.name());
Serial.print("\tSIZE: ");
Serial.println(file.size());
}
file = root.openNextFile();
}
}
String readFile(fs::FS &fs, const char * path){
Serial.printf("Reading file: %s\r\n", path);
String return_err = "error";
File file = fs.open(path);
if(!file || file.isDirectory()){
Serial.println("- failed to open file for reading");
return return_err;
}
String msg_string;
while(file.available()){
msg_string += char(file.read());
}
file.close();
return msg_string;
}
void writeFile(fs::FS &fs, const char * path, String message){
Serial.printf("Writing file: %s\r\n", path);
File file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("- failed to open file for writing");
return;
}
if(file.print(message)){
Serial.println("- file written");
} else {
Serial.println("- write failed");
}
file.close();
}
void appendFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Appending to file: %s\r\n", path);
File file = fs.open(path, FILE_APPEND);
if(!file){
Serial.println("- failed to open file for appending");
return;
}
if(file.print(message)){
Serial.println("- message appended");
} else {
Serial.println("- append failed");
}
file.close();
}
///////////_____JSON_load_read
bool read_config_wifi_mqtt(String msg_json_wifi_mqtt_config){
StaticJsonDocument<300> doc;
DeserializationError error = deserializeJson(doc, msg_json_wifi_mqtt_config);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return false;
}
strcpy(str_wifi.ssid, doc["ssid"]);
strcpy(str_wifi.pass, doc["pass"]);
//str_wifi.DHCP = doc["DHCP"];
strcpy(str_wifi.gt, doc["gt"]);
strcpy(str_wifi.mac, doc["mac"]);
strcpy(str_wifi.dns, doc["dns"]);
strcpy(str_wifi.ip, doc["ip"]);
strcpy(str_mqtt.mqtt_server, doc["mqtt_server"]);
//str_mqtt.mqtt_port = doc["mqtt_port"];
strcpy(str_mqtt.mqtt_username, doc["mqtt_username"]);
strcpy(str_mqtt.mqtt_password, doc["mqtt_password"]);
Serial.println(str_wifi.ssid);
Serial.println(str_wifi.pass);
Serial.println(str_wifi.DHCP);
Serial.println(str_wifi.ip);
Serial.println(str_wifi.gt);
Serial.println(str_wifi.mac);
Serial.println(str_wifi.dns);
Serial.println(str_mqtt.mqtt_server);
Serial.println(str_mqtt.mqtt_port);
Serial.println(str_mqtt.mqtt_username);
Serial.println(str_mqtt.mqtt_password);
return true;
}
bool load_config_wifi_mqtt(){
StaticJsonDocument<300> doc;
doc["ssid"] = str_wifi.ssid;
doc["pass"] = str_wifi.pass;
doc["DHCP"] = str_wifi.DHCP;
doc["ip"] = str_wifi.ip;
doc["gt"] = str_wifi.gt;
doc["mac"] = str_wifi.mac;
doc["dns"] = str_wifi.dns;
doc["mqtt_server"] = str_mqtt.mqtt_server;
doc["mqtt_port"] = str_mqtt.mqtt_port;
doc["mqtt_username"] = str_mqtt.mqtt_username;
doc["mqtt_password"] = str_mqtt.mqtt_password;
String msg_return;
serializeJson(doc, msg_return);
Serial.print(msg_return);
writeFile(SPIFFS, "/config_wifi_mqtt.json", msg_return);
return true;
}