mardi 9 mai 2017

Fichier de configuration json

Un article pour illustrer l'utilisation de la librairie ArduinoJson de Benoît Blanchon : https://github.com/bblanchon/ArduinoJson

Le but de cet example est de récupérer une configuration placer dans un fichier json dans le file system d'un Esp 8266 (NodeMCU). Puis de modifer les valeurs et de les sauvarder.


json : 

{"wifi_ssid":"","wifi_pwd":"","admin_pwd":"","mqtt_host":"","mqtt_port":"","mqtt_login":"","mqtt_pwd":"","mqtt_topic_push":"","mqtt_topic_listen":""}
A mettre dans data/config.json dans le même dossier du sketch, puis le transférer avec la procédure d'écrite ici


Sketch : 

/**
* Librairies : 
* ArduinoJson : https://github.com/bblanchon/ArduinoJson
* uploadfile to SPIFFS https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md
*/

#include <FS.h>
#include <ArduinoJson.h>

#define CONFIGURATION_JSON_SIZE (JSON_OBJECT_SIZE(18))


//Config Page
String CONFIG_FILE = "/config.json";

struct Configuration {
  String wifi_ssid;
  String wifi_pwd;
  String admin_pwd;
  String mqtt_host;
  String mqtt_port;
  String mqtt_login;
  String mqtt_pwd;
  String mqtt_topic_push;
  String mqtt_topic_listen;
};

Configuration configuration;

/**
 *  initialisele fichier de configuration  
 */
void initConfValues() {

  configuration.wifi_ssid = "1";
  configuration.wifi_pwd = "2";
  configuration.admin_pwd = "3";
  configuration.mqtt_host = "4";
  configuration.mqtt_port = "5";
  configuration.mqtt_login = "6";
  configuration.mqtt_pwd = "7";
  configuration.mqtt_topic_push = "8";
  configuration.mqtt_topic_listen = "9";
}
/**
* Charge le fichier de configuration.
*/
bool loadConfig() {

  File configFile = SPIFFS.open(CONFIG_FILE, "r");
  if (!configFile) {
    Serial.println("Failed to open config file");
    return false;
  }

  size_t size = configFile.size();
  if (size > 1024) {
    Serial.println("Config file size is too large");
    return false;
  }

  // Allocate a buffer to store contents of the file.
  std::unique_ptr buf(new char[size]);

  // We don't use String here because ArduinoJson library requires the input
  // buffer to be mutable. If you don't use ArduinoJson, you may as well
  // use configFile.readString instead.
  configFile.readBytes(buf.get(), size);
  StaticJsonBuffer jsonBuffer;                 

  JsonObject& json = jsonBuffer.parseObject(buf.get());

  if (!json.success()) {
    Serial.println("Failed to parse config file");
    return false;
  }

  Serial.println("Loaded conf : ");
  json.prettyPrintTo(Serial); 
  Serial.println("");

  configuration.wifi_ssid = json["wifi_ssid"].as();
  configuration.wifi_pwd = json["wifi_pwd"].as();
  configuration.admin_pwd = json["admin_pwd"].as();
  configuration.mqtt_host = json["mqtt_host"].as();
  configuration.mqtt_port = json["mqtt_port"].as();
  configuration.mqtt_login = json["mqtt_login"].as();
  configuration.mqtt_pwd = json["mqtt_pwd"].as();
  configuration.mqtt_topic_push = json["mqtt_topic_push"].as();
  configuration.mqtt_topic_listen = json["mqtt_topic_listen"].as();



  return true;

}

/**
* Sauvegarde le fichier de configuration.
*/
bool saveConfig() {
  File configFile = SPIFFS.open(CONFIG_FILE, "w");
  if (!configFile) {
    Serial.println("Failed to open config file for writing");
    return false;
  }
  
  StaticJsonBuffer jsonBuffer;
  JsonObject& json = jsonBuffer.createObject();
  json["wifi_ssid"] = configuration.wifi_ssid;
  json["wifi_pwd"] = configuration.wifi_pwd;
  json["admin_pwd"] = configuration.admin_pwd;
  json["mqtt_host"] = configuration.mqtt_host;
  json["mqtt_port"] = configuration.mqtt_port;
  json["mqtt_login"] = configuration.mqtt_login;
  json["mqtt_pwd"] = configuration.mqtt_pwd;
  json["mqtt_topic_push"] = configuration.mqtt_topic_push;
  json["mqtt_topic_listen"] = configuration.mqtt_topic_listen;
  Serial.println("sauvegarde de la configuration : ");
  json.prettyPrintTo(Serial);
  Serial.println("");
  json.printTo(configFile);
  configFile.close();
  return true;
}

void setup() {
  delay(1000);
  
  Serial.begin(115200);
  Serial.println("...");
 
  
  Serial.println("Mounting FS...");

  if (!SPIFFS.begin()) {
    Serial.println("Failed to mount file system");
    return;
  }
   
  loadConfig();
  
  initConfValues();

  saveConfig();
  
  loadConfig();

 
}

void loop() {
  
 
}



Test :

Aller dans la console de L'IDE pour vérifier les étapes. Pensez à déposer un fichier json sur le 8266, à chaque test, pour vérifier que celui-ci est bien modifier.