LINKDUINO: Embedded Web Server

.



Vamos a ver cómo aprovecharnos del pequeño httpd server que trae el router para nuestras propias páginas web. (Este server es el utilizado para alojar las páginas de configuración del router).

Las rutas para guardar las páginas web dentro de nuestro router són:
  • Estáticas       => /tmp/www/
  • Dinámicas     => /tmp/www/cgi-bin/
(Recordad que el script debe tener los permisos adecuados chmod +x /tmp/www/cgi-bin/yourscript.sh)
PARA PODER USAR CGI SCRIPTS, DEBES TENER UNA VERSIÓN DE DD-WRT ANTERIOR A DD-WRT V24 pre SP2 (svn 12533+), YA QUE HA SIDO INHABILITADO POR MOTIVO DE FALLO DE VULNERABILIDAD. TEN CUIDADO SI VAS A DAR CONECTIVIDAD AL EXTERIOR.

He subido las versiones de firmware que he utilizado:
Recuerda que si no tienes una versión DD-WRT en el router, primero se debe enviar el firmware de la versión mini y posteriormente cualquiera de las versiones mayores.



Linksys dispone de la siguiente utilidad soft para flashear el equipo LINKSYS TFTP



Todas las páginas alojadas en /tmp/ se encuentrar en la SDRAM , por lo que se perderán ante un reboot ó perdida de corriente del router. Para tenerlo de forma permanente, tendrás que tener el mod de SD ó tener un router con USB.


El CGI (Common Gateway Interface) define una manera para que un servidor web pueda delegar la generación de páginas web a una aplicación de consola. Es el método más simple de disponer contenido dinámico en un sitio web. Es decir, si ingresamos la URL http://ip_router/user/cgi-bin/test.sh, el servidor de nuestro router intentará ejecutar el archivo /tmp/www/cgi-bin/test.sh y retornará la salida de dicho script.

Veamos un ejemplo sencillo que muestra Hola Mundo!! y la fecha (obtenida del router). Creamos nuesto script en /tmp/www/cgi-bin/test.sh

#!/bin/sh
echo "<html><head><title>Test CGI"
echo "</title></head><body>"
echo "<h1>Hola Mundo</h1>"
echo "Hoy es $(date)"
echo "</body></html>"

Otorgamos permiso de ejecución  /tmp/www/cgi-bin # chmod +x test.sh
Abrimos nuestro Navegador http://ip_router/user/cgi-bin/test.sh

(Lo más rápido y sencillo es trabajar con WinSCP)






Ahora, veamos el ejemplo que siempre ponemos de encender/apagar un led, ya visto anteriormente aqui.
1) Crearemos una página web (html)


Código

<html>
<head>

</head>
<body link=red vlink=red alink=red>
<div style="text-align:center;">
<img src="/user/logo.jpg">

</div>
<br/>

<div style="text-align:center;">
<span style="font-size:x-large;">
<a href="/user/cgi-bin/led_on.sh">LED ON</a>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="/user/cgi-bin/led_off.sh">LED OFF</a>

</span>
</div>
<br/><br/><br/><br/>
<div style="color:blue;text-align:center;">
<span style="font-size:x-large;">
http://real2electronics.blogspot.com

</span></div>
</body>
</html>

Contiene una foto del logo y un par de links que apuntan a los scripts led_on.sh y led_off.sh


2) Crear el script: led_on.sh
#!/bin/sh
echo "S1F" > /dev/cua/1
echo "<HTML>"
echo "<HEAD>"
echo "<META HTTP-EQUIV=Refresh CONTENT=0;URL=/user/control.html>"
echo "</HEAD><BODY>"
echo "</BODY></HTML>"

El script envia la orden de encender por el puerto serie y redirecciona a la página principal (control.html).

3) Crear el script: led_off.sh
#!/bin/sh
echo "S0F" > /dev/cua/1
echo "<HTML>"
echo "<HEAD>"
echo "<META HTTP-EQUIV=Refresh CONTENT=0;URL=/user/control.html>"
echo "</HEAD><BODY>"
echo "</BODY></HTML>"

El script envia la orden de apagar por el puerto serie y redirecciona a la página principal (control.html).

4) Otorgamos permisos de ejecución a dichos scripts.

5) Deberíamos tener una estructura asi:



Veamos el resultado final con un video:









Ahora ya sólo imaginación.... ¿qué tal subir/bajar la puerta del garage mediante Wifi y un móvil?  Ya he probado a conectarme con mi nokia n85 y va perfecto!! ...je,je,je








.

13 comentarios:

  1. Para flashear el router, Linksys dispone de la siguiente utilidad TFTP software:
    http://cid-d2ee689f353f15bc.photos.live.com/self.aspx/P%c3%bablico/Tftp^J0.exe

    ResponderEliminar
  2. HOlaa! que buen proyecto, disculpa tendras el codigo del arduino para este ejemplo?

    evil.7.tools@gmail.com

    ResponderEliminar
  3. Hola tendras el codigo del arduino de este ejemplo

    ResponderEliminar
  4. Hola Evil,

    Es el usado en http://real2electronics.blogspot.com/2009/10/linksys-arduino.html


    Saludos!


    Igor

    ResponderEliminar
  5. hola igor , estube mirando este codigo y lo compile junto al codigo que tienes para ard y no encuentro la forma de comunicacion del html al serial, espero tu respuesta y gracias por estos aportes! Saludos!

    ResponderEliminar
  6. Si te fijas, en el html, cuando pulsas el icono llama a las scripts led_on.sh y led_off.sh. Ejemplo: LED ON

    En dichos scripts, es donde mandas la orden a Arduino, por ejemplo => echo "S1F" > /dev/cua/1


    Saludos

    ResponderEliminar
  7. Me ha cogido el html en mi post...je,je,je
    A ver si me deja ahora:
    < a href= "/user/cgi-bin/led_on.sh " > LED ON < /a >

    ResponderEliminar
  8. Hello,
    I'm french and only speak English.
    So i have a problem
    i create in my wrt54G :
    /tmp/www/
    /tmp/www/cgi-bin/
    and copy the file test.sh
    when i log in
    http://192.168.1.1/user/cgi-bin/test.sh
    nothing appear.

    When i reboot all the file in tmp/www disapear.

    Any idea.

    Daniel
    Strasbourg

    ResponderEliminar
  9. Yes,it's normal. I added the SD hack to the router to have permanently all the files.
    Check http://www.dd-wrt.com/wiki/index.php/JFFS

    Regards,

    Igor

    ResponderEliminar
  10. y porque no utlisas un html para enviar la orden?? tb se puede no en vez de usar un .sh

    ResponderEliminar
  11. buenas amigo en que parte y como se guarda, el programa hecho de control? se que si no queremos que se borre es en la mmc, pero en dado caso si es un programa pequeño en que parte y como se guardaria? gracias

    ResponderEliminar
    Respuestas
    1. Hola amigo puedes usar http://winscp.net/eng/download.php para windows o bien si trabajas con linux puedes usar scp

      scp [[usuario@]máquina:]ruta ... [[usuario@]máquina:]ruta
      por ejemplo:
      sudo scp /home/kyokorn/ejemplo.sh root@192.168.1.1;/opt/share/www/cgibin

      Salu2
      kyokorn

      Eliminar
  12. buenas, se podria realizar para un tp-link mr3020?. saludos

    ResponderEliminar