Json + Spiffs + Mqtt (Broker y cliente)

Hola buenas tardes desde Alemania :),

Este es mi primer post, (Luego de buscar y buscar) me he decidido a escribir la siguiente cuesti贸n:

El proyecto en el que trabajo lo he titulado SmartThermostat, que seria algo como Termostato inteligente no ? :slight_smile:

Lo quiero orientar hacia Iot. Concretamente tengo un nodo central como broker (esp8266) y 3 clientes conectados tambien de la familia esp8266.

El caso es que tengo el Broker como SoftAP y a los clientes les cargo esas configuraciones iniciales para conectarlos entre si. Esta parte va de maravillas.

El tema que me trae de cabeza es que quisiera saber como puedo conectarlos de una sola vez a todos desde un cliente a un Router local.

Las funciones de la biblioteca del esp8266 para recuperar ssid y el password las tengo vistas.

Ahora: como envio todo en un Json, guardo lo datos en la spiffs para mantenerlos en la memoria y luego les cargo la nueva configuracion y los arranco para que se conecten con las nuevas credenciales :o

Hola, en mi experiencia con los ESP8266 la verdad nunca los he utilizado como servidor, siempre como cliente debido a que me parece mucho m谩s f谩cil conseguir un servidor en internet y conectarme a 茅l para luego visualizar todos los datos desde cualquier lugar. Para el env铆o de archivos Json necesitas la librer铆a ArduinoJson.h toda la documentaci贸n con ejemplos y la librer铆a las puedes encontrar en este link. Debes tener muy claras las sintaxis para la utilizaci贸n de estas librer铆as porque al momento de conectarte con un servidor en internet te pide ciertas credenciales y par谩metros para poder conectarte a 茅l, as铆 que te toca leer bastante acerca de la utilizaci贸n del ESP como servidor para poner hacer dichas conexiones y enviar el Json. Te muestro un trozo de c贸digo que tengo a manera de ejemplo en donde hago un env铆o de Json por petici贸n POST.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>

HTTPClient http;

String Host = "http://159.89.234.102";
String uri2 = "/oauth/token";

void Setup{
 聽 聽Serial.begin(9600);
}

void loop() {
聽 if (WiFi.status() == WL_CONNECTED) {
聽 聽 String grant_type, client_id , client_secret, username, password, message, message2;
 聽 聽grant_type = "password";
 聽 聽client_id = String(id); //2
 聽 聽client_secret = String(secret); //lIFOudKXgfP7hmzgpevs3lFNtQTJAgRvXC6OU0wQ
 聽 聽username = "emuasensor1@emu.ua.edu.co";
 聽 聽password = "-V}b(Nw9DkR[hU;Z";
 聽 聽message = "grant_type=" + grant_type + "&client_id=" + client_id + "&client_secret=" + client_secret + "&username=" + username + "&password=" + password;
 聽 聽//message2 = String("grant_type=password&client_id=2&client_secret=lIFOudKXgfP7hmzgpevs3lFNtQTJAgRvXC6OU0wQ&username=ADM123&password=aaaaaa");
 聽 聽//Serial.println(message2);
 聽 聽http.begin(Host + uri2);
 聽 聽http.addHeader("Content-Type", "application/x-www-form-urlencoded"); //http.addHeader("Content-Type", "text/plain");
 聽 聽httpCode = http.POST(message);
 聽 聽if (httpCode > 0) {
 聽 聽 聽const size_t bufferSize = JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(8) + 370;
 聽 聽 聽DynamicJsonBuffer jsonBuffer(bufferSize);
 聽 聽 聽JsonObject& root = jsonBuffer.parseObject(http.getString());
 聽 聽 聽bearer = root["access_token"];
 聽 聽 聽Serial.printf("[HTTP] POST... code: %d\n", httpCode);
 聽 聽 聽if (httpCode == HTTP_CODE_OK) {
 聽 聽 聽 聽//String payload = http.getString();
 聽 聽 聽 聽//Serial.println(payload);
 聽 聽 聽 聽//Serial.print("access_token: ");
 聽 聽 聽 聽//Serial.println(bearer);
 聽 聽 聽 聽//String dato = String(bearer);
 聽 聽 聽 聽//Serial.println(dato.length());
 聽 聽 聽 聽Serial.println("Recibido el access token");
 聽 聽 聽}
 聽 聽}
 聽 聽else {
 聽 聽 聽Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
 聽 聽}
聽 } else{
聽 聽  Serial.println("No hay conexion a internet");
聽 }

 聽 聽http.end();
}

El id y secret son par谩metros que obtuve antes de realizar esto que son las credenciales para poder hacer el sign in, estos datos te los debe dar el servidor.

Hola Jhony9625,

Muchas gracias por tomarte un ratito y contestar!!! :slight_smile:
ahora mismo estoy peleando con ello.

Mira hasta ahora el Broker inicia un softAP y se conectan de forma predeterminada los demas clientes al ssdi: ESP-Broker, pass: xxx, luego desde uno de los clientes lanzo o bien un Webserver o un WPS para obtener credenciales de una red externa, una vez las obtengo, la propago hacia el Broker y de ahi a los dem谩s Clientes en la malla para poder:

A) cada nodo se conecta a la malla que mejor intensidad tenga para interactuar con el Broker local,

B) de esta manera puedo jugar con la posicion final de cada nodo independientemente de una red o de la otra.
En cuanto tenga el codigo montado lo publicare para el que tenga interes. :wink:

p.d: Por cierto el broker corre sobre un ESP8266 :slight_smile: va de maravilla, tambien hace las veces de enlace con un Broker remoto y como cliente local ....