Exponiendo nuestro sensor de temperatura y humedad

2013-04-08_21-26-18_738.jpg

En el último artículo dónde hablamos como construir un monitor de temperatura y humedad con tu Raspberry Pi, os dimos algunas ideas de que hacer con él y al final de dicha entrada os comentamos que habría una segunda entrada en la que veríamos como exponer los datos del sensor en nuestra red.

Si todas tus necesidades de monitorizar la temperatura y/o humedad están cubiertas con un simple trabajo cron, perfecto, tu Raspberry Pi posiblemente te será suficiente, pero si tus necesidades van más aĺlá, quizás necesites un sistema un poco más potente.

Como siempre en informática y sobre todo en programación hay mil maneras de hacer las cosas. En esta caso, para lograr nuestro objetivo me decidí a usar un servicio RESTful sobre la especificación JAX-RS de Java. Para ello necesitamos instalar Java en nuestro Raspberry Pi. Recordemos que estamos sobre Raspbian y una de las mejoras/limitaciones que éste introduce con respecto a Debian, es que Raspbian no soporta el cálculo de operaciones de coma flotante por software (soft-float), si no sólo por hardware (hard-float). Por ello si intentamos instalar una versión normal de Java SE o embebida no nos funcionará, pero Oracle en su versión 8 del Java embebido han creado una versión con soporte exclusivo de hard-float y esa será la que instalemos en nuestro RPi.

Los pasos a seguir serían los siguientes:

wget http://www.java.net/download/JavaFXarm/jdk-8-ea-b36e-linux-arm-hflt-29_nov_2012.tar.gz desde nuestro RPi. tar xvzf ~/jdk-8-ea-b36e-linux-arm-hflt-29_nov_2012.tar.gz sudo mkdir -p -v /opt/java sudo mv -v ~/jdk1.8.0 /opt/java rm ~/jdk-8-ea-b36e-linux-arm-hflt-29_nov_2012.tar.gz (Borramos el fichero que nos acabamos de bajar. Si queremos conservarlo omite este paso). sudo update-alternatives –install “/usr/bin/java” “java” “/opt/java/jdk1.8.0/bin/java” 1 sudo update-alternatives –set java /opt/java/jdk1.8.0/bin/java

Añadimos la JAVA_HOME a nuestro entorno y el directorio bin al PATH:

nano ~/.bashrc

Añadir al final:

export JAVA_HOME="/opt/java/jdk1.8.0" export PATH=$PATH:$JAVA_HOME/bin

CTRL-X para grabar y salir

Y si todo ha ido bien:

tuxotron@raspberrypi ~ $ java -version java version “1.8.0-ea” Java(TM) SE Runtime Environment (build 1.8.0-ea-b36e) Java HotSpot(TM) Client VM (build 25.0-b04, mixed mode)

Una vez tenemos Java instalado ahora toca instalar un servidor de aplicaciones que sirva nuestro servicio. Para ello me decidí instalar TomEE 1.5.1. Un servidor de aplicaciones muy ligero que cumple con la especificación JEE6. Éste no es más que un Tomcat con las implementaciones de Apache de las especificaciones de Java.

La instalación es muy sencilla:

wget http://www.apache.org/dyn/closer.cgi/openejb/openejb-4.5.1/apache-tomee-1.5.1-jaxrs.tar.gz tar xzvf apache-tomee-1.5.1-jaxrs.tar.gz

Para arrancar el servidor:

cd apache-tomee-jaxrs-1.5.1/bin/ ./startup.sh

Para probar que está funcionando, podemos abrir el navegador e ir a localhost:8080 (desde RPi) o RPi_IP:8080 (desde otra máquina de la red). Y nos debe aparecer algo así:

tomee.png

Ahora que ya tenemos que nuestro servidor de aplicaciones corriendo. Ahora toca bajarnos el código fuente del servicio RESTful. Para no instalar más herramientas en tu RPi y por temas de velocidad, recomiendo que esto lo hagáis desde un ordenador más potente. Para ello:

git clone git://github.com/tuxotron/rpiSensorRestful.git

Para compilar nuestro proyecto:

cd rpiSensorRestful mvn clean package

Una vez compilado el proyecto, copiamos nuestro fichero .war en el directorio webapps del servidor de aplicaciones:

scp target/rpitemperature.war {usuario}@{IP_RPi}:./apache-tomee-jaxrs-1.5.1/webapps

Y para terminar nos queda un último paso. Vamos a hacer que nuestra aplicación dht22 esté disponible en nuestro sistema. Vamos a copiar dicho fichero al directorio /usr/bin. Si prefieres puedes añadir al PATH el directorio dónde se encuentre éste.

sudo cp dht22 /usr/bin/

Y por último para evitar tener que user sudo para correr dicha aplicación (tendríamos que guardar la contraseña en la aplicación web de alguna forma), vamos a activar el sticky bit. Lo primero es hacer a root el dueño del fichero y luego cambiamos los permisos del mismo:

sudo chown root:root /usr/bin/dht22 sudo chmod u+s /usr/bin/dht22

Si todos los pasos han ido bien ya solo nos toca probar nuestro servicio. Para ello abre el navegador y ve a: http://ip_del_rpi:8080/rpitemperature/temperature

Y verás algo así:

xml.png

También lo puedes probar desde la línea de comandos:

curl -i http://192.168.1.31:8080/rpitemperature/temperature HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Date: Sun, 14 Apr 2013 13:35:26 GMT Content-Type: application/json Transfer-Encoding: chunked

{“sensorData”:{“humidity”:54.9,“success”:true,“temperature”:23.6}}

Como vemos, el servicio web devuelve 2 tipos de datos JSON y XML, dependiendo de la configuración de las cabeceras que le manda nuestro cliente (navegador, wget, curl, etc). Por ejemplo si queremos XML en vez de JSON usando curl:

curl -H “Accept: application/xml” -H “Content-Type: application/xml” -X GET http://192.168.1.31:8080/rpitemperature/temperature

Pues esto es todo. Como decía hay muchas formas de exponer un servicio en una red. Decidí usar un servicio RESTful, porque a día de hoy es “la forma más aceptada” para hacer esto. Y me decidí usar Java porque quería probar que tal iba la versión 8 con el soporte hard-float y también quería probar TomEE en el RPi. La verdad que el resultado me ha gustado y el RPi se mueve bastante rápido.