Converting types from ArduinoJSON to PubSubClient library parameters (MQTT)


i'm using esp8266 arduinojson , pubsubclient libraries. basically, i'm trying read json file , use values connect mqtt server. however, there typing issues can't figure out. in 2 lines i've marked below (66 , 145), char arrays aren't working parameters functions mqtt library. there no error, library doesn't connect server. placing actual values in places (not variables) causes work perfectly. variables arduinojson work fine connecting wifi, not mqtt.

garage.ino:
code: [select]
#include <esp8266wifi.h>
#include <wificlient.h>
#include "fs.h"
#include <arduinojson.h>
#include <pubsubclient.h>

#define config_filepath  "/config.json"

/* ************************************
 * don't touch past line!
 * ************************************
*/

const char* wifi_ssid;
const char* wifi_password;
const char* mqtt_host;
const char* mqtt_port;
const char* mqtt_clientname;
const char* mqtt_username;
const char* mqtt_password;
const char* mqtt_topic;
const char* mqtt_route_door1;
const char* mqtt_route_door2;
const char* mqtt_route_car1;
const char* mqtt_route_car2;
const char* mqtt_route_calibrate;

wificlient espclient;
pubsubclient client(espclient);

void setup() {
  pinmode(led_builtin, output);
 
  serial.begin (115200);
  serial.println();
  serial.println("[sys]  booting...");

  if (!spiffs.begin()) {
    serial.println("[sys]  failed mount file system");
    return;
  }
  if (!loadconfig()) {
    serial.println("[sys]  failed load config");
  } else {
    serial.println("[sys]  config loaded");
  }
//  if (!saveconfig()) {
//    serial.println("[sys]  failed save config");
//  } else {
//    serial.println("[sys]  config saved");
//  }
  spiffs.end();
 
  wifi.begin(wifi_ssid, wifi_password);
  serial.print("[wifi] connecting");
  while (wifi.status() != wl_connected) {
    delay(500);
    serial.print(".");
  }
  serial.println("connected");
  serial.print("[wifi] ip address: ");
  serial.println(wifi.localip());
  serial.print("[mqtt] setting up: ");
  serial.println((string) mqtt_host);
  // *********************************************************************** issue here
  client.setserver((uint8_t*) mqtt_host, (int) mqtt_port); // can't these variables work
  client.setcallback(mqttcallback);
  mqttconnect();
}

void loop() {
  if (!client.connected()) {
    serial.println("[mqtt] not connected!");
    mqttconnect();
  }
  client.loop();
}

/* functions loading/saving config
 * https://github.com/esp8266/arduino/blob/master/libraries/esp8266/examples/configfile/configfile.ino
*/
bool loadconfig() {
  file configfile = spiffs.open(config_filepath, "r");
  if (!configfile) {
    serial.println("[sys]  failed open config file");
    return false;
  }
  size_t size = configfile.size();
  if (size > 1024) {
    serial.println("[sys]  config file size large");
    return false;
  }
  std::unique_ptr<char[]> buf(new char[size]);
  configfile.readbytes(buf.get(), size);
  staticjsonbuffer<200> jsonbuffer;
  jsonobject& json = jsonbuffer.parseobject(buf.get());
  if (!json.success()) {
    serial.println("[sys]  failed parse config file");
    return false;
  }
  wifi_ssid = json["wifi_ssid"];
  wifi_password = json["wifi_password"];
  mqtt_host = json["mqtt_host"];
  mqtt_port = json["mqtt_port"];
  mqtt_clientname = json["mqtt_clientname"];
  mqtt_username = json["mqtt_username"];
  mqtt_password = json["mqtt_password"];
  mqtt_route_door1 = json["mqtt_route_door1"];
  mqtt_route_door2 = json["mqtt_route_door2"];
  mqtt_route_car1 = json["mqtt_route_car1"];
  mqtt_route_car2 = json["mqtt_route_car2"];
  mqtt_route_calibrate = json["mqtt_route_calibrate"];
  return true;
}
bool saveconfig() {
  staticjsonbuffer<200> jsonbuffer;
  jsonobject& json = jsonbuffer.createobject();
  json["wifi_ssid"] = wifi_ssid;
  json["wifi_password"] = wifi_password;
  json["mqtt_host"] = mqtt_host;
  json["mqtt_port"] = mqtt_port;
  json["mqtt_clientname"] = mqtt_clientname;
  json["mqtt_username"] = mqtt_username;
  json["mqtt_password"] = mqtt_password;
  json["mqtt_topic"] = mqtt_topic;
  json["mqtt_route_door1"] = mqtt_route_door1;
  json["mqtt_route_door2"] = mqtt_route_door2;
  json["mqtt_route_car1"] = mqtt_route_car1;
  json["mqtt_route_car2"] = mqtt_route_car2;
  json["mqtt_route_calibrate"] = mqtt_route_calibrate;
  file configfile = spiffs.open(config_filepath, "w");
  if (!configfile) {
    serial.println("[sys]  failed open config file writing");
    return false;
  }
  json.printto(configfile);
  return true;
}

/* mqtt functions */
void mqttconnect() {
  while (!client.connected()) {
    serial.print("[mqtt] connecting...");
    // *********************************************************************** issue here
    if (client.connect(mqtt_clientname, mqtt_username, mqtt_password)) {  // can't these variables work
      serial.println("connected");
      //client.publish("outtopic", "hello world");
      // ... , resubscribe
      client.subscribe(mqtt_route_door1);
      client.subscribe(mqtt_route_door2);
      client.subscribe(mqtt_route_calibrate);
    } else {
      serial.print("failed, rc=");
      serial.print(client.state());
      serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}
void mqttcallback(char* topic, byte* payload, unsigned int length) {
  serial.print("[mqtt] message arrived [");
  serial.print(topic);
  serial.print("] ");
  string message = "";
  (int = 0; < length; i++) {
    message += (char)payload[i];
    serial.print((char)payload[i]);
  }
  serial.println();
  serial.println(message);
}


config.json:
code: [select]
{
  "wifi_ssid": "ssid",
  "wifi_password": "pass",
  "mqtt_host": "192.168.0.100",
  "mqtt_port": 1883,
  "mqtt_clientname": "myclient",
  "mqtt_username": "user",
  "mqtt_password": "pass",
  "mqtt_route_door1": "garage/door1",
  "mqtt_route_door2": "garage/door2",
  "mqtt_route_car1": "garage/car1",
  "mqtt_route_car2": "garage/car2",
  "mqtt_route_calibrate": "garage/calibrate"
}


i know there's esp8266 forum, i've been given fantastic advice here, more of c question, , of these libraries work on standard arduinos.

thanks!

i think should strdup() strings in char pointers because pointing information transient , local loadconfig() function


Arduino Forum > Using Arduino > Programming Questions > Converting types from ArduinoJSON to PubSubClient library parameters (MQTT)


arduino

Comments

Popular posts from this blog

DHT11 Time out error using v0.4.1library

Sketch upload fails with Java error (___REMOVE___/bin/avrdude)!

Arduino Uno + KTY81/210 temperature sensor