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:
config.json:
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!
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
Post a Comment