Jugando con WIFI Shield CC3000

Objetivos

 

  • Continuar jugando con el WIFI Shield CC3000.
  • Introducir el concepto de servicios JSON en Internet.
  • Ver un pequeño ejemplo de cómo usarlo en nuestros programas.
  • Presentar un ejemplo de geo localización mediante un servicio de JSON.
  •  

    Material requerido.

     

     

      WIFI CC3000

    El Shield WIFI CC3000

     

    En la última sesión empezamos a jugar con este Shield WIFI que incorpora el chip de Texas Instruments CC3000, y la verdad es que me sorprendió gratamente, por lo que me he animado a profundizar un poco más con él para ver qué cosas podemos hacer.

    Y entre las cosas que me han llamado la atención están los varios ejemplos que vienen con la librería de Adafruit, porque me han parecido muy interesantes e instructivos, para que los incorporemos en nuestros proyectos.

    Una de las ventajas que supone esta librería está en que viene con  un buen número de ejemplos (15) a cual más interesante, tanto que vamos a revisar en este capítulo uno de ellos que nos muestra cómo obtener la localización aproximada de nuestra posición mediante el servicio web de freegeoIp.net.

    Tal y como los chicos de Adafruit indican, este sistema no es ni de lejos tan preciso como un GPS, pero tiene la enorme virtud de estar disponible sin más que engancharte a la red y con una buena aproximación, aunque no hay garantía de que funcione en todos los sitios pero ya me contareis.

    Conocer la posición en la que te encuentras te permite consultar la hora de salida y puesta de sol por ejemplo, lo que te puede permitir orientar un panel solar para conseguir la máxima carga, o quizás el tiempo que va a hacer, para saber si tienes que levantarte a por la tabla de Surf o es mejor quedarse en casa.

    Desde otro punto de vista, mas practico, en esta sesión nos introduciremos en el concepto de servidores de información JSON, que nos proveen de casi innumerables opciones de datos de todo tipo de forma muchas veces gratuita, sobre lo que se os ocurra.

    Tenemos servidores que nos informan sobre posición con latitud y longitud, nombres de ciudades, terremotos, meteorología, generadores de números o textos aleatorios, mapas y casi lo que se os ocurra.

    Según la Wikipedia: JSON, acrónimo de JavaScript Object Notation, es un formato ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de JavaScript que no requiere el uso de XML.

    La simplicidad de JSON ha dado lugar a la generalización de su uso, especialmente como alternativa a XML en AJAX que son siempre más complicadas de usar.

     

    Geo localización con WIFI Shield CC3000

     

    No hay duda de que los errores de este ejmplo son solo míos, pero cualquier merito que podáis encontrar en este ejemplo, tenéis que atribuírselo a los chicos de Adafruit que amablemente nos proporcionan tanto la librería como los ejemplos en licencia BSD, además su ciencia en la confección de los programas.

    Este capítulo va a ser de lo más cómodo para mí (No es la primera vez que hablamos de mi vagancia). No voy a hacer nada más que traducir los textos del programa y comentarlos un poco, para todos esos que se acercan a Arduino con una idea y muchas ganas de hacer cosas.

    Para empezar, tenéis que descargar e instalar la librería Adafruit_CC3000_Library-master o bien descargarla de Github, e instalarla por el procedimiento habitual que ya tenemos bien conocido, y si vais a

    Archivo\Ejemplos\Adafruit C3000 Library

    Encontrareis el original de este programa (entre otros varios). Como siempre empezamos con algunas definiciones:

    #include <Adafruit_CC3000.h>
    #include <SPI.h>
    
    #define ADAFRUIT_CC3000_IRQ   3  // MUST be an interrupt pin!
    #define ADAFRUIT_CC3000_VBAT  5
    #define ADAFRUIT_CC3000_CS    10
    
    Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS,ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,   SPI_CLOCK_DIVIDER);

    Ahora acordaros de poner los datos de vuestra WIFI en la siguientes líneas:

    #define WLAN_SSID       "charly"   // No mas de 32 caracteres.
    #define WLAN_PASS       "contrase"
    #define WLAN_SECURITY   WLAN_SEC_WPA2
    

  • Todos los ejemplos del Shield necesitan que adaptéis los valores de vuestra conexión, de lo contrario os va a costar conectar y que funcionen los ejemplos (Y lo digo porque me ha pasado repetidamente).
  • Podemos definir varios tipos de encriptación, en función de como hayáis definido la seguridad WIFI en vuestro Route.

    Encriptación
    Flag WLAN_SEC_UNSEC WLAN_SEC_WEP WLAN_SEC_WPA WLAN_SEC_WPA2
  •  

    Vamos con el programa de posicionamiento GeoLocation .Creamos una instancia el cliente WIFI mediante:

    Adafruit_CC3000_Client client;

    Definimos algunas constantes para los diferentes TimeOuts que vamos a necesitar:

    const unsigned long
    dhcpTimeout     = 60L * 1000L, // Max time to wait for address from DHCP
    connectTimeout  = 15L * 1000L, // Max time to wait for server connection
    responseTimeout = 15L * 1000L; // Max time to wait for data from server

  • Fijaros en la sintaxis de estas declaraciones. En lugar de repetir tres veces const unsigned long, lo hacemos solo una vez para las tres variables, poniendo una “,” al final de las dos primeras líneas, y un “;” al final de todo.
  • C++ interpretará las cuatro líneas como una sola instrucción.
  •  

    Vamos a intorregar al servidor de freegeoip.net para obtener información de nuestra posición, deducida por nuestra IP publica, la que nos asigna nuestro proveedor de Internet, y por eso vamos a definir algunas variables para guardar los resultados recibidos:

    char
       country[20],
       region[20],
       city[20],
       name[13],  // Temp space for name:value parsing
       value[64]; // Temp space for name:value parsing
       float   longitude, latitude;

    Las primeras instrucciones del setup, son exactamente iguales a las de la sesión previa por lo que nos las vamos a comentar:

    if(!cc3000.begin())
      {  Serial.println("Error.");
         return;
      }
    Serial.print(("OK.\r\nConnectando a la red..."));
    if(!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY))
      { Serial.println("Fallo!");
        return;
      }
    Serial.println("Conectado!");

    Vamos a ver ahora como conseguimos una dirección del servidor  DHCP:

    Serial.print("Solicitando direccion IP...");
    for(t=millis(); !cc3000.checkDHCP() && ((millis() - t) < dhcpTimeout); delay(1000));
    if(cc3000.checkDHCP())
       Serial.println("OK");
    else 
      {  Serial.println("failed");
         return;
      }

  • Para quienes seáis nuevos en TCPIP, Un servidor DHCP asigna los datos como dirección IP y servidores DNS, a un cliente o nodo que lo solicite. De este modo nuestra red se configura con valores diferentes según donde conectemos, sin necesitar de cambiar valores a mano.
  • Si no teneis claro que es todo esto, os recomendamos que leáis la introducción al TCPIP que hicimos en una sesion previa aqui.
  •  

    Imprimimos aquí  los valores asignados mediante la función que vimos en la sesión previa:

    while(!displayConnectionDetails()) delay(1000);

    Y vamos a conseguir la dirección del servidor de freegeoip.net mediante una consulta al DNS:

    Serial.print("Resolviendo la direccion de freegeoip.net... ");
    t = millis();
    while((0L == ip) && ((millis() - t) < connectTimeout))
      {  if(cc3000.getHostByName("freegeoip.net", &ip)) 
             break;  // Aqui esta la consulta
             delay(1000);
      }
    if(0L == ip)
      { Serial.println("Error.");
        return;
      }
    
    cc3000.printIPdotsRev(ip);     // Formatea e imprime la IP obtenida
    Serial.println();

    Vamos a usar el cliente que creamos mas arriba para hacer una petición al servidor de freegeoip.net

  • Conviene recordar, que el servicio de geo localización es gratuito, por lo que no hay que abusar, para no sobrecargar a quien le lo proporciona amablemente, y por ello, haremos una única llamada en el programa.
  •  

    Serial.print("Connectando al servidor...");
    client = cc3000.connectTCP(ip, 80);
    if(client.connected())
       {   Serial.print("Conectado.\r\nSolicitando informacion...");
           client.print("GET /json/ HTTP/1.1\r\nHost: freegeoip.net\r\n\r\n");
       }
    else
       {   Serial.println("Error");
           return;
       }
    Serial.println("OK");

    Vamos ahora con la parte que lee la respuesta y la procesa:

    Serial.print("\r\nLeyendo respuesta...");
    country[0] = region[0] = city[0] = 0; // Clear data
    jsonParse(0, 0);
    client.close();
    Serial.println("OK");

    Tenéis la función jsonParse() (Entre otras) al final del programa pero parece una de esas cosas que hay que usar sin mirar dentro demasiado.

    El resto es gimnasia. Desconectar e imprimir el resultado:

    Serial.println(F("\nDisconnecting"));
    cc3000.disconnect();
    Serial.print(F("\r\nRESULTADO:\r\n  Pais:\t "));
    Serial.println(country);
    Serial.print(F("  Region:\t "));
    Serial.println(region);
    Serial.print(F("  Ciudad:\t "));
    Serial.println(city);
    Serial.print(F("  Longitud:\t "));
    Serial.println(longitude);
    Serial.print(F("  Latitud:\t "));
    Serial.println(latitude);

    El resultado es lo pongo a continuación:

    Salida formateada de posicion a consola arduino

     

     

     

    Resumen de la sesión

     

  • Hemos visto más posibilidades del  Shield WIFI basado en CC3000.
  • Presentamos la idea de los servicios JSON en la Web.
  • Vimos un ejemplo de Adafruit de como localizar nuestra posición a aproximada, mediante la conexión a un servicio JSON.
  •  

    Deja una respuesta