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

13 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
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

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

    ResponderEliminar