Помогите, пожалуйста, с ArduinoJSON

Amarok

✩✩✩✩✩✩✩
2 Окт 2019
25
0
Предполагаю, что я дурак, но у меня не получается разобраться с библиотекой ArduinoJSON. Хочу в файл сохранять настройки устройства. Структура конфига должна быть примерно такая:
C++:
name: char, number: byte, state: byte
Не могу понять как это реализовать. По примерам из инета получилось сделать конфиг который работает только с char. И если String в char конвертировать я научился, то... "На этом наши полномочия всё".
Вот части моего быдло-кода:
  • C++:
    String espName = "esp4test2019";    //Имя самой esp8266. Используется для формирования записей MQTT
    byte numRelays = 4; //Количество реле
    byte relayDefaultState = 0;
    char mqtt_server[40];
    char mqtt_port[6] = "1883";
    char dev_name[32];
    char uptime[14];
    char num_relays[1];
    bool shouldSaveConfig = false;
  • C++:
    void JSONconfigSave() {
      DynamicJsonBuffer jsonBuffer;
      JsonObject& json = jsonBuffer.createObject();
      json["esp_name"] = dev_name;
      json["num_relays"] = numRelays;
      json["relay_default_state"] = relayDefaultState;
      json["mqtt_server"] = mqtt_server;
      json["mqtt_port"] = mqtt_port;
      File configFile = SPIFFS.open("/config.json", "w");
      json.printTo(Serial);
      json.printTo(configFile);
      configFile.close();
    }
  • C++:
    void JSONconfigLoad() {
          Serial.println(F("reading config file"));
          File configFile = SPIFFS.open("/config.json", "r");
          if (configFile) {
            size_t size = configFile.size();
            std::unique_ptr<char[]> buf(new char[size]);
            configFile.readBytes(buf.get(), size);
            DynamicJsonBuffer jsonBuffer;
            JsonObject& json = jsonBuffer.parseObject(buf.get());
            json.printTo(Serial);
            if (json.success()) {
              Serial.println(F("\nparsed json"));
              strcpy(dev_name, json["esp_name"]); espName = dev_name;
              strcpy(num_relays, json["num_relays"]);  numRelays = (byte) num_relays;
              strcpy(relayDefaultState, json["relay_default_state"]);
              strcpy(mqtt_server, json["mqtt_server"]);
              strcpy(mqtt_port, json["mqtt_port"]);
            } else {
              Serial.println(F("Failed to load json config"));
            }
            configFile.close();
          }}
  • C++:
    HTTPserver.on("/saveParams", handleGenericArgs);
    HTTPserver.on("/config", [](){
    webPage4Config();
    HTTPserver.send(200, "text/html", webPageConfig);
      });
    
    
    [*]void webPage4Config() {
      webPageConfig  = webPageHEADER;
      webPageConfig += "<title>" + espName + "</title></head><body bgcolor=\"#cecece\"><center>";
      webPageConfig += "<table style=\"border: 0px; vertical-align:\"><tr><td><span class=\"header\">" + espName + "</span></td><td>";
      webPageConfig += "<table style=\"border: 0px; padding: 0px; border-spacing: 0px; border-collapse: separate; text-align: right; vertical-align: text-top; font-size: 85%;\">";
      webPageConfig += "<tr><td>RSSI:&nbsp;</td><td>" + String(WiFi.RSSI()) + " dBm</td></tr><tr><td>VCC:&nbsp;</td><td>" + String(ESP.getVcc() * 0.001) + " V</td></tr><tr><td></td><td></td></tr></table></td></tr><tr><td colspan=\"2\" align=\"right\">Uptime:&nbsp;" + String(uptime) + "</td></tr></table><br>";
      webPageConfig += "<table style=\"border: 0px;\"><tr><td>";
      webPageConfig += "<form method=\"POST\" action=\"/saveParams\">";
      webPageConfig += "<fieldset><legend>Настройки общие</legend>";
      webPageConfig += "Имя устройства:<br><input type=\"text\" name=\"dev_name\" maxlength=\"32\" size=\"40\" placeholder=\"" + espName + "\"><br>";
      webPageConfig += "Количество розеток:<br>";
      webPageConfig += "<table style=\"border: 0px; width: 100%;\"><tr>";
      webPageConfig += "<td style=\"text-align: center;\"><input type=\"radio\" name=\"numRelays\" value=\"1\">1</td>";
      webPageConfig += "<td style=\"text-align: center;\"><input type=\"radio\" name=\"numRelays\" value=\"2\">2</td>";
      webPageConfig += "<td style=\"text-align: center;\"><input type=\"radio\" name=\"numRelays\" value=\"3\">3</td>";
      webPageConfig += "<td style=\"text-align: center;\"><input type=\"radio\" name=\"numRelays\" value=\"4\" checked>4</td>";
      webPageConfig += "</tr></table>";
      webPageConfig += "</fieldset><br>";
      webPageConfig += "<fieldset><legend>Настройки MQTT</legend>";
      webPageConfig += "Адрес сервера:<br><input type=\"ip\" name=\"mqtt_server\" maxlength=\"16\" size=\"40\" placeholder=\"IP адрес в формате 255.255.255.255\" pattern=\"";
      webPageConfig += "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";
      webPageConfig += "\"><br>";
      webPageConfig += "Порт сервера:<br><input type=\"text\" name=\"mqtt_port\" maxlength=\"5\" size=\"40\" min=\"1\" max=\"65534\" step=\"1\" placeholder=\"" + String(mqtt_port) + "\" pattern=\"[0-9]{,5}\">";
      webPageConfig += "</fieldset><br>";
      webPageConfig += "<center><input type=\"submit\" name=\"action\" value=\"Запомнить настройки\"></center></form>";
      webPageConfig += "</td></tr></table>";
      webPageConfig += "</center></body></html>";
    }
    
    void handleGenericArgs() {
      String message;
      for (int i = 0; i < HTTPserver.args()-1; i++) {
        message += HTTPserver.argName(i) + ": ";     //Get the name of the parameter
        message += HTTPserver.arg(i) + "\n";              //Get the value of the parameter
        if (HTTPserver.arg(i) != "") {
          if (HTTPserver.argName(i) == "dev_name") {espName = HTTPserver.arg(i); espName.toCharArray(dev_name, 32);}
          if (HTTPserver.argName(i) == "numRelays") { /* numRelays = (byte) HTTPserver.arg(i); */}
          if (HTTPserver.argName(i) == "mqtt_server") { }
          if (HTTPserver.argName(i) == "mqtt_port") { }
        }
      }
      HTTPserver.send(200, "text/plain", message);       //Response to the HTTP request
      JSONconfigSave();      
    }
Есть идеи как выйти из положения?
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
  • Лойс +1
Реакции: Amarok