domingo, 2 de julio de 2017

Tutorial #9 ESP8266 - MySQL + PHP en Servidor EXTERNO

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

28 comentarios:

  1. 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.

    ResponderEliminar
    Respuestas
    1. Mi 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
      Si 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.

      Eliminar
    2. deja de
      mentir mentiroso que dice mentiras la concha de tu madre viem biolada

      Eliminar
  2. 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

    ResponderEliminar
  3. no me registra no se sime podes colaborar

    ResponderEliminar
  4. buenas estuve probando el codigo y me sale el siguiente error al compilar

    Arduino: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.

    ResponderEliminar
  5. Tenés que elegir la placa ESP8266 que corresponda. No la Genuino Uno. Saludos.

    ResponderEliminar
  6. Hola 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

    ResponderEliminar
  7. Buenas 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!

    ResponderEliminar
  8. Tengo el mismo problema, no me hace ping desde cmd a la web

    ResponderEliminar
  9. buenas 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

    ResponderEliminar
    Respuestas
    1. Si claro que se puede, tenés que buscar la forma de adaptar el ejemplo. Saludos.

      Eliminar
  10. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  11. Hola Ingeniero, me gustaría saber como enviar los datos utilizando GET y no POST. Espero pueda ayudarme.

    ResponderEliminar
  12. Con el método get es mas fácil, ya que los datos los enviás por la URL. Saludos.

    ResponderEliminar
  13. Hola alguien tiene el archivo php?
    Gracias!!

    ResponderEliminar
    Respuestas
    1. 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

      Eliminar
  14. excelente 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 :)

    ResponderEliminar
  15. parece 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

    ResponderEliminar
  16. Hola estupendo todo lo que haces ... quisiera saber si pudieras ayudarme con esto:

    Enviando 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.

    ResponderEliminar
  17. 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:

    http.begin( host );
    delay(1000);
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    int httpCode = http.POST( message );
    String payload = http.getString();

    ResponderEliminar
  18. 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?

    ResponderEliminar
  19. Muy buen trabajo alejandro! En vez de trabajar con php se puede laburar con java en el hosting web?

    ResponderEliminar
  20. buen 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.

    #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

    ResponderEliminar
  21. " . mysqli_error($dbconnect);
    }
    ?>

    ResponderEliminar