jueves, 26 de julio de 2012

Servidor WEB desde cero. Control (IV)

Hasta ahora, en las entradas en las que os he hablado del servidor web hemos hablado en primer lugar de los elementos que nos hacian falta para poder construirnos uno, en la siguiente entrada hablamos de como adaptar el Stack TCPIP para hacerlo funcionar en un PIC que no fuera de la familia 8722 y os expliqué como introducir una página web en el PIC , y lo último que vimos fué la monitorización, es decir, adaptar nuestra página web y nuestro firmware para poder visualizar modificar el valor de las variables dinámicas que aparecen en la página web desde el microcontrolador. En esta entrada vamos a ver la ultima parte que nos queda, que es el control mediante web, es decir, poder controlar salidas del micro mediante acciones realizadas en la página web. Para ello, al igual que pasaba con la monitorización necesitamos, en primer lugar modificar nuestro sitio web, en este caso añadiendo formularios, y después, habrá que modificar nuestro firmware para que el pic sea capaz de enlazar el valor de esos formularios, con las variables que queramos modificar, así pues, empecemos.
En primer lugar, como hicimos en el caso de la monitorización, vamos a ver que modificaciones tenemos que hacer en la página web. Como he dicho antes, lo que tenemos que hacer es añadir formularios. Los formularios son secciones de código html en los que podemos introducir controles como botones, checkboxes, radio_buttons e interactuar con ellos. La forma que la página web informa al servidor de la acción que ha ejecutado el usuario la podemos hacer de dos formas (métodos) diferentes. En primer lugar tenemos el método “get”, el cual plasma las acciones del usuario en la URL de la página web. Por ejemplo, si entramos en la página de google y tecleamos algo para que lo busque, cuando presionamos “buscar”, veremos que en la barra de dirección aparece una nueva dirección, por ejemplo, cuando buscamos “mips and chips”, vemos:
www.google.es/#hl=es&sclient=psy-ab&q=mips+and+chips&…
Si analizamos la dirección tenemos en primer lugar el nombre del servidor como es “www.google.es”, después tenemos los diferentes campos separados por el carácter “&”, y su valor, por ejemplo vemos que hay un campo llamado hl cuyo valor es es, otro campo es sclient cuyo valor es psy-ab, y el último que vemos es el campo q cuyo valor es mips+and+chips. La dirección realmente contiene muchos más campos que siguen la misma estructura. El otro método que existe es el método “post”, el cual la información se plasma en el mismo formulario. Este método es más complicado de utilizar, pero permite enviar muchos más datos. En esta entrada voy a trabajar tan solo en método get, ya que es lo suficientemente potente como para crear aplicaciones de una complejidad media alta.
Lo primero que debemos hacer para habilitar nuestra página para que de órdenes a nuestro micro es, como hemos dicho antes crear formularios, y dentro de estos, crear controles, por ejemplo, vamos a crear 2 radio_buttons que nos permitan poner un led en ON, o en OFF, y después un elemento del tipo submit que nos permita enviar ese comando al PIC.
<form method="get" action="index.htm">
 
    <fieldset>
 
    <span id="led">Estado de la entrada : ~led~<br>
 
    Estado de la salida : </span>&nbsp; 
 
    <input name="salida" type="radio" value="on" ~lights_chk(1)~ /> On
    <input name="salida" type="radio" value="off" ~lights_chk(0)~ /> Off
    
    &nbsp &nbsp <input type="submit" value="Enviar"/> 
    <br> Temperatura de la habitación:&nbsp ~temperatura~ ºC    
 
    </fieldset>
 
</form>
Hemos aprovechado y hemos metido también todas las variables de la monitorización para tenerlo todo más agrupado. Como se ve, los dos radio_buttons tienen el mismo parámetro “name”, de forma que los dos forman un único control y cuando uno está seleccionado el otro se deselecciona. El control submit es necesario para que se actualice la página y cambie la URL de la página de forma ue mandemos la orden al pic. En la página se verá algo como esto:
image
Lo siguiente es la modificación del firmware. El stack de microchip nos permite utilizar cualquiera de los dos métodos, y como en el caso de la monitorización, las funciones que realizan estas acciones se encentran en el archivo CustomHTTPAPP.c, donde encontramos el siguiente código:

HTTP_IO_RESULT HTTPExecuteGet(void)
{
// #### AQUÍ NUESTRO CÓDIGO GET
    return HTTP_IO_DONE;
}
 
#if defined(HTTP_USE_POST)
HTTP_IO_RESULT HTTPExecutePost(void)
{
    // #### AQUÍ NUESTRO CÓDIGO POST
    return HTTP_IO_DONE;
}
#endif
Tenemos 2 funciones, una para cada tipo, la HTTPExecuteGet se encarga de las llamadas de los formularios con método get, y la HTTPExecutePost que hace lo mismo para el método post. Como he dicho antes, nos vamos a centrar en el método get, ya que es más sencillo y es suficientemente potente. A continuación os pongo un ejemplo sencillo de código para la función HTTPExecuteGet:

HTTP_IO_RESULT HTTPExecuteGet(void)
{
    BYTE *ptr, name[20];
 
    // Obtenemos el nombre de archivo .htm
    MPFSGetFilename(curHTTP.file, name, 20);
    
    // Nos aseguramos que estamos en el .htm correcto
    if(strcmppgm2ram((char*)name, (ROM char*)"index.htm") != 0)
        return HTTP_IO_DONE;
    
    // Obtenemos el valor del control con el nombre "salida"
    ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"salida");
    if(ptr)    
    {// Si el valor del control es on, ponemos LED1_IO = 1, si no, LED_IO = 0
        if(strcmppgm2ram((char*)ptr, (ROM char*)"on") == 0)
        {
            LED1_IO = 1;
        }
        else
        {
            LED1_IO = 0;
        }
    }    
    return HTTP_IO_DONE;
}
Lo primero que hacemos es comprobar que nos encontramos en la página correcta, para ello, una vez obtenido el nombre de la página, con la función strcmppgm2ram, comparamos la cadena obtenida, y el nombre correcto, si el resultado es 0, significa que son iguales, por tanto estamos en la página correcta, si no estamos en la página correcta salimos de la función. A continuación con la instrucción HTTPGetROMArg, obtenemos el valor del control con el nombre “salida”, y almacenamos su valor en la variable *ptr, y al igual que antes lo comparamos con la cadena “on”, y si es igual, ponemos el led a 1, si es diferente lo ponemos a cero.
Como veis no tiene mucha dificultad y es muy vistoso. Una vez hecho esto, ya podemos tanto monitorizar variables como controlar salidas del micro. Lo próximo es diseñar nuestro circuito y transferirlo a un PCB. Como ahora viene el mes de agosto, y tengo cosas que terminar, la fabricación de la placa la dejaré para más adelante, así que tened paciencia!!

5 comentarios:

  1. Buenisimo el tuto espero que no se te olvide de ponerle la frutilla a la torta ya que esta practicamente pronta.
    Saludos y que pases bien!!

    ResponderEliminar
  2. Espero tenerlo completado en breve!!! Gracias!

    ResponderEliminar
  3. Hola:

    Tu Web es muy interesante. ¿Le interesa enlazarnos entre nosotros? Mi Blog es http://electronica-pic.blogspot.com.es

    Un cordial saludo.

    ResponderEliminar
  4. Hola Meta! Por supuesto que me interesa!! te enlazo ya mismo ;) Gracias!

    ResponderEliminar
  5. Hola:

    No sabía que me habías respondido. Ahora mismo ya estás enlazado. Una Web muy bien trabajada.

    Muchas gracias y buen trabajo con el Servidor Web campeón.

    ResponderEliminar