ESP8266 - SPIFSS/json
moin,
ich möchte eine eigene klasse zum handeln meiner jsonfiles im ffs meines esp schreiben.
der file soll beim start oder auf anforderung nur einmal gelesen werden.
um unnötige zugriffe auf das ffs zu vermeiden, soll der zugriff dann nur noch über das jsonobject erfolgen.
die klasse soll im grunde nur einzelne elemente aus dem file lesen und auch wieder zurück schreiben können ohne, dass ich mich um das handling des ffs weiter kümmern muss.
die jsonfiles sollen nur eine ebene enthalten, eine tiefere struktur muss nicht behandelt werden.
das lesen der einzelnen elemente läuft problemlos.
probleme habe ich beim zurückschreiben des jsonobjektes in das ffs.
hat jemand eine idee wo ich den fehler mache?
gruß
pf@nne
config.json
fss.h
fss.cpp
ich möchte eine eigene klasse zum handeln meiner jsonfiles im ffs meines esp schreiben.
der file soll beim start oder auf anforderung nur einmal gelesen werden.
um unnötige zugriffe auf das ffs zu vermeiden, soll der zugriff dann nur noch über das jsonobject erfolgen.
die klasse soll im grunde nur einzelne elemente aus dem file lesen und auch wieder zurück schreiben können ohne, dass ich mich um das handling des ffs weiter kümmern muss.
die jsonfiles sollen nur eine ebene enthalten, eine tiefere struktur muss nicht behandelt werden.
das lesen der einzelnen elemente läuft problemlos.
probleme habe ich beim zurückschreiben des jsonobjektes in das ffs.
quote
cfg.writeitem("wifissid", "helloworld!");nach einem reset ist der file im fss leer.
hat jemand eine idee wo ich den fehler mache?
gruß
pf@nne
config.json
code: [select]
{
"webuser": "espuser",
"webpassword": "esppass",
"apname": "esp8266_1032096",
"appassword": "esp8266config",
"wifissid": "pf@nne-net",
"wifipsk": "xxxxx",
"wifiip": "",
"mqttserver": "192.168.1.203",
"mqttport": "1883",
"mqttdevicename": "esp8266_1032096",
"updateserver": "192.168.1.3",
"filepath": "/bin/esp8266_aktsen.ino.bin"
}
fss.h
code: [select]
#pragma once
//filesystem
#include <fs.h> //this needs first, or crashes , burns...
#include <arduinojson.h>
#include <arduino.h>
#include "setup.h"
#include "i2c.h"
//===============================================================================
// jsonfile
//===============================================================================
class ffsjsonfile{
public:
ffsjsonfile(string filepath, int type);
string filepath;
size_t size; //filled in readjsonstring()
int type; //0=object; 1=array
string root;
string readitem(string itemname);
string readitem(int item);
void writeitem(string itemname, string value);
private:
string readjsonstring();
dynamicjsonbuffer jsonbuffer;
jsonobject& jsonrootobject;
jsonarray& jsonrootarray;
void parsejsonobject(jsonobject& jsonobject);
void parsejsonarray(jsonarray& jsonarray);
};
//===============================================================================
// ffs
//===============================================================================
class ffs{
public:
ffs(i2c& i2c);
i2c& i2c;
ffsjsonfile cfg;
ffsjsonfile testarray;
void test();
private:
};
fss.cpp
code: [select]
#include "ffs.h"
//===============================================================================
// ffs
//===============================================================================
ffs::ffs(i2c& i2c):
i2c(i2c),
cfg(cfg_path, type_object),
testarray(testarray_path, type_array){
}
//===> test <------------------------------------------------------
void ffs::test(){
//spiffs.begin();
//for (int i=0; i<100; i++){
//serial.println(i);
serial.println(cfg.readitem("apname"));
serial.println(cfg.readitem("wifissid"));
serial.println(cfg.readitem("wifipsk"));
serial.println(cfg.readitem("mqttserver"));
//}
i2c.lcd.println(cfg.readitem("apname"), 0);
i2c.lcd.println(cfg.readitem("wifissid"), 1);
i2c.lcd.println(cfg.readitem("wifipsk"), 2);
//i2c.lcd.println(cfg.readitem("mqttserver"), 3);
cfg.writeitem("wifissid", "helloworld!");
i2c.lcd.println(cfg.readitem("wifissid"), 3);
//serial.println(cfg.readitem("wifissid"));
}
//===============================================================================
// ffsjsonfile public
//===============================================================================
ffsjsonfile::ffsjsonfile(string filepath, int type) :
filepath (filepath),
type (type),
root (readjsonstring()),
jsonrootobject (jsonbuffer.parseobject(root)),
jsonrootarray (jsonbuffer.parsearray(root)){
}
//===> readitem jsonstring <-------------------------------------
string ffsjsonfile::readitem(string itemname){
return jsonrootobject[itemname].asstring();
}
string ffsjsonfile::readitem(int item){
return jsonrootarray[item].asstring();
}
//===> writeitem jsonstring <---------------------------------------
void ffsjsonfile::writeitem(string itemname, string value){
jsonrootobject[itemname] = value;
//spiffs.begin();
file jsonfile = spiffs.open(filepath, "w");
if (!jsonfile) {
serial.println("failed open file writing");
//serial.print("format file system.. ");
//spiffs.format();
}
jsonrootobject.printto(serial);
jsonrootobject.printto(jsonfile);
jsonfile.close();
}
// ffsjsonfile private
//===============================================================================
//===> read json string file <------------------------------------
string ffsjsonfile::readjsonstring(){
file jsonfile;
string jsondata = "nil";
if (spiffs.begin()) {
serial.println("mounted file system...ok");
if (spiffs.exists(filepath)) {
jsonfile = spiffs.open(filepath, "r");
if (jsonfile) {
size = jsonfile.size();
std::unique_ptr<char[]> buf(new char[size]);
jsonfile.readbytes(buf.get(), size);
if (type == type_array){
//array
dynamicjsonbuffer _jsonbufferarray;
jsonarray& jsonarray = _jsonbufferarray.parsearray(buf.get());
if (jsonarray.success()) {
char buffer[size];
jsonarray.printto(buffer, sizeof(buffer));
jsondata = string(buffer);
}
}else{
//object
dynamicjsonbuffer _jsonbuffer;
jsonobject& json = _jsonbuffer.parseobject(buf.get());
if (json.success()) {
char buffer[size];
json.printto(buffer, sizeof(buffer));
jsondata = string(buffer);
}
}
}
}
}
jsonfile.close();
return jsondata;
}
//#########################################################################################
void ffsjsonfile::parsejsonobject(jsonobject& jsonobject){
//serial.println("parsejsonobject");
(auto &element : jsonobject){
string strkey = element.key;
string strvalue = element.value;
serial.print(strkey);serial.print(" ");serial.println(strvalue);
}
}
void ffsjsonfile::parsejsonarray(jsonarray& jsonarray){
(auto &element : jsonarray){
if (element.is<jsonarray&>()){
serial.println("-->>");//serial.println(i);
jsonarray& nestedarray = element;
parsejsonarray(nestedarray);
}else{
serial.println(element.asstring()); //serial.print(" | ");serial.println(i);
}
}
}
Arduino Forum > International > Deutsch (Moderator: uwefed) > ESP8266 - SPIFSS/json
arduino
Comments
Post a Comment