Internet de las cosas II: Conexión por web

En nuestro anterior artículo sobre Internet de las cosas, hablamos sobre como conectar nuestro arduino a Internet a través de una Raspberry PI; lo cual hacíamos a través de una consola SSH. Normalmente, este método no se suele utilizar ya que es algo engorroso. Normalmente se crea una interfaz web que nos permitirá de manera sencilla, controlar nuestro dispositivo con arduino. En este caso, vamos a crear una web a través de una interfaz CGI.

En primer lugar, vamos a utilizar el mismo montaje que usamos en el anterior artículo; os dejamos el esquema de Fritzing para que lo podáis ver.

iot1_bb

 

Con el montaje realizado, vamos a crear nuestra página web. para ello necesitaremos los paquetes anteriormente mencionados en el anterior artículo, y además instalaremos el servidor web Apache. para instalarlo, solo necesitaremos escribir en nuestra consola ssh(también podéis hacerlo desde la consola conectado fisicamente a la raspare) el siguiente comando:

sudo apt-get install apache2

una vez instalado, vamos a crear nuestra interfaz CGI. Pero antes vamos a explicar que es una interfaz CGI y como se configura en apache.

CGI (Common Gateway Interface) es una tecnología de la world Wide Web que permite intercambiar información entre el servidor web y un programa que se ejecutará desde este mismo. Esto nos permite ejecutar scripts tanto de perl, python,c , como de cualquier otro lenguaje ejecutable. En nuestro caso, vamos a utilizar CGI para ejecutar un script python que será quien se comunique con arduino.

esquemaCGI

 

Como podemos ver, vamos a utilizar el servidor web apache y por un script python, vamos a ejecutar una serie de acciones. Normalmente puede pensar el lector, que podemos usar directamente desde el script Python CGI, llamar a Arduino usando la librería pyserial; sin embargo, no podemos hacer eso ya que el script se ejecuta con el usuario que ejecuta el servidor web y tiene permisos limitados; además de que no es nada seguro dejar acceso casi de root desde una aplicación web. Es por ello, que vamos a utilizar un fichero temporal, que hará de mensajero entre el script CGI y el daemon que crearemos que simplemente leerá nuestro archivo creado y ejecutará las ordenes que haya en él; mandando dichas ordenes al arduino a través del USB.

 En primer lugar, vamos a configurar nuestro servidor apache para que acepte ejecuciones de CGI. Para ello, vamos a ir al siguiente archivo /etc/apache2/sites-avaiable/default en el cual vamos a ver el siguiente contenido:

 

	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
                </Directory>

En dicho fragmento, podemos ver en las opciones una opción especial; esta opción, indica que en dicho directorio, se ejecutarán los scripts CGI. Si no esta dicha opción, la añadiremos y guardaremos dicho archivo. Por último, reiniciaremos el servidor apache con la siguiente orden:

 

 sudo service apache2 restart

Si todo ha ido correctamente, podemos pasar al siguiente paso, que es escribir la página web que utilizaremos para mandar la información al script CGI. En este caso, solo vamos a crear una página web sencilla con un pequeño Formulario dentro:

Captura de pantalla 2014-12-21 a las 13.00.42

Este código tan sencillo, simplemente muestra un formulario el cual nos permitirá mandar la información de este al script cgi-bin/iot.py En este fichero, será donde se ejecutará python y realizará las tareas pertinentes. Seguidamente crearemos dicho archivo. Recordemos que debe estar en el directorio /var/www/cgi-bin de nuestra Raspberry PI.

Con todo ya listo, vamos a crear este nuevo archivo:

#! /usr/bin/env python
import cgi, cgitb
 
import os.path
 
temp ='/tmp/tempfile'
 
while os.path.isfile(temp):
	continue #Espera
 
 
form = cgi.FieldStorage();
 
ocho=form.getvalue('ocho')
nueve=form.getvalue('nueve')
diez=form.getvalue('diez')
f = open(temp,'w')
 
 
if ocho:
	f.write("8H\n")
else:
	f.write("8L\n")
if nueve:
	f.write("9H\n")
else:
	f.write("9L\n")
if diez:
	f.write("0H\n")
else:
	f.write("0L\n")
 
f.close()
print "Content-Tyoe: text/html;charset=utf-8"
print "\n\n"
print "OK"

En este caso, simplemente recibimos la información del formulario y en función de si este esta activo o no,  escribimos en el fichero temporal para que lo reciba el daemon de python. Notese el bucle while que simplemente realiza una espera mientras exista el fichero ya que puede ser que el daemon lo este leyendo. Si no existe este fichero, el script escribe los datos en función de la información  obtenida desde el formulario. Con este código ya tenemos lista la parte de comunicación de CGI y el servidor apache. Si todo va bien, si ejecutamos el formulario entrando a la dirección: http://<direccionRaspberryPI>/iot.html mostraría el formulario y si lo enviamos, debería de mostrar un mensaje de OK.

La siguiente parte, es crear el daemon que esperará hasta que haya información en el fichero.Lo llamaremos iotdaemon.py

import serial
import os.path
 
 
temp ='/tmp/tempfile'
arduino = serial.Serial('/dev/ttyACM0',9600)
while True:
	if os.path.isfile(temp):
		f= open(temp)
 
		ocho = f.readline()
		nueve=f.readline()
		diez=f.readline()
		arduino.write(ocho)
		arduino.write(nueve)
		arduino.write(diez)
		f.close()
		os.remove(temp)
arduino.close()

En este caso, simplemente leemos la información del fichero y usando la librería Serial, mandamos dicha información a nuestro Arduino. Con este último código, ya tenemos todo listo para ejecutar nuestro ejemplo de Internet de las cosas a través de Web. Simplemente tenemos que ejecutar nuestro daemon para poder probarlo. Para ello, simplemente ejecutamos este script:

sudo iotdaemon.py &

Con todo esto listo, vamos a probar el resultado de estos trabajos. Para ello, simplemente ejecutamos la misma operación para probar si funciona el script CGI. Sin embargo, ahora al estar ejecutados el daemon, se leerá la información del fichero y se mandará al arduino por USB.

Seguidamente se muestra un vídeo de como funcionaría este ejemplo:

Pues esto ha sido todo; para este segundo tutorial sobre Internet de las cosas. En el próximo Artículo sobre Internet de las cosas, vamos a conectar a través de internet 2 dispositivos utilizando arduino Yun una placa que nos permite realizar la conexión de manera muy fácil.

9 Comments on "Internet de las cosas II: Conexión por web"

  1. Guillermo Sarmiento | Febrero 28, 2017 en 11:15 pm | Responder

    hola

    me carga también todo el código cuando le digo enviar que podría ser?, en este caso estoy usando una raspberry pi 3 he configurado un archivo que es el 000-default.conf también lo pre cargue en el de apache2.conf pero sigo sin tener exito me podrían orientar mejor?

    • administracion | Marzo 1, 2017 en 4:45 pm | Responder

      Hola Guillermo:

      Lo que te pasa pueden ser por varias cosas… la mas comun es que no tengas activado en tu apache que ejecute scripts. Comprueba la configuración de tu servidor web para que pueda ejecutar scripts python en este caso.

  2. Hola :
    He realizado todo lo que comentas paso a paso y no he tenido exito.La paguina html se carga,pero al pulsar en “enviar”,es como si no se ejecutara el iot.py,mostrandome en el navegador todo el codigo del archivo.Ando un poco perdido y agradeceria saver por que no se ejecuta el programa iot.py.Gracias.

    • Hola; has comprobado que tienes correctamente configurado apache para que ejecute CGI? compruébalo en tu archivo apache.conf y mira que este todo bien configurado.

      Además comprueba que tienes python; bien instalado. La versión que usamos fue la 2.7.

      Cualquier duda ya nos comentas.

      Un saludo.

  3. Buenisimo el tutorial, se podría una una base de datos mysql para guardar los eventos? y si tiene algún tutorial sobre eso.
    Muchas gracias

    • Una vez recibido dicho evento, puedes hacer lo que quieras incluso guardarlo en una base de datos. Por ejemplo puedes tener un sensor, y guardarlo en una tabla los datos de este y seguidamente mostrarlos en una web y poder consultarlos.

      P ej: un sensor de temperatura y ver la temperatura a lo largo del tiempo.

      • Correcto tienes razón, y dime si tengo sensores de movimiento PIR en tres zonas diferentes, debo tener tres arduinos para cada uno? de esa manera guardo los eventos en la tabla.

        Muchas gracias por la respuesta

        • En Principio si puedes hacer que los sensores manden los datos al propio arduino puedes incluso usar uno para mandar los datos de los sensores a la raspberry Pi. Pero claro para eso tienes que saber como mandar los datos del sensor al arduino.

Deja un comentario.

Tu dirección de correo no será publicada.


*


*