Este tutorial sobre IOT (internet de las cosas) en ESP8266, es
una continuación del tutorial sobre MySQL y PHP, pero en este explico cómo
hacerlo desde un servidor EXTERNO. En el video muestro todos los problemas que van
surgiendo, como solucionarlo uno por uno y finalmente una técnica de hacking
para engañar al servidor y hacerlo funcionar.
Código Fuente:
#include <ESP8266WiFi.h> #include <WiFiClient.h> //-------------------VARIABLES GLOBALES-------------------------- int contconexion = 0; const char *ssid = "----"; const char *password = "-----"; unsigned long previousMillis = 0; char *host = "185.27.134.206" ; String strhost = "tutorialesp.epizy.com"; String strurl = "/enviardatos.php"; String chipid = ""; //-------Función para Enviar Datos a la Base de Datos SQL-------- String enviardatos(String datos) { String linea = "error"; WiFiClient client; //strhost.toCharArray(host, 49); if (!client.connect(host, 80)) { Serial.println("Fallo de conexion"); return linea; } client.print(String("POST ") + strurl + " HTTP/1.1" + "\r\n" + "Host: " + strhost + "\r\n" + "Connection: keep-alive" + "\r\n" + "Content-Length: " + datos.length() + "\r\n" + "Cache-Control: max-age=0" + "\r\n" + "Origin: http://tutorialesp.epizy.com" + "\r\n" + "Upgrade-Insecure-Requests: 1" + "\r\n" + "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36 OPR/46.0.2597.32" + "\r\n" + "Content-Type: application/x-www-form-urlencoded" + "\r\n" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" + "\r\n" + "Referer: http://tutorialesp.epizy.com/" + "\r\n" + //"Accept-Encoding: gzip, deflate" + "\r\n" + "Accept-Language: es-419,es;q=0.8" + "\r\n" + "Cookie: __test=f8113e8304f87333c04e20518549f29c; _ga=GA1.2.2140598187.1499029965; _gid=GA1.2.1824054122.1499029966" + "\r\n" + "\r\n" + datos); delay(10); Serial.print("Enviando datos a SQL..."); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println("Cliente fuera de tiempo!"); client.stop(); return linea; } } // Lee todas las lineas que recibe del servidro y las imprime por la terminal serial while(client.available()){ linea = client.readStringUntil('\r'); Serial.print(linea); } //Serial.println(linea); return linea; } //------------------------------------------------------------------------- void setup() { // Inicia Serial Serial.begin(115200); Serial.println(""); Serial.print("chipId: "); chipid = String(ESP.getChipId()); Serial.println(chipid); // Conexión WIFI WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED and contconexion <50) { //Cuenta hasta 50 si no se puede conectar lo cancela ++contconexion; delay(500); Serial.print("."); } if (contconexion <50) { //para usar con ip fija IPAddress ip(192,168,1,156); IPAddress gateway(192,168,1,1); IPAddress subnet(255,255,255,0); WiFi.config(ip, gateway, subnet); Serial.println(""); Serial.println("WiFi conectado"); Serial.println(WiFi.localIP()); } else { Serial.println(""); Serial.println("Error de conexion"); } } //--------------------------LOOP-------------------------------- void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= 10000) { //envia la temperatura cada 10 segundos previousMillis = currentMillis; int analog = analogRead(17); float temp = analog*0.322265625; Serial.println(temp); enviardatos("chipid=" + chipid + "&temperatura=" + String(temp, 2)); } }
http://www.sinaptec.alomar.com.ar/2017/06/tutorial-6-esp8266-mysql-php-en.html
https://infinityfree.net
https://www.wireshark.org
Hola Alejandro, queria saber como podria hacer para acceder a un ESP8266 via internet sin utilizar el servicio de NO-IP, x ej. Yo hice algo de forma agarrada de los pelos pero queria saber de algo mas profesional, lo que hice fue: utilizando un hosting (hostinger) mediante una funcion de php fui guardando la IP dinamica donde esta el dispositivo, entonces si yo quiero acceder a el, leo esa ip que guarde en una BD del hosting, le agrego el puerto que le asigne al ESP a traves del router y pudeo acceder al dispositivo. Pero queria saber si habia algo mas limpio o si lo harias de otra forma. Otra cosa, si yo uso el celular como AP para darle internet al ESP no encuentro la forma de poder acceder al esp desde internet porque no veo la forma de asignarle un puerto mediante el celular. Espero haber sido claro. Muchas gracias por tu tiempo de antemano.
ResponderEliminarMi recomendación es nunca acceder al ESP directamente desde internet. El webserver que se puede montar en un ESP yo lo dejo solamente para configurarlo haciéndolo funcionar como softAP, para usarlo en forma local o como una simple curiosidad. Si querés controlar o monitorear algo desde internet lo mejor es usar MQTT, es decir el ESP y todos los dispositivos (smartphone, PC, etc) se conectan a un Broker que se encarga de controlar todo. Hice un video introductorio sobre el tema: http://www.sinaptec.alomar.com.ar/2017/06/tutorial-5-esp8266-mqtt-ioadafruitcom.html
EliminarSi querés algo profesional te recomiendo usar MQTT con CloudMQTT (tiene una versión gratuita para empezar a probar), pero después tenés que hacer la aplicación para controlar y monitorear; eso yo lo resuelvo con una aplicación web que usa websockets y una librería de JavaScript que se llama mqttws31.js. Eso es lo que uso en este video:
http://www.sinaptec.alomar.com.ar/2017/06/ascensor-iot-internet-de-las-cosas.html
Mi idea es llegar a explicar algo así de complejo, pero hacen falta mucho tutoriales, ya que además de lo que tiene que ver con el ESP y MQTT, tiene mucho de HTML, CSS, JavaScritp, PHP, MySQL y Python.
deja de
Eliminarmentir mentiroso que dice mentiras la concha de tu madre viem biolada
Muchas gracias por la respuesta, mi idea era ser lo mas independiente de servicios externos, o utilizar lo mínimo posible. A seguir viendo tus tutoriales y seguir aprendiendo. gracias
ResponderEliminarDe nada.
Eliminarno me registra no se sime podes colaborar
ResponderEliminarCon tan poca información imposible.
Eliminarbuenas estuve probando el codigo y me sale el siguiente error al compilar
ResponderEliminarArduino:1.8.5 (Windows 7), Tarjeta:"Arduino/Genuino Uno"
D:\DOCUMENTOS\Documents\Arduino\pruebaconexion\pruebaconexion.ino:1:25: fatal error: ESP8266WiFi.h: No such file or directory
#include
^
compilation terminated.
exit status 1
Error compilando para la tarjeta Arduino/Genuino Uno.
Este reporte podría tener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias.
Tenés que elegir la placa ESP8266 que corresponda. No la Genuino Uno. Saludos.
ResponderEliminarHola te agradezco por tus tutoriales. podrias ayudarme, no he podido combinar este tutorial con el 7, es decir no he podido poner la pagina web para tomar el ssid y el pasword en el archivo json. podrias hacer un video de como hacerlo. muchas gracias
ResponderEliminarBuenas noches, Alejandro! Antes que nada, felicitaciones por tus tutoriales. Me están siendo de gran utilidad. Un problema que tengo es que la página para cargar los datos funciona perfectamente (sólo me ocurre lo mismo que a vos que de vez en cuando carga los valores en 0), pero cuando le hago un ping a la ip de dicha página, no funciona. Por otro lado, yo estoy haciendo un Proyecto con la ESP32, y quería saber si con este código podría funcionar. El primer problema que tengo es que debería cambiar la librería #include , pero no consigo su equivalente para la ESP32. Desde ya muchas gracias!
ResponderEliminarEste comentario ha sido eliminado por el autor.
EliminarTengo el mismo problema, no me hace ping desde cmd a la web
ResponderEliminarbuenas tardes tengo una consulta yo tengo un esp8266 nodemcu y un teclado matricial 4x4 y quería saber si se podría enviar la variable almacenada en cada botón a una base de datos externa de la misma pagina del ejemplo para que por una consulta me lo muestre
ResponderEliminarSi claro que se puede, tenés que buscar la forma de adaptar el ejemplo. Saludos.
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarHola Ingeniero, me gustaría saber como enviar los datos utilizando GET y no POST. Espero pueda ayudarme.
ResponderEliminarCon el método get es mas fácil, ya que los datos los enviás por la URL. Saludos.
ResponderEliminarHola alguien tiene el archivo php?
ResponderEliminarGracias!!
Este tutorial es la continuación del tutorial 6, donde está el código. http://www.sinaptec.alomar.com.ar/2017/06/tutorial-6-esp8266-mysql-php-en.html
Eliminarexcelente trabajo, felicidades, me podrás ayudar ya que hice mi dominio en el mismo hosting y tengo el problema que no me contesta los ping, que puedo hacer? gracias :)
ResponderEliminarparece que não tenho todo acesso fiz igual seu com seu cabeçalho http depois usei o meu próprio não deu certo tem ideia do que cega
ResponderEliminarHola estupendo todo lo que haces ... quisiera saber si pudieras ayudarme con esto:
ResponderEliminarEnviando datos a SQL...220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 2 of 50 allowed.
220-Local time is now 21:48. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Hola Alejandro, muy buenos tus tutoriales. Me sirvieron un montón en varios casos. En este particular, te pregunto, no es mejor usar algo así para hacer el envío de datos:
ResponderEliminarhttp.begin( host );
delay(1000);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpCode = http.POST( message );
String payload = http.getString();
hola, buen video y buena explicacion, pero tengo una duda si no dispongo de un nodeMCU, y quiero utilizar un ESP-01 ESP8266,se podria hacer?? y si si se puede que cambiaria en el codigo?
ResponderEliminarMuy buen trabajo alejandro! En vez de trabajar con php se puede laburar con java en el hosting web?
ResponderEliminarbuen día ingeniero, feliz año de antemano hehe, queria preguntarle si es posible hacer esa misma peticion pero con el shield w5100 ethernet y poder enviar el dato a una base de datos alojada en algun servidor web, he intentado hacer esto pero no he logrado cargar el dato en la base de datos, de antemano le agradezco mucho por su gran ayuda. Adjunto codigo de arduino y el php.
ResponderEliminar#include
#include
EthernetClient myClient;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char wServer[] = "gyhdomotica.000webhostapp.com";
int bstate = 0;
String txData ="";
void setup() {
Serial.begin(9600);
Ethernet.begin(mac,wServer);
delay(1000);
while (!Serial);
Serial.print("Establishing network connection… ");
if (Ethernet.begin(mac) == 0) {
Serial.println("FAILED!");}
else {
Serial.println("OK!");
}
}
void loop() {
bstate++;
txData = "BUTTON_STATE="+ (String (bstate));
Serial.print("Connecting to ");
Serial.print(wServer);
Serial.print("... ");
if (myClient.connect(wServer, 80) == 1) { //hace la conexion con el servidor
Serial.println("OK!");
myClient.print("POST https://gyhdomotica.000webhostapp.com/index.php?BUTTON_STATE= ");
myClient.print("HTTP/1.1");
myClient.print("Host: ");
myClient.println(wServer);
myClient.println("Connection: close");
myClient.println("Content-Type: application/x-www-form-urlencoded");
myClient.print("Content-Length: ");
myClient.print(txData.length());
myClient.print("\n\n");
myClient.print(txData); // after all of the required junk we send the data
Serial.println("hecho!");
}
else {
Serial.print("FAILED!");
}
delay(5000);
}
el codigo php
" . mysqli_error($dbconnect);
}
?>
mi correo: jorgehernandop@gmail.com
muchas graias inge
" . mysqli_error($dbconnect);
ResponderEliminar}
?>