Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sistema Autónomo de Monitorización Meteorológica Con Emisión de Informes Periódicos
Sistema Autónomo de Monitorización Meteorológica Con Emisión de Informes Periódicos
i
ii
Agradecimientos
A mi madre y a mi hermana que me han apoyado durante todos estos años, sin
vosotras no lo habría conseguido.
Por último, también quiero agradecer todo el cariño de mis amigos, mi segunda
familia, y a mis compañeros de la Universidad que se han convertido en grandes
amistades, en especial a Avelino.
Gracias a todos.
iii
iv
Resumen
En este Trabajo de Fin de Grado se ha construido una estación meteorológica
que recoge datos de sus sensores y los envía a un servidor mediante conectividad WiFi.
Por último, el cliente Web permite manejar todas las funciones del sistema
empleando la API REST desarrollada. Se pueden consultar los datos de la estación
meteorológica de forma gráfica y configurar sus parámetros de transmisión.
Palabras clave
Arduino, Raspberry Pi, WiFi, REST, MongoDB, estación meteorológica, Javascript,
Node.js.
v
vi
Índice general
1. Introducción .................................................................................................................. 1
1.1. Motivación y Contexto .......................................................................................... 1
1.2. Objetivo del Trabajo de Fin de Grado ................................................................... 2
1.3. Planificación del proyecto ..................................................................................... 3
1.4. Acerca del software de este trabajo ....................................................................... 6
1.5. Estructura de la memoria ....................................................................................... 6
2. Estudio del estado del arte ............................................................................................ 9
2.1. Introducción ........................................................................................................... 9
2.2. Tecnologías de comunicación inalámbricas .......................................................... 9
2.2.1. GPRS ............................................................................................................... 9
2.2.2. WiFi ............................................................................................................... 11
2.2.3. ZigBee ........................................................................................................... 13
2.2.4. 6LoWPAN..................................................................................................... 14
2.2.5. Bluetooth LE ................................................................................................. 15
2.3. Dispositivos basados en microcontroladores ....................................................... 15
2.3.1. Raspberry Pi, Odroid, CubieBoard y derivados ............................................ 16
2.3.2. Arduino.......................................................................................................... 17
2.3.3. Zigduino ........................................................................................................ 18
2.3.4. Waspmote ...................................................................................................... 19
2.3.5. Teensy ........................................................................................................... 20
2.3.6. Freescale Boards ........................................................................................... 21
2.4. Conclusión ........................................................................................................... 21
3. Análisis de requisitos .................................................................................................. 23
3.1. Servicio REST ..................................................................................................... 23
3.2. Estación meteorológica ........................................................................................ 23
3.2.1. Casos de uso...................................................................................................... 24
3.2.2. Selección de hardware ...................................................................................... 26
3.3. Cliente web .......................................................................................................... 28
3.3.1. Autenticación .................................................................................................... 28
vii
3.3.2. Casos de uso...................................................................................................... 28
4. Diseño del servicio REST .......................................................................................... 35
4.1. Introducción ......................................................................................................... 35
4.2. Base de datos ....................................................................................................... 36
4.3. API del servicio ................................................................................................... 38
5. Implementación y prueba del servicio ........................................................................ 39
5.1. Dependencias ....................................................................................................... 39
5.2. Pruebas ................................................................................................................. 39
5.3. Funcionamiento ................................................................................................... 40
6. Diseño e integración de la estación meteorológica .................................................... 43
6.1. Testeo de los componentes .................................................................................. 43
6.1.1. Sensor BMP180 ................................................................................................ 43
6.1.2. Sensor DHT22 .................................................................................................. 46
6.2. Diseño de la estación meteorológica ................................................................... 50
6.3. Programación e integración ................................................................................. 53
7. Estudio del consumo energético de la estación meteorológica .................................. 55
7.1. Descripción del estudio ........................................................................................ 55
7.2. Consumo energético ............................................................................................ 56
7.2.1. Consumo energético en modo de bajo consumo............................................... 56
7.2.2. Consumo energético de la estación meteorológica en funcionamiento ............ 57
7.2.3. Consumo energético total ................................................................................. 58
7.3. Posibles mejoras para reducir el consumo ........................................................... 58
8. Desarrollo de la aplicación web.................................................................................. 61
8.1. Tecnologías empleadas ........................................................................................ 61
8.2. Autenticación ....................................................................................................... 61
8.3. Funciones de la aplicación web ........................................................................... 62
9. Conclusiones y trabajo futuro ..................................................................................... 71
9.1. Conclusiones ........................................................................................................ 71
9.2. Trabajo futuro ...................................................................................................... 72
A. API del servicio REST .............................................................................................. 73
B. Instalación del software en una Raspberry Pi ............................................................ 87
viii
Bibliografía ..................................................................................................................... 91
ix
x
Índice de tablas
Tabla 1: Planificación temporal del proyecto. .................................................................. 3
Tabla 2: Coste del hardware necesario. ............................................................................ 3
Tabla 3: Velocidades de descarga y de subida de los sistemas GPRS. .......................... 10
Tabla 3: Consumo energético del módulo SM5100B. ................................................... 11
Tabla 4. Consumo energético de la Shield Wizfi210 ..................................................... 12
Tabla 5: Representación de 6LoWPAN en el modelo OSI. ........................................... 14
Tabla 6: Consumo energético de Waspmote. ................................................................. 19
Tabla 7: Comparativa de precios entre Arduino y Waspmote........................................ 20
Tabla 8: Caso de uso 01. ................................................................................................. 25
Tabla 9: Caso de uso 02. ................................................................................................. 26
Tabla 10: Hardware seleccionado................................................................................... 26
Tabla 11: Caso de uso 03................................................................................................ 29
Tabla 12: Caso de uso 04................................................................................................ 30
Tabla 13: Caso de uso 05................................................................................................ 30
Tabla 14: Caso de uso 06................................................................................................ 30
Tabla 15: Caso de uso 07................................................................................................ 31
Tabla 16: Caso de uso 08................................................................................................ 31
Tabla 17: Caso de uso 09................................................................................................ 32
Tabla 18: Caso de uso 10................................................................................................ 32
Tabla 19: Caso de uso 11 ................................................................................................ 32
Tabla 20: Caso de uso 12................................................................................................ 33
Tabla 21: Caso de uso 13................................................................................................ 33
Tabla 22: Caso de uso 14................................................................................................ 33
Tabla 23: Grupos de usuarios. ........................................................................................ 36
Tabla 24: Esquema de la colección Group. .................................................................... 36
Tabla 25: Esquema de la colección User. ....................................................................... 36
Tabla 26: Esquema de la colección Person. ................................................................... 37
Tabla 27: Esquema de la colección Station. ................................................................... 37
Tabla 28: Esquema de la colección Sample. .................................................................. 37
Tabla 29: Consumo energético en modo de bajo consumo. ........................................... 56
Tabla 30: Consumo energético en funcionamiento. ....................................................... 57
Tabla 31: Función GET /v1/login. .................................................................................. 73
Tabla 32: Función GET /v1/groups. ............................................................................... 74
Tabla 33: Función GET /v1/groups/:groupName. .......................................................... 75
Tabla 34: Función GET /v1/groups/:groupName/users.................................................. 75
Tabla 35: Función GET /v1/stations. .............................................................................. 76
Tabla 36: Función GET /v1/stations/:MAC. .................................................................. 77
Tabla 37: Función GET /v1/stations/:MAC/data............................................................ 78
xi
Tabla 38: Función GET /v1/stations/:MAC/data/:id. ..................................................... 79
Tabla 39: Función DELETE /v1/stations/:MAC/data/:id. .............................................. 79
Tabla 40: Función GET /v1/users. .................................................................................. 80
Tabla 41: Función POST /v1/users. ................................................................................ 81
Tabla 42: Función PUT /v1/users/:login. ....................................................................... 82
Tabla 43: Función DELETE /v1/users/:login. ................................................................ 82
Tabla 44: Función POST /v1/stations. ............................................................................ 83
Tabla 45: Función DELETE /v1/stations/:MAC. ........................................................... 84
Tabla 46: Función PUT /v1/stations/:MAC. .................................................................. 85
Tabla 47: Función POST /v1/stations/:MAC/data. ........................................................ 85
Tabla 48: Contenido del fichero rest.service. ................................................................. 88
Tabla 49: Contenido del fichero web.service. ................................................................ 89
xii
Índice de Figuras
Figura 1: Esquema del sistema. ........................................................................................ 2
Figura 2: Planificación inicial del proyecto. ..................................................................... 4
Figura 3: Seguimiento del proyecto. ................................................................................ 5
Figura 5: Raspberry Pi B+ vs Odroid C1. ...................................................................... 16
Figura 6: Arduino UNO R3. ........................................................................................... 17
Figura 7: Zigduino. ......................................................................................................... 18
Figura 8: Waspmote ....................................................................................................... 19
Figura 9: Teensy. ............................................................................................................ 20
Figura 10: Freescale KL25Z. .......................................................................................... 21
Figura 11: Diagrama de flujo del funcionamiento de la estación. .................................. 24
Figura 12: Casos de uso de la estación. .......................................................................... 25
Figura 13: ESP8266. ....................................................................................................... 27
Figura 14: Adafruit CC3000 instalado en un Arduino Uno. .......................................... 27
Figura 15: Casos de uso correspondientes a los roles de usuario normal y de
administrador. ................................................................................................................. 29
Figura 16: Ejecución de los tests. ................................................................................... 40
Figura 17: Ejemplo de consulta de la API empleando Postman. ................................... 41
Figura 18: Sistema de logs empleando Scribe-JS........................................................... 42
Figura 19: BMP180 conectado a un Arduino Uno. ........................................................ 43
Figura 20: Montaje físico del sensor BMP180. .............................................................. 44
Figura 21: Código de prueba para el sensor BMP180. ................................................... 45
Figura 22: Salida serial del sensor BMP180. ................................................................. 46
Figura 23: DHT22 conectado a un Arduino Uno. .......................................................... 47
Figura 24: Montaje físico del sensor DHT22. ................................................................ 48
Figura 25: Código de prueba para el sensor DHT22. ..................................................... 49
Figura 26: Salida serial del sensor DHT22. .................................................................... 50
Figura 27: Conexiones de la Shield CC3000. ................................................................ 51
Figura 28: Sensores y led soldados a la Shield CC3000. ............................................... 52
Figura 29: Estación meteorológica. ................................................................................ 53
Figura 30: Logs de la estación meteorológica enviando muestras. ................................ 54
Figura 31: Agilent N6705B. ........................................................................................... 55
Figura 32: Medición del consumo energético de la estación meteorológica. ................. 56
Figura 33: Consumo energético en modo de bajo consumo. .......................................... 57
Figura 34: Consumo energético de la estación en funcionamiento. ............................... 58
Figura 35: Hardware de la estación meteorológica mejorado. ....................................... 59
Figura 36: Panel de login de la aplicación web. ............................................................. 62
Figura 37: Estaciones meteorológicas registradas en el sistema. ................................... 63
Figura 38: Panel para dar de alta una nueva estación. .................................................... 63
xiii
Figura 39: Representación gráfica de los valores de la presión atmosférica. ................. 64
Figura 40: Representación gráfica de la variación de la temperatura. ............................ 65
Figura 41: Visualización en texto plano de todas las muestras de la estación. .............. 65
Figura 42: Parámetros de configuración de la estación. ................................................. 66
Figura 43: Visualización de los usuarios del sistema. .................................................... 67
Figura 44: Añadir un usuario al sistema. ........................................................................ 67
Figura 45: Visualización de los datos de un usuario. ..................................................... 68
Figura 46: Grupos del sistema. ....................................................................................... 69
Figura 47: Usuarios del grupo User................................................................................ 69
xiv
Capítulo 1
Introducción
1.1. Motivación y Contexto
Los gobiernos de multitud de países los emplean en las carreteras para recoger
información ambiental e informar a los conductores de posibles riesgos.
En el mundo empresarial se pueden observar este tipo de dispositivos en forma
de termostato para regular la temperatura de una sala, CPD, industria, etc…
Empresas que trabajan en el propio sector o que las emplean directamente para
procesar datos ambientales y realizar investigaciones.
Para uso privado, en el hogar.
Cada vez es más común incluir este tipo de sensores en otros dispositivos, como
por ejemplo, los automóviles. En la actualidad, muchos vehículos son capaces
de encender automáticamente las luces de cruce, activar los limpiaparabrisas,
encender las luces de niebla, detectar colisiones, etc… que no serían posibles de
no ser por los sensores correspondientes.
1
1.2. Objetivo del Trabajo de Fin de Grado
2
1.3. Planificación del proyecto
Los costes del proyecto son todos debidos al hardware, en la tabla 2 se muestran
los precios de todo el hardware necesario para la realización de este trabajo. El coste
total del hardware utilizado fue de 78,16 €.
3
Figura 2: Planificación inicial del proyecto.
4
Figura 3: Seguimiento del proyecto.
5
1.4. Acerca del software de este trabajo
2. Estudio del estado del arte: En este capítulo se realiza una investigación sobre
las tecnologías actuales de comunicación inalámbrica y las placas basadas en
microcontroladores. También, se realiza una valoración de las características de
cada una y finalmente se escoge la tecnología de comunicación inalámbrica y el
microcontrolador a emplear en el proyecto.
6
7. Estudio del consumo energético de la estación meteorológica: En este
capítulo se realiza un análisis del consumo energético empleando un analizador
de potencia Agilent N6705B.
A. API del servicio REST: En este apéndice se detalla en profundidad la API del
servicio REST.
7
8
Capítulo 2
1. Consumo energético.
2. Coste.
3. Conocimientos sobre la tecnología y dificultad de despliegue.
4. Alcance.
5. Seguridad.
2.2.1. GPRS
General Packet Radio Service (GPRS) [1] es una extensión del Sistema Global
para Comunicaciones Móviles (Global System for Mobile Communications o GSM)
para la transmisión de datos mediante conmutación de paquetes.
9
Habitualmente, las transferencias de datos empleando GPRS se cobran por
megabytes de transferencia, mientras que el pago de la comunicación tradicional
mediante conmutación de circuitos se cobra por tiempo de conexión,
independientemente de si el usuario está utilizando el canal o no.
10
En la siguiente tabla se muestran los consumos típicos del módulo GSM/GPRS
SM5100B [2]:
Existen otras alternativas como Arduino GSM Shield, SIM900 o CC3000, que
tienen consumos similares. En cuanto al coste, los precios parten de los 50€ por módulo.
2.2.2. WiFi
11
situación afecta especialmente a las conexiones de larga distancia (más de 100 metros).
En realidad, el estándar WiFi está diseñado para conectar ordenadores a la red a
distancias reducidas, cualquier uso de mayor alcance está expuesto a un excesivo riesgo
de interferencias.
Una Shield interesante es Wizfi210 [6], que está basada en comunicaciones serie
y es compatible con Arduino y clones. Soporta redes WiFi 802.11n, alcanza hasta 11
Mbps y es compatible con todos los tipos de cifrado (e.g. WEP y WPA/WPA2-PSK).
También dispone de un conector coaxial para una antena externa (lo que lleva asociado
una mejora de la cobertura y, por lo tanto, del consumo energético) y soporta los
protocolos de red más habituales, entre ellos, HTTP y HTTPS.
Standby 34.0 µA
Receive 125.0 mA
Transmit 135.0 mA
Tabla 5. Consumo energético de la Shield Wizfi210
12
2.2.3. ZigBee
Las redes ZigBee han sido diseñadas para conservar la potencia en los nodos
“esclavos”. De esta forma se consigue un bajo consumo de energía.
13
2.2.4. 6LoWPAN
6LoWPAN (IPv6 over Low Power Wireless Personal Area Networks) [10] es un
estándar que posibilita el uso de IPv6 sobre redes basadas en el estándar IEE 802.15.4.
Hace posible que dispositivos como los nodos de una red inalámbrica puedan
comunicarse directamente con otros dispositivos IP.
Junto con este estándar surge otro protocolo conocido como CoAP (Constrained
Application Protocol) [11] que permite que los dispositivos se comuniquen con
servicios REST, utilizando UDP como capa de transporte. CoAP presenta una API
idéntica a REST-HTTP, es decir, el conjunto de operaciones CRUD (Create, Read,
Update y Delete), pero el transporte se realizar sobre el protocolo UDP, no orientado a
conexión y no fiable.
14
Existe una plataforma conocida como Waspmote Mote Runner 6LoWPAN
Development Platform [12] pensada para este tipo de aplicaciones. Por desgracia, los
kits Waspmote son bastante caros.
2.2.5. Bluetooth LE
15
2.3.1. Raspberry Pi, Odroid, CubieBoard y derivados
Los dispositivos Odroid suelen tener una mayor potencia de cómputo a cambio
de incrementar el precio final. Los periféricos de la Raspberry Pi suelen ser compatibles
con los módulos Odroid e incluso tiene periféricos propios. En cuanto a la comunidad,
no tiene tanta presencia como la de la Raspberry Pi.
Esta serie de dispositivos nos otorgan una gran versatilidad en cuanto a potencia
de cómputo, software, periféricos, etc… pero su punto débil es el consumo energético.
Por ejemplo, la Raspberry Pi A con un precio de 23 € tiene un consumo medio de unos
400 mAh.
16
2.3.2. Arduino
Arduino [18] es una plataforma de hardware libre, basada en una placa con un
microcontrolador y un entorno de desarrollo. Existe una gran variedad de modelos, que
se adaptan a las necesidades según el tamaño, potencia de cómputo, número de
periféricos, consumo energético, etc…
Arduino Uno.
Arduino Due.
Arduino Yún.
Arduino Nano.
Arduino Mega.
17
El entorno de programación de Arduino permite utilizar diversas librerías que
facilitan las tareas de desarrollo. Como lenguaje de programación se emplea Processing,
un lenguaje de programación de alto nivel similar a C++.
En cuanto al consumo energético, los Arduino más básicos, suelen consumir unos
40 mA y pueden emplear modos de bajo consumo para reducir esa cifra. El precio
oficial de estos dispositivos oscila entre los 15 y los 90 €, aunque existen modelos
clónicos, a partir de 2 €.
2.3.3. Zigduino
Figura 6: Zigduino.
Este dispositivo puede ser una gran alternativa a Arduino si nos decantamos por
ZigBee o 6LoWPAN en cuanto a tecnología de comunicación inalámbrica ya que viene
integrada en el dispositivo, permitiendo reducir costes y facilitando la programación. Su
precio es de unos 70 € y posee un consumo energético similar al de Arduino.
18
2.3.4. Waspmote
Figura 7: Waspmote
Consumo energético
ON 15 mA
Sleep 55 μA
Deep Sleep 55 μA
Hibernate 0.07 μA
Tabla 7: Consumo energético de Waspmote.
19
La plataforma Waspmote es software libre pero posee un precio algo mayor que
Arduino ya que está destinada a un ambiente más profesional. La siguiente tabla
muestra una comparativa de precios.
2.3.5. Teensy
Figura 8: Teensy.
La carga del programa se realiza mediante el cable USB y permite cargar
programas escritos en C. Su precio oscila entre los 10 y los 20 €, con unas capacidades
de cómputo similares a las de Arduino. Su consumo energético es similar al de Arduino.
20
Una desventaja es la falta de documentación sobre esta plataforma hardware y la
limitada comunidad de usuarios que posee.
2.4. Conclusión
21
totalmente como tecnología de comunicación inalámbrica para el prototipo
del proyecto.
6LoWPAN es una tecnología prometedora y que requeriría un trabajo de
investigación y un profundo conocimiento del estándar IEEE 802.15.4.
Además, sería necesario un Gateway 6LoWPAN que gestione las
comunicaciones entre las estaciones meteorológicas y el servidor REST.
Bluetooth LE posee características deseables como bajo coste y bajo
consumo energético pero presenta dos problemas: programación algo
compleja y requiere de un nodo receptor que trabaje como Gateway.
ZigBee posee un consumo energético mucho más eficiente que WiFi y lo
hace idóneo para el prototipo. No obstante, los módulos ZigBee también
requieren de un nodo receptor que funcione como Gateway y, a día de hoy,
no es una tecnología inalámbrica tan extendida como lo son Bluetooth LE o
WiFi. Debido a esto, y como se va a realizar un prototipo, no la versión final
de un posible producto, se empleará WiFi como tecnología de comunicación
inalámbrica.
Las placas Freescale, como la KL25Z, pueden ser una buena elección ya que
tienen un bajo coste, en cambio el IDE Keil es de pago y tiene una serie de limitaciones
para el desarrollo del proyecto. Ante esto y que la programación es en ensamblador
ARM y C, el desarrollo resultará más complejo y tedioso que en otras plataformas, por
lo que se descarta como opción.
22
Capítulo 3
Análisis de requisitos
3.1. Servicio REST
El servicio REST será el modelo del sistema e implementará todas las funciones
y políticas de seguridad necesarias para el correcto funcionamiento del sistema. Las
peticiones REST tendrán autenticación básica [24] empleando la cabecera propia del
protocolo HTTP. Los usuarios del sistema emplearán su login y contraseña, mientras
que las estaciones meteorológicas utilizaran su MAC (o identificador único) y como
contraseña la MAC al revés.
23
Figura 10: Diagrama de flujo del funcionamiento de la estación.
Bajo coste.
Exactitud y precisión en las mediciones.
Comunicaciones inalámbricas seguras.
24
Figura 11: Casos de uso de la estación.
25
Secuencia normal: Paso Acción
1 La estación meteorológica envía una petición REST para
solicitar su configuración actual.
2 El servidor REST responde con la configuración de la
estación en formato JSON.
3 La estación meteorológica procesa la configuración y
actualiza sus valores si es necesario.
Excepciones: Paso Descripción
1 Fallo en la conexión.
2 Petición errónea.
3 La configuración JSON tiene un formato inválido.
Tabla 10: Caso de uso 02.
Elemento Precio
Adafruit CC3000 WiFi Shield 39,95 €
SMA to uFL/u.FL/IPX/IPEX RF Adapter Cable 3,95 €
Antena 2.4 GHz de 2.2 dBi 9,90 €
Arduino UNO R3 ATmega328 Compatible 3€
Sensor de temperatura y humedad DHT22 4,36 €
Sensor de presión atmosférica BMP180 10,90 €
Coste total 72,06 €
Tabla 11: Hardware seleccionado.
Como Shield WiFi nos hemos decantado por la solución de Adafruit, ya que
fabrica hardware de gran calidad, tiene un buen soporte software con tutoriales y
dispone de una buena comunidad.
Una gran alternativa habría sido emplear un ESP8266 [25] (ver Fig. 10). Este
pequeño módulo WiFi cuenta con una gran potencia de cómputo ya que dispone de una
CPU de 32 bits que puede ser programada directamente, sin necesidad de depender de
un Arduino para controlarla. Además, tiene un consumo reducido y un coste de unos 7 €
por unidad. Por otro lado, es un producto que cuenta con un software inmaduro y
errático, pero con un futuro prometedor.
26
Figura 12: ESP8266.
Debido al estado del software del ESP8266, nos decantamos por emplear la
placa Adafruit CC3000, debido a su facilidad de uso y el soporte con el que cuenta.
La Shield Adafruit CC3000 [26] (ver Fig. 11) que seleccionamos no cuenta con
antena integrada, por lo que necesita un adaptador y una antena.
27
3.3. Cliente web
3.3.1. Autenticación
28
Figura 14: Casos de uso correspondientes a los roles de usuario normal y de administrador.
CU: 03 Autenticación.
Descripción: Comprueba que un usuario está dado de alta en el sistema y crea
una sesión.
Precondición:
Secuencia normal: Paso Acción
1 El usuario ingresa su nombre de usuario y contraseña.
2 El sistema autentica al usuario.
3 El usuario accede al sistema y puede realizar
determinadas acciones según el grupo al que pertenezca.
Excepciones: Paso Descripción
2 Usuario y/o contraseña incorrectos.
Tabla 12: Caso de uso 03.
29
registradas en el sistema.
Precondición: El usuario debe estar autenticado.
Secuencia normal: Paso Acción
1 El sistema devuelve una lista con las estaciones
meteorológicas registradas.
Excepciones: Paso Descripción
1 No hay estaciones registradas en el sistema.
Comentarios: La información que se obtiene incluye algunos datos como
pueden ser: nombre de la estación, localización, fecha de
registro, etc…
Tabla 13: Caso de uso 04.
30
CU: 07 Registrar una estación meteorológica.
Descripción: Registra en el sistema una estación meteorológica.
Precondición: El usuario debe estar autenticado y tener permisos de
administrador.
Secuencia normal: Paso Acción
1 Se completa un formulario con los datos de la estación y
se emplea la MAC como identificador único de la
estación.
2 El sistema registra la estación meteorológica permitiendo
almacenar las muestras que envía.
Excepciones: Paso Descripción
1 La estación ya está registrada.
Tabla 16: Caso de uso 07.
31
3 Los parámetros superan los umbrales de configuración.
Comentarios: La estación meteorológica obtendrá los nuevos parámetros de
configuración la próxima vez que envíe datos al sistema.
Tabla 18: Caso de uso 09.
32
umbrales del sistema.
Tabla 21: Caso de uso 12.
33
34
Capítulo 4
35
4.2. Base de datos
Group
Nombre del campo Tipo de datos Características
groupName String trim, unique, index, required
privilegeLevel Number min: 0, required
Tabla 25: Esquema de la colección Group.
Las estaciones meteorológicas se van a modelar como un usuario del sistema
perteneciente al grupo de las estaciones meteorológicas y con otro nivel de privilegio.
De este modo, la función login será la misma para usuarios y estaciones. Para ello, será
necesario crear una colección padre que englobe a los usuarios y a las estaciones (ver
Tabla 25):
User
Nombre del campo Tipo de datos Características
_type String Required
Login String unique, index, trim, required
password String Required
groups Array
ref: ‘Group’ Schema.ObjectId required
Data String required
Tabla 26: Esquema de la colección User.
36
La colección User contiene la estructura básica del documento y surgen dos
tipos distintos a partir de ella (ver Tablas 26 y 27):
Person
Nombre del campo Tipo de datos Características
_type String required, default: ‘Person’
Login String unique, index, trim, required
Password String required
Groups Array
ref: ‘Group’ Schema.ObjectId required
Data
name String trim, required
secondName String trim, required
dateOfBirth Date required
Tabla 27: Esquema de la colección Person.
Station
Nombre del campo Tipo de datos Características
_type String required, default: ‘Station
Login String unique, index, trim, required
password String required
Groups Array
ref: ‘Group’ Schema.ObjectId required
Data
location String trim, required
dateOfRegistration Date default:now,
required
wifi String trim, required
wifiPassword String trim, required
Ip String trim, required
Port Number required
Interval Number required
Tabla 28: Esquema de la colección Station.
Finalmente, falta por definir cómo se modelarán los datos (muestras) de las
estaciones meteorológicas (ver Tabla 28).
Sample
Nombre del campo Tipo de datos Características
MAC String trim, required
sampleDate Date default: now, required
samples []
Tabla 29: Esquema de la colección Sample.
37
La MAC del módulo WiFi servirá como identificador de la estación
meteorológica. En caso de que haya diferentes tecnologías de comunicación inalámbrica
no habrá problemas ya que otras tecnologías como ZigBee o Bluetooth también
disponen de una MAC.
La API del servicio REST (ver Apéndice A) se ha diseñado para que sea
versionable y requieran autenticación todas sus funciones. El código fuente del servicio
REST puede ser consultado en el repositorio de código del autor.
38
Capítulo 5
5.2. Pruebas
39
Figura 15: Ejecución de los tests.
5.3. Funcionamiento
40
Figura 16: Ejemplo de consulta de la API empleando Postman.
41
Figura 17: Sistema de logs empleando Scribe-JS.
42
Capítulo 6
El circuito es muy sencillo (ver Figura 19), tan sólo necesita 4 conexiones: VCC,
GND, SDA y SCL.
43
A continuación podemos ver el montaje físico realizado empleando una
protoboard (ver Figura 20).
Para obtener los valores del sensor BMP180 emplearemos la librería de Adafruit
“Adafruit_BMP085“, que es software libre (ver Figura 21).
44
Figura 20: Código de prueba para el sensor BMP180.
45
Figura 21: Salida serial del sensor BMP180.
46
Figura 22: DHT22 conectado a un Arduino Uno.
47
Figura 23: Montaje físico del sensor DHT22.
48
Figura 24: Código de prueba para el sensor DHT22.
49
Compilamos y cargamos el programa empleando el IDE de Arduino y
obtendremos las lecturas a través del puerto serie (ver Figura 26).
Para evitar el uso de una protoboard y las malas conexiones de los cables debido
a movimientos, decidimos soldar los cables y los sensores encima de la Shield CC3000
acoplada al Arduino Uno (ver Figura 14). Además soldaremos un led para indicar la
actividad de la estación: encendiéndose en caso de actividad, parpadeando en caso de
error y apagado el resto del tiempo. En un montaje final se suprimiría este led debido a
su elevado consumo energético, pero en cambio resultará muy útil para el desarrollo y
prueba de la estación meteorológica.
50
Los cables se soldaron por debajo de la Shield CC3000 (ver Figura 27) por
motivos de estética, dejando solamente visibles los dos sensores y el led encima de la
Shield CC3000 (ver Figura 28).
51
Figura 27: Sensores y led soldados a la Shield CC3000.
52
Finalmente este es el aspecto de nuestra estación meteorológica (ver Figura 29):
53
La estación meteorológica sigue el algoritmo la Sección 3.2 (ver Figura 11) y
emplea las siguientes funciones del API (ver Apéndice A):
54
Capítulo 7
55
Figura 31: Medición del consumo energético de la estación meteorológica.
56
Figura 32: Consumo energético en modo de bajo consumo.
Estos son los consumos de la estación meteorológica (ver Figura 34) cuando se
encuentra en funcionamiento:
57
Figura 33: Consumo energético de la estación en funcionamiento.
Con la estación meteorológica programada para enviar los valores medidos por
sus sensores cada 24 minutos, aproximadamente, tendríamos un consumo medio de
unos 53,1124 mAh. Este consumo permitiría a la estación meteorológica funcionar de
forma continua durante unas 37 horas y media, aproximadamente.
58
LEDs. El Arduino Uno y la Shield CC3000 tienen pequeños LEDs que
están constantemente consumiendo energía. Cada LED puede consumir
unos 8-10 mA.
Reguladores de voltaje. Los reguladores de voltaje de la placa Arduino y
de la Shield CC3000 no son muy eficientes.
Las resistencias Pull-Up. Como ocurre con los LEDs, estas resistencias
son otra fuente de constante consumo energético.
El led que hemos soldado encima de la Shield CC3000. Para tareas de
depuración y prototipado es una gran ayuda, pero en un producto final es
totalmente innecesario.
Emplear el microcontrolador ATmega328P sin la placa Arduino.
Utilizar una versión de la Shield CC3000 con unas características
recortadas.
Empleando otro hardware, la placa ESP8266 sería una gran alternativa una vez
que su soporte software sea mejorado.
59
60
Capítulo 8
8.2. Autenticación
61
Figura 35: Panel de login de la aplicación web.
62
Figura 36: Estaciones meteorológicas registradas en el sistema.
63
Cada estación meteorológica permite consultar los valores de sus sensores que
ha enviado al servicio REST. Se permiten dos tipos de vista: visualizar los valores
gráficamente (ver Figuras 39 y 40) o en texto plano (ver Figura 41).
64
Figura 39: Representación gráfica de la variación de la temperatura.
65
La vista en texto plano permite eliminar las muestras deseadas siempre que
tengamos los permisos necesarios para ello. Esta visualización y la representación
gráfica se han desarrollado sin tener en cuenta el tipo de unidad a representar, es decir,
funcionaría perfectamente con cualquier estación meteorológica e independientemente
de los sensores que tenga (respetando el formato que acepta la API v1).
En la sección “Users” (ver Figura 43) podemos consultar los usuarios registrados
en el sistema, registrar nuevos usuarios y eliminarlos del sistema.
66
Figura 42: Visualización de los usuarios del sistema.
El botón “Add user” (ver Figura 44) despliega un panel flotante que nos permite añadir
nuevos usuarios.
67
Este mismo panel (ver Figura 45) es aprovechado para consultar los datos de los
usuarios al hacer click sobre ellos y darlos de baja del sistema.
68
Figura 45: Grupos del sistema.
69
70
Capítulo 9
71
9.2. Trabajo futuro
72
A. API del servicio REST
En este apéndice se procede a documentar la API versión 1 del servicio REST,
con todas sus funciones, descripción de las operaciones y códigos de estado.
GET /v1/login
Realiza una petición de autenticación en el sistema empleando la cabecera
Authorizaion con autenticación básica y cifrado base64.
Requisitos Nivel de privilegio Todos
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Devuelve el documento del usuario en
formato JSON, a excepción de la contraseña.
Ejemplo:
{
"login": "user",
"data": {
"name": "User",
"secondName": "Pepe",
"dateOfBirth": "1969-12-
31T23:00:01.000Z"
},
"groups": [
{
"_id":
"55bf687bb461d1dd046c6337",
"groupName": "User",
"privilegeLevel": 1
}
]
}
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
500 Internal Server Error Se produjo un error realizando la búsqueda
en la base de datos.
Tabla 32: Función GET /v1/login.
GET /v1/groups
Obtiene una lista con los grupos registrados en el sistema y su nivel de privilegio.
Requisitos Nivel de privilegio 0, 1
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
73
Respuesta Código de estado Cuerpo/descripción
200 OK Ejemplo:
[
{
"_id": "55bf6875b461d1dd046c6335",
"groupName": "Admin",
"privilegeLevel": 0
},
{
"_id": "55bf687bb461d1dd046c6337",
"groupName": "User",
"privilegeLevel": 1
},
{
"_id": "55bf687bb461d1dd046c6338",
"groupName": "Station",
"privilegeLevel": 2
}
]
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
500 Internal Server Error Se produjo un error realizando la búsqueda
en la base de datos.
Tabla 33: Función GET /v1/groups.
GET /v1/groups/:groupName
Obtiene información sobre un grupo.
Requisitos Nivel de privilegio 0, 1
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Ejemplo:
{
"_id": "55bf6875b461d1dd046c6335",
"groupName": "Admin",
"privilegeLevel": 0
}
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
74
acción.
404 Not Found El grupo no existe.
500 Internal Server Error Se produjo un error realizando la búsqueda
en la base de datos.
Tabla 34: Función GET /v1/groups/:groupName.
GET /v1/groups/:groupName/users
Obtiene los usuarios de un grupo.
Requisitos Nivel de privilegio 0, 1
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Ejemplo:
[
{
"login": "user",
"data": {
"name": "User",
"secondName": "Pepe",
"dateOfBirth": "1969-12-
31T23:00:01.000Z"
},
"groups": [
{
"_id":
"55bf687bb461d1dd046c6337",
"groupName": "User",
"privilegeLevel": 1
}
]
},
{…},
…
]
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
404 Not Found El grupo no existe.
500 Internal Server Error Se produjo un error realizando la búsqueda
en la base de datos.
Tabla 35: Función GET /v1/groups/:groupName/users.
75
GET /v1/stations
Obtiene una lista con las estaciones meteorológicas registradas en el sistema.
Requisitos Nivel de privilegio 0, 1
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Ejemplo:
[
{
"login": "08002857A267",
"data": {
"location": "CASA",
"wifi": "TFG",
"wifiPassword": "tfgtfgtfg",
"ip": "192.168.0.20",
"port": 3000,
"interval": 960,
"dateOfRegistration": "2015-08-
03T13:11:23.681Z"
},
"groups": [
{
"_id":
"55bf687bb461d1dd046c6338",
"groupName": "Station",
"privilegeLevel": 2
}
]
},
{...},
...
]
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
Tabla 36: Función GET /v1/stations.
GET /v1/stations/:MAC
Obtiene información sobre la estación meteorológica especificada.
Requisitos Nivel de privilegio 0, 1, 2
76
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Ejemplo:
{
"login": "08002857A267",
"data": {
"location": "CASA",
"wifi": "TFG",
"wifiPassword": "tfgtfgtfg",
"ip": "192.168.0.20",
"port": 3000,
"interval": 960,
"dateOfRegistration": "2015-08-
03T13:11:23.681Z"
},
"groups": [
{
"_id":
"55bf687bb461d1dd046c6338",
"groupName": "Station",
"privilegeLevel": 2
}
]
}
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
404 Not Found La estación meteorológica no existe.
500 Internal Server Error Se produjo un error realizando la búsqueda
en la base de datos.
Tabla 37: Función GET /v1/stations/:MAC.
GET /v1/stations/:MAC/data
Obtiene las muestras enviadas por la estación meteorológica especificada.
Requisitos Nivel de privilegio 0, 1
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Ejemplo:
[
{
77
"_id": "55c4d69a92abd23a046177f7",
"MAC": "08002857A267",
"samples": [
{
"pressure": 102016,
"temperature": 24.6,
"humidity": 52.8
}
],
"sampleDate": "2015-08-
07T16:02:34.969Z"
},
{
"_id": "55c4dab092abd23a046177f8",
"MAC": "08002857A267",
"samples": [
{
"pressure": 102032,
"temperature": 24.5,
"humidity": 52.9
}
],
"sampleDate": "2015-08-
07T16:20:00.040Z"
},
{..}
]
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
404 Not Found La estación meteorológica no existe.
500 Internal Server Error Se produjo un error realizando la búsqueda
en la base de datos.
Tabla 38: Función GET /v1/stations/:MAC/data.
GET /v1/stations/:MAC/data/:id
Obtiene una muestras específica de una estación meteorológica.
Requisitos Nivel de privilegio 0, 1
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Ejemplo:
78
{
"_id": "55c4d69a92abd23a046177f7",
"MAC": "08002857A267",
"samples": [
{
"pressure": 102016,
"temperature": 24.6,
"humidity": 52.8
}
],
"sampleDate": "2015-08-
07T16:02:34.969Z"
}
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
404 Not Found La estación meteorológica o la muestra no
existen.
Tabla 39: Función GET /v1/stations/:MAC/data/:id.
DELETE /v1/stations/:MAC/data/:id
Elimina una muestras específica de una estación meteorológica.
Requisitos Nivel de privilegio 0
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Muestra eliminada.
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
404 Not Found La estación meteorológica o la muestra no
existen.
Tabla 40: Función DELETE /v1/stations/:MAC/data/:id.
GET /v1/users
Obtiene una lista con los usuarios registrados en el sistema.
Requisitos Nivel de privilegio 0, 1
Petición Cabecera Contenido
79
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Ejemplo:
[
{
"_id": "55bf687bb461d1dd046c6336",
"login": "admin",
"password": "admin",
"data": {
"name": "Administrador",
"secondName": "Root",
"dateOfBirth": "1969-12-
31T23:00:01.000Z"
},
"groups": [
{
"_id":
"55bf6875b461d1dd046c6335",
"groupName": "Admin",
"privilegeLevel": 0
}
],
"_type": "Person"
},
{…},
]
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
500 Internal Server Error Se produjo un error realizando la búsqueda
en la base de datos.
Tabla 41: Función GET /v1/users.
POST /v1/users
Añade un usuario al sistema.
Requisitos Nivel de privilegio 0
Body Ejemplo:
{
"login" : "usuario",
"password" : "password",
"groups" : [{
"_id" :
80
"55bf687bb461d1dd046c6337"
}],
"data" : {
"name" : "Nombre",
"secondName" : "Apellidos",
"dateOfBirth" : "1969-12-
31T23:00:01.000Z"
}
}
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
201 Created Usuario creado correctamente.
400 Bad Request Formato incorrecto.
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
Tabla 42: Función POST /v1/users.
PUT /v1/users/:login
Actualiza la información personal del propio usuario. No son obligatorios todos los
campos.
Requisitos Nivel de privilegio 0, 1
Body Ejemplo:
{
"password" : "new password",
"data" : {
"name" : "Nombre",
"secondName" : "Apellidos",
"dateOfBirth" : "1969-12-
31T23:00:01.000Z"
}
}
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Devuelve el documento del usuario en
formato JSON, a excepción de la contraseña.
Ejemplo:
{
"login": "user",
"data": {
81
"name": "User",
"secondName": "Pepe",
"dateOfBirth": "1969-12-
31T23:00:01.000Z"
},
"groups": [
{
"_id":
"55bf687bb461d1dd046c6337",
"groupName": "User",
"privilegeLevel": 1
}
]
}
400 Bad Request Formato incorrecto.
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
404 Not Found El usuario especificado no existe.
Tabla 43: Función PUT /v1/users/:login.
DELETE /v1/users/:login
Elimina un usuario del sistema.
Requisitos Nivel de privilegio 0
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Usuario eliminado.
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
404 Not Found El usuario especificado no existe.
500 Internal Server Error Se produjo un error añadiendo el usuario a la
base de datos.
Tabla 44: Función DELETE /v1/users/:login.
POST /v1/stations
Registra una estación en el sistema.
82
Requisitos Nivel de privilegio 0
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Body Ejemplo:
{
"login": "MAC",
"password": "MAC al revés",
"data": {
"location": "CASA",
"wifi": "miWiFi",
"wifiPassword": "ContraseñaWiFi",
"ip": "192.168.0.1",
"port": 3000,
"interval": 640
},
"groups": [{
"_id":
"55bf687bb461d1dd046c6338",
}]
}
Respuesta Código de estado Cuerpo/descripción
201 Created Estación registrada correctamente.
400 Bad Request Formato incorrecto.
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
Tabla 45: Función POST /v1/stations.
DELETE /v1/stations/:MAC
Elimina una estación meteorológica del sistema.
Requisitos Nivel de privilegio 0
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Respuesta Código de estado Cuerpo/descripción
200 OK Se ha eliminado la estación del sistema.
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
404 Not Found La estación meteorológica especificada no
existe.
83
500 Internal Server Error Se produjo un error eliminando la estación
meteorológica de la base de datos.
Tabla 46: Función DELETE /v1/stations/:MAC.
PUT /v1/stations/:MAC
Modifica los parámetros de configuración de la estación meteorológica. No son
obligatorios todos los campos.
Requisitos Nivel de privilegio 0
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Body Ejemplo:
{
"data": {
"location": "CASA",
"wifi": "miWiFi",
"wifiPassword": "ContraseñaWiFi",
"ip": "192.168.0.1",
"port": 3000,
"interval": 640
}
}
Respuesta Código de estado Cuerpo/descripción
200 OK Devuelve el documento de la estación
meteorológica actualizado. Ejemplo:
{
"login": "08002857A267",
"data": {
"location": "CASA",
"wifi": "TFG",
"wifiPassword": "tfgtfgtfg",
"ip": "192.168.0.20",
"port": 3000,
"interval": 960,
"dateOfRegistration": "2015-08-
03T13:11:23.681Z"
},
"groups": [
{
"_id":
"55bf687bb461d1dd046c6338",
"groupName": "Station",
"privilegeLevel": 2
}
]
84
}
400 Bad Request Formato incorrecto.
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
404 Not Found La estación meteorológica no existe.
Tabla 47: Función PUT /v1/stations/:MAC.
POST /v1/stations/:MAC/data
Añade muestras de los sensores de la estación meteorológica.
Requisitos Nivel de privilegio 2
Petición Cabecera Contenido
Authorization Basic: Usuario:Contraseña
Body Ejemplo:
{
"MAC": "MAC",
"data": {
"temperature": "28",
"humidity": "55",
"preassure": "10222",
…
}
}
Respuesta Código de estado Cuerpo/descripción
201 Created La muestra se ha añadido satisfactoriamente.
400 Bad Request Formato incorrecto.
401 Unauthorized La autenticación ha fallado o no se ha
especificado.
403 Forbidden La autenticación es válida, pero el usuario no
tiene los permisos suficientes para realizar la
acción.
404 Not Found La estación meteorológica no existe.
Tabla 48: Función POST /v1/stations/:MAC/data.
85
86
B. Instalación del software en una Raspberry Pi
En la propia web de Arch Linux ARM vienen detallados los pasos para su
instalación, que consiste básicamente en crear las particiones del sistema en la tarjeta
MicroSD, descargar la imagen del sistema y descomprimirla.
npm install
# node /usr/bin/rest/install.js
Este script crea la base de datos, los grupos de usuarios y dos usuarios en el
sistema:
87
Finalmente podemos comprobar el funcionamiento del servicio REST del
siguiente modo:
# mkdir /var/log/tfg
A continuación debemos crear los servicios para systemd, para ello crearemos
dos ficheros en /etc/systemd/system/.
[Unit]
Description=REST Service
After=network.target mongodb.service
[Service]
Type=forking
WorkingDirectory=/usr/bin/rest
ExecStart=/usr/bin/forever -o /var/log/tfg/rest.log -e /var/log/tfg/rest-error.log start
./bin/www
ExecStop=/usr/bin/forever stop app.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rest-service
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
Tabla 49: Contenido del fichero rest.service.
[Unit]
Description=Web Client
After=network.target mongodb.service rest.service
88
[Service]
Type=forking
WorkingDirectory=/usr/bin/web
ExecStart=/usr/bin/forever -o /var/log/tfg/web.log -e /var/log/tfg/web-error.log start
./bin/www
ExecStop=/usr/bin/forever stop app.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=web-client
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
Tabla 50: Contenido del fichero web.service.
89
90
Bibliografía
[0] Github. “tanisperez/tfg” [Online]. Disponible. https://github.com/tanisperez/tfg
[7] IEEE. “IEEE 802.15.4 Wireless Personal Area Networks (PANs)” [Online].
https://standards.ieee.org/about/get/802/802.15.html
91
[15] Raspberrypi. “Raspberry Pi” [Online]. Disponible.
https://www.raspberrypi.org/
[26] Adafruit. “Adafruit CC3000 WiFi Shield with uFL Connector for Ext Antenna”
[Online]. Disponible. https://www.adafruit.com/products/1534
92
[30] George Ornbo, “Node.js”. Anaya Multimedia, Edición (15 de enero de 2013).
[34] Adafruit. “Low Power WiFi Datalogger with upgraded hardware” [Online].
Disponible. https://learn.adafruit.com/low-power-wifi-datalogging/upgraded-hardware
[37] Chart.js. “Chart.js – Open Source HTML5 charts for your website” [Online].
Disponible. http://www.chartjs.org/
[39] Arch Linux ARM. “Raspberry Pi Arch Linux ARM” [Online]. Disponible.
http://archlinuxarm.org/platforms/armv6/raspberry-pi
[41] StackOverflow. “Systemd start service after specific service” [Online]. Disponible.
http://stackoverflow.com/questions/21830670/systemd-start-service-after-specific-
service
93