Buenas tardes. Estoy implementando un proyecto IoT con ESP32 para enviar datos de sensores a una base de datos en MySQL en un servidor propio en internet (C-panel). El dispositivo se conecta mediante WiFi correctamente a la red y captura y muestra en serial, el valor de las lecturas de los sensores. El problema surge al hacer la petición POST al servidor en donde se encuentra el archivo PHP que inserta los datos a la base de datos. Al solicitar el HTTP Response code, me arroja 301, lo que significa un error de redireccionamiento de la URL, es decir, el host se comunica con el servidor, pero el recurso solicitado, aparentemente ha sido movido de forma permanente a otra dirección. Para verificar esto, monté en el servidor un formulario (HTML) para ingresar los datos por pantalla; este formulario apunta al mismo archivo PHP que modifica la base de datos y funciona perfectamente, actualizando la base de datos. Intenté hacer un redireccionamiento en el archivo .htacces como muestran en algunos blogs, pero sigue sin funcionar desde el dispositivo y me empezó a poner problemas el formulario, así que eliminé el redireccionamiento. Espero por favor su colaboración. Muchas gracias
Adjunto código:
//Librerías comunicación WiFi:
#ifdef ESP32
#include <WiFi.h>
#include <HTTPClient.h>
#else
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#endif
//Librería comunicación I2C
#include <Wire.h>
//Librerías de sensores:
#include "DHT.h"
#include "Adafruit_BMP085.h"
//Pin de comunicación con el dispositivo:
#define pin2 32
//Configuración de red:
const char* ssid = "XXXXXXXX";
const char* password = "xxxxxxxxx";
//Dominio y URL
const char* serverName = "http://mydomain.com/prueba_esp32/esp_32.php";
// API Key debe ser la misma en el código PHP y en el código del ESP_32
String apiKeyValue = "xxxxxxxxx";
//Declarar objetos:
DHT dht(pin2, DHT22);
Adafruit_BMP085 bmp;
int i = 1;
float dhtReadings[2];
float bmpReadings[3];
void setup() {
//Iniciar la conexión con el controlador por puerto serie con velocidad de 115200 baudios:
Serial.begin(115200);
delay(2000);
//Mensaje de prueba de comunicación con el controlador:
Serial.println("++++++++++++++++++++");
Serial.println("Test de sensores:");
Serial.println("++++++++++++++++++++");
//Inicializar objetos:
dht.begin();
bmp.begin();
WiFi.begin(ssid, password);
//Verificar conexión a la red WiFi:
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Conectando....");
}
delay(2000);
Serial.println("Dispositivo conectado");
Serial.print("IP dispositivo: ");
Serial.println(WiFi.localIP());
}
void loop() {
//Invocar funciones de lectura:
Serial.println("----------------------");
Serial.print("Lectura: ");
Serial.println(i);
Serial.println("----------------------");
delay(1000);
leerdht();
leerbmp();
i++;
//Verificar status WiFi
if(WiFi.status()== WL_CONNECTED){
WiFiClient client;
HTTPClient http;
// Conectar con el servidor
http.begin(client, serverName);
// Especificar tipo de datos
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Petición HTTP POST
String httpRequestData = "api_key=" + apiKeyValue + "&temp_dht=" + String(dhtReadings[0]) + "&hum_dht=" + String(dhtReadings[1])
+ "&temp_bmp=" + String(bmpReadings[0]) + "&pres_bmp=" + String(bmpReadings[1]) + "&alt_bmp=" + String(bmpReadings[2]) + "";
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
// Respuesta a la petición HTTP POST
int httpResponseCode = http.POST(httpRequestData);
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Cerrar la petición
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
//Send an HTTP POST request every 30 seconds
delay(30000);
}
//Función de lectura del DHT22:
float leerdht() {
//Crear variables para lecturas del sensor:
float tempdht = dht.readTemperature();
float humdht = dht.readHumidity();
// Bucle mientras alguna de las lecturas no sea un número:
while (isnan(tempdht) || isnan(humdht)) {
Serial.print ("Lectura fallida en el sensor DHT22, repitiendo lectura");
delay(2000);
tempdht = dht.readTemperature();
humdht = dht.readHumidity();
}
//Mostrar lecturas en monitor:
Serial.print("Temperatura DHT22: ");
Serial.print(tempdht);
Serial.println("°C");
Serial.print("Humedad DHT22: ");
Serial.print(humdht);
Serial.println(" %HR");
Serial.println("----------------------");
dhtReadings[0] = tempdht;
dhtReadings[1] = humdht;
}
//Función de lectura del BMP:
float leerbmp() {
//Crear variables para lecturas del sensor:
float tempbmp = bmp.readTemperature();
float presbmp = bmp.readPressure() / 100;
float altbmp = bmp.readAltitude();
//Mostrar lecturas en monitor:
Serial.print("Temperatura BMP: ");
Serial.print(tempbmp);
Serial.println("°C");
Serial.print("Presión BMP: ");
Serial.print(presbmp);
Serial.println(" hPa");
Serial.print("Altitud BMP: ");
Serial.print(altbmp);
Serial.println(" m s.n.m.");
Serial.println("----------------------");
bmpReadings[0] = tempbmp;
bmpReadings[1] = presbmp;
bmpReadings[2] = altbmp;
}
Respuesta en monitor serie:
++++++++++++++++++++
Test de sensores:
++++++++++++++++++++
Conectando....
Conectando....
Conectando....
Conectando....
Conectando....
Conectando....
Dispositivo conectado
IP dispositivo: xxx.xxx.x.x
----------------------
Lectura: 1
----------------------
Temperatura DHT22: 25.00°C
Humedad DHT22: 62.80 %HR
----------------------
Temperatura BMP: 24.10°C
Presión BMP: 853.00 hPa
Altitud BMP: 1425.07 m s.n.m.
----------------------
httpRequestData: api_key=tPmAT5Ab3j7F9&temp_dht=25.00&hum_dht=62.80&temp_bmp=24.10&pres_bmp=853.00&alt_bmp=1425.07
HTTP Response code: 301
Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>
Gracias. No sabía cómo hacerlo. Había escrito los tags de "code" manualmente
Para eso estan las normas, se leen y las dudas desaparecen y si no comprendes algo me preguntas al respecto por privado.
Lee esto a ver si te ayuda con tu problema
Es muy posible que tengas que redireccionar a un conexión segura SSL pero claramente la librería no debe permitirlo. Verifica que tu server no requiera https://
He visto otros ejemplos y esta claro que ese es el problema
MIra la respuesta de otra persona usando un MKR1000 intentando conectarse como tu
+UUSORD: 0,4294967295
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 05 Apr 2021 03:29:34 GMT
Content-Type: text/html
Content-Length: 178
Connection: close
Location: https://www.arduino.cc/asciilogo.txt
Strict-Transport-Security: max-age=500; includeSubDomains
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Donde dice Location aparece el sitio y como no puede redireccionarse da ese error 301.
Muchas gracias. Voy a leer la documentación. Parece ser que Arduino no soporta SSL. Voy a revisar
No tiene memoria para manejar semejante stack.
Son tareas para un ESP32 con suerte y si encuentras librería o un Raspberry Pi.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.