Go Down

Topic: Proyecto con muchos dispositivos que base de datos utilizar (Read 306 times) previous topic - next topic

Aaron_MJ

Buenas, lo primero felicitaros por el foro y el soporte que ofrecéis, soy usuario en modo lectura desde hace un par de años.

Ahora mismo estoy con un proyecto el cual el cual va a constar de muchos dispositivos iguales monitorizando diferentes parámetros en hogares.

El proyecto lo tengo muy avanzado y funcionando en varios hogares ya para testear el funcionamiento. Estos dispositivos de prueba están configurados mediante el Skets para que se conecten a una base de datos MyQSL determinada, en un servidor determinado y una tabla determinada. Funcionan al 100%.

Este modo de envío de datos es solo para los prototipos, MySQL por que tenia un servidor ya pagado y conocía mas o menos su funcionamiento de otros proyectos.

Para el dispositivo final he estado probando varias opciones para almacenar los datos a parte de MySQL, como puedan ser las hojas de datos en drive, envío de .csv a una carpeta de un servidor online. Todas ellas las he conseguido implementar y hacer que funcionen, casi al 100%.

Mi primera consulta, es si podéis indicarme más opciones de hacer este mismo trabajo para investigarlas y ver su posible uso.


El proyecto lo he basado en una placa NodemCu ESP8266 12E, 4M Flash, programado a través del IDE de arduino.

Comienza con un app para poner los datos de la red wifi por el usuario basada en esta consulta del foro:

https://forum.arduino.cc/index.php?topic=483803.0

Recolecta los datos de diferentes sensores y los guarda en un archivo .txt (podría ser cualquier otra extensión) en la memoria Spiffs de la placa.

Una vez cada "X" tiempo se conecta a internet y lee el contenido del archivo guardado en  Spiffs y en este caso compone las URL para poder enviar la información a la base de datos MySQL. de esta forma no pierdo la información si se cae la conexión o se apaga el dispositivo.

Actualmente la placa la tengo programada de tal forma que entra en modo servidor y puedo acceder desde cualquier otro dispositivo de la red local a través de la IP a una página web que alojo también en la memoria Spiffs. De esta forma me facilita la interacción con el usuario para poder mostrarle datos e incluso cambiar estados de pins, etc...

He probado también a parte de lo anterior, crear una app con APP Inventor 2, la cual interprete la base de datos MySQL y muestre la información, pero entre ambas opciones por ahora he utilizado la del servidor local.

La hora y fecha, así como la localización en coordenadas GPS las obtengo con el propio NodemCu y las librerías que existen destinadas para este trabajo.

Toda la programación la tengo clara, gracias al foro y a internet!

Van a ser muchos dispositivos individuales en diferentes hogares, espero que sean más de 1000 en un par de años y que siga subiendo los siguientes años.


Ahora tengo mi duda principal sobre todo el proyecto;

¿¿¿Que tipo de base de datos utilizar???

Sigo con MySQL, existen mejores opciones?

Teniendo el cuenta que el dispositivo final se tiene que conectar el solo con la base de datos (sea cual sea el método utilizado), sin que el usuario medie en nada de esto, y serán muchos dispositivos.

No tengo código que compartir, ya que tengo 7 o 8 versiones diferentes de código cada una para hacer las cosas descritas arriba, más HTML, PHP, App Inventor, Api´s, todos diferentes para probar todas las opciones descritas arriba.

Perdón por el tamaño de consulta, pero quería dejar claro como funciona el sistema por si condiciona en algo para la elección de la base de datos.

Gracias por adelantado. ;)

ArduMyth

Si te atreves puedes cambiar el php por nodejs y Mysql por Mongoose :smiley-mr-green: pero advertencia, pese a la mejora, la mayor parte de la información decente está en inglés y los servers que disponen de estas opciones son pocos, a menos que cuentes con tu propio servidor claro, y aparte de pocos, como es lo último de lo último tampoco son baratos.
Claro está que moongose no es propiamente una BD pero te dejo a ti la lectura del tema, y nodejs fulmina PHP+[AJAx y JS](aunque estos dos usualmente ya viene "empaquetadito" en JQUERY)
Eso sí, nodejs angulars y moongose trabajando juntos es una maravilla, y créeme yo adoro PHP, pero la facilidad para llamar del lado del cliente funciones del lado del servidor con nodejs sin intermediarios y así de bien, es puro placer. Ya no hablemos de la velocidad de datos con moongose (aunque hay que cambiar el chip porque no hay relaciones entre ids).

Ahora bien ¿Donde está tu consulta de Arduino? porque esta sección es software :smiley-roll: La veo más cómo duda en proyecto ya que lo tienes tan avanzado y es una idea genérica.

Aaron_MJ

Muchas gracias por contestar ArduMyth

Pues estuve pensando donde escribirlo y elegí mal el lugar, pido disculpas por ello.

No te voy a mentir, por ahora debido al margen de tiempo que barajo para terminar el proyecto no me voy a documentar en nodejs y Mysql por Mongoose, pero si que me lo apunto para empezar con ello en el siguiente proyecto y ver sus posibilidades, viendo como lo presentas. Te lo agradezco mucho, ya tengo referencia para saber que buscar.

No tengo problema con que la documentación este en otro idioma, casi el 75% del actual proyecto esta documentado de foros en ingles, alemán y chino.

Al final voy a optar por enviar los datos a una base de datos MySQL, a través de consultas GET y POST, recibidas por un PHP para la inserción.

Estoy programando el "Void Setup" para que realice la consulta a un php de si existe una tabla determinada en la base de datos o no.

En caso de respuesta negativa, quiero que se vuelva hacer la consulta pero esta vez añadiendo un número al final del nombre y que se autoincremente.

Hasta que obtenga una respuesta positiva.


Ejemplo:

Envío consulta si existe la tabla monitorizacion_1,

Y si la respuesta es negativa,

Enviar de nuevo la consulta pero esta vez con el nombre monitorizacion_2,

Así hasta obtener la respuesta positiva.



Adjunto al code del ESP8266, con la variable "Nombre_BD_MySQL_Variable" aún fija para testear que todo funciona. Ahora es donde necesito hacer que si autoincremente el valor.

Code: [Select]


#include <ESP8266WiFi.h>
#include "FS.h"

#include "DHTesp.h"

DHTesp dht;

int dhtPin = 14;

const char* ssid     = "XXX";
const char* password = "XXXX";

const char* host = "www.XXXX.com";

int analog_pin = 0;

String Nombre_BD_MySQL_Variable;

String Respuesta_existe_tabla_MySQL;

void setup() {
  Serial.begin(9600);
 
  SPIFFS.begin();
  //SPIFFS.format();
  Serial.println();

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(5000);
  }

/////////////////////////////////////////////Abrir y leer Spiffs "SpiffsNombreBD"////////////////////////////

  File SpiffsNombreBD = SPIFFS.open("/SpiffsNombreBD.txt", "r");
  if (!SpiffsNombreBD) {
   
      Serial.println("file open failed");
     
  } 
 
  Serial.println("====== Reading from SPIFFS file =======");

    String Nombre_BD_MySQL=SpiffsNombreBD.readStringUntil('\n');

    Serial.println(Nombre_BD_MySQL);


  //}
  // espere unos segundos antes de volver a hacerlo todo de nuevo
  delay(3000);
//}
  SpiffsNombreBD.close();
 



delay(2000);


if (Nombre_BD_MySQL == "")
{

Serial.println("Spiffs nombre de la base de datos vacio!");
delay(3000);

WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
  Serial.println("La Conexión con el servidor a fallado");
  return;
}
else
{
  Serial.println("La Conexión EXITOSA");
}
delay(3000);

  // We now create a URL for the request
  String url = "/medidor/existetabla1.php?";
  String key = "pass=1234";
  String dato1 = "nombretabla=";
  String dato2 = "Temperatura";
 

  client.print(String("GET ") + url + dato1 + dato2 + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
    while (client.available()) {
    String ExisteTablaMySQL = client.readStringUntil('\r');
  Serial.print("Existe la Base de Datos MySQL?  ");
  Serial.println(ExisteTablaMySQL);
  delay(1000);
    }
 
}
else{

Serial.println("Spiffs Nombre BD contiene información");
Serial.print("El nombre de la base de datos del archivo spiffs es: ");
delay(1000);
Serial.println(Nombre_BD_MySQL);
Nombre_BD_MySQL_Variable = Nombre_BD_MySQL;
Serial.print("El nombre de Nombre_BD_MySQL_Variable asignado es; " );
Serial.println(Nombre_BD_MySQL_Variable);
}

}

 
void loop() {

 
 
}



Repasando el código, creo que me he complicado al poder hacer lo mismo en el "void Loop", condicionando con in "if" hasta obtener la respuesta positiva.

Aún así me gustaría saber si desde el "void setup" existe forma de realizarlo.

Gracias de nuevo, un saludo



Aaron_MJ

Buenas de nuevo.

Doy esta consulta por cerrada.

Gracias de nuevo ArduMyth por la referencia, he estado leyendo un poco y me ha picado la curiosidad.

Eso si, no va ser cosa de 2 tardes para poder poner en marcha.


surbyte

Sigue con MySQL, no vale la pena transistar la curva de aprendizaje de algo nuevo.
Si estoy de acuerdo que nodejs, mongosee y otras alternativas son excelentes.

De hecho yo uso nodejs, json, etc. pero tmb uso MySQL con Nodejs, según como se presentan las cosas.

Go Up