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

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