Escola Tècnica Superior d’Enginyeria Informàtica Universitat Politècnica d e València València
Internet de las cosas: Desarrollo de un servidor Domtico Tra!a"o #in de $rado
Grado en Ingeniería Informática
Autor: Soriano Sai%& Sa'l Tutor: (l!alade"o )ero*o& +os,
-urso ./012./03
2
2
4esumen El o!"etivo del T#$ es el desarrollo e instalacin de un servidor domtico de !a"o coste en una red dom,stica5 -entrado en la creacin de un sistema comunicacin entre las plataformas (rduino y 4asp!erry a trav,s de red Et678ifi5 Este servidor ofrece al usuario un control domtico a trav,s de una aplicacin 8e!5 9a comunicacin entre el servidor y los nodos (rduino usa un protocolo de descu!rimiento !asado en UDP& con un proceso continuo de lectura de datos ue ser;n almacenados en la <
y P?P para leer los datos almacenados en el servidor y mostrarlos en tiempo real5 -onfiguraremos una VP@ AVirtual Private @et8orBC& la cual nos permitir; acceder a nuestra red local desde cualuier punto5 (dem;s a*adiremos m;s servicios al servidor: la plataforma 8ncloud nos permitir; tener nuestro propio sistema de almacenamiento de datos en l=nea& por otro lado el servidor de impresin nos permitir; imprimir desde cualuier punto de la red5
Palabras clave: IoT& Plataforma e!& P?P& +(V(& ?T)9& -SS& +avaScript7"Fuery& )ysl&
8ncloud& (rduino& 4asp!erry5 4asp!erry5
3
Internet de las cosas: Desarrollo de un servidor Domótico
(!stract The goal of this Project End of Degree is the development and installation of a low cost domotic server in a domestic network. Focused on the creation of a communication system between Arduino and Raspberry platforms through Eth/Wifi net. This server offers the user a domotic control through a web application. The communication between the server and the Arduino nodes uses a discovery protocol based on UDP, with a continuous process of data reading that will be stored on the database. The webpage will use AJAX and PHP technologies to read the data stored in the server and show them on real time. We will configure a VPN (Virtual Private Network) which will allow us inside our local network from wherever we are. Besides, we will add more services to the server: Owncloud platform will allow us to have our own data storage online, on the other hand, the printout server will allow us to print from anywhere on the network.
Keywords : in IoT& Plataforma e!& P?P& +(V(& ?T)9& -SS& +avaScript7"Fuery& )ysl&
8ncloud& (rduino& 4asp!erry5
4
Ta!la de contenidos 05
Introduccin................................................................................................. 7
.5
(n;lisis.......................................................................................................8
.50
)icrocontroladores.......................................................................................8
.5050
)dulo de Et6ernet.................................................................................... 9
.5.
-omputador..............................................................................................10
.5G
.51
-ontenedor 8e!......................................................................................... 13
.53 tras tecnolog=as........................................................................................ 13 G5
Presupuesto................................................................................................15
15
Dise*o...................................................................................................... 16
150
Protocolo de comunicacin........................................................................... 16
15.
15G
Estructura 8e!...........................................................................................18
35
Implementacin........................................................................................... 20
350
Preparacin del entorno...............................................................................20
35.
Instalacin de )ySF9.................................................................................22
35G
VP@....................................................................................................... 24
351 Servicios adicionales......................................................................................26 353
-digo (rduino......................................................................................... 31
35H
-digo +ava..............................................................................................35
35
-digo de la p;gina e!.............................................................................. 39
35J
-ronta!................................................................................................... 47
35K )anual de usuario...................................................................................... 47 H
-onclusiones...............................................................................................50
J
(neLos...................................................................................................... 52
J50
#uncin de registro A(rduinoC........................................................................52
J5.
#uncin para enviar datos A(rduinoC................................................................52
J5G
#uncin para reci!ir datos A(rduinoC ...............................................................53
J51
-digo "ava.............................................................................................. 53
5
Internet de las cosas: Desarrollo de un servidor Domótico
J53
Servidor5p6p AInterfa%C................................................................................. 58
J5H
mensa"e(rduino5p6p................................................................................... 59
J5 modulos9ist5p6p........................................................................................ 60 J5J nuevosDatos5p6p........................................................................................62 J5K
nuevosElementos5p6p..................................................................................63
J50/
arduino9ist5p6p........................................................................................64
J500
unico)odulo5p6p.....................................................................................64
J50.
script5"s.................................................................................................. 67
6
05
Introduccin
Ilustración 1: El internet de las cosas
Este proyecto se 6a desarrollado en !ase a un concepto& el internet de las cosas AIoTC5 IoT 6ace referencia a la interconeLin de o!"etos mundanos a internet5 Presentar=a un punto donde un gran n'mero de o!"etos cotidianos& ue actualmente podemos encontrar en la mayor=a de 6ogares& est,n interconectados a nuestras redes dom,sticas con el fin de controlarlas o monitori%arlas5 -on esa premisa se 6a desarrollado este servidor de domoti%acin& ue nos ayudara tanto a centrali%ar nuestros servicios en red como permitirnos controlar microcontroladores (rduino5 Este servidor se 6a dise*ado para utili%ar microcontroladores (rduino para los nodos y 4asp!erry PI para el servidor& am!as son open2source Acdigo a!iertoC& lo ue significa ue tanto el soft8are como el 6ard8are son de li!re distri!ucin5 9a interconeLin de los microcontroladores se reali%a v=a Et6ernet a trav,s de nuestra red de ;rea local& y la comunicacin utili%ada es UDP AUser Datagram ProtocolC5 9os microcontroladores se identifican dentro de la red mediante un proceso de identificacin& el cual es iniciado por el servidor& tras el cual es microcontrolador puede tanto enviar informacin como reci!ir5 Por cuestiones de comodidad se tom la decisin de dividir los posi!les nodos en dos tipos actuadores y sensores5 9os actuadores son elementos ue podemos controlar a trav,s de nuestro servidor Aservomotores& rel,s&MC& mientras ue los sensores son elementos ue slo env=an informacin al servidor para ser monitori%ada5 El servidor cuenta tam!i,n con un contenedor 8e!& en el cual se encuentra alo"ada la 8e! donde est; la interfa% de usuario5 Esta 8e! nos muestra los diferentes nodos conectados a nuestra red& con los datos enviados al servidor5 ( trav,s de esta interfa% se lleva a ca!o el proceso ue termina registro de los nodos conectados y enviar datos de forma cmoda a los diferentes nodos conectados5 9a 8e! cuenta adem;s con una serie de eventos& totalmente transparentes al usuario& ue actuali%an los datos de los nodos y proporcionan un sistema de alertas para el usuario5 (nteriormente mencion;!amos ue el servidor contar=a con una serie de servicios en red& entre ellos podemos destacar el servidor de impresin ue nos permite imprimir desde cualuier punto de la red y la VP@ AVirtual Private @et8orBC& ue nos permite conectarnos a nuestra red
7
Internet de las cosas: Desarrollo de un servidor Domótico
dom,stica desde cualuier punto de internet de manera segura5
.5
(n;lisis
En el siguiente apartado se presentan los diferentes componentes ue necesitamos para cada uno de los elementos ue forman parte del sistema5 Tam!i,n presentamos la tecnolog=a seleccionada para reali%ar la tarea concreta5
.50 )icrocontroladores
Ilustración 2: Logo Arduino
Para poder interconectar los diferentes o!"etos cotidianos a nuestra red& vamos a utili%ar microcontroladores5 Utili%aremos esta electrnica para gestionar la comunicacin entre los diferentes elementos y el servidor ue almacena los datos5 -oncretamente los microcontroladores son circuitos integrados programa!les& en los ue podemos al!ergar nuestros propios cdigos5 En nuestro caso estos cdigos esta!lecer;n la coneLin con el servidor& con el fin de dar de alta al elemento dentro del sistema y enviar la informacin pertinente5 En el mercado 6e encontrado muc6as alternativas de entre las ue ca!e destacar (rduino y @anode5 ?emos elegido para este proyecto la tar"eta (rduino )ega5 (rduino es un con"unto !astante grande de microcontroladores !asados en el microcontrolador (Tmel& !asado en una aruitectura 4ISN de J !its5 9a iniciativa de estas tar"etas surge como el proyecto de unos estudiantes italianos& ue uer=an o!tener microcontroladores de !a"o coste y consumo5
8
Ilustración 3: Arduino Mega R3 Arduino Mega
9as especificaciones t,cnicas de la tar"eta son:
Características
Arduino Mega
)icrocontrolador Volta"e de alimentacin Pines digitales de E7S Pines analgicos )emoria #las6 S4() EEP4) Velocidad de 4elo"
(tmega.3H/ 3V 31 donde 03 son p8d 0H .1J N< utili%a!les JN< 1N< 0H)?%
Se 6a elegido esta tar"eta esta tar"eta de entre todas las ue podemos encontrar actualmente en el mercado& por su versatilidad5 Por un lado es muy cmoda de utili%ar& puesto ue esta marca concreta cuenta con un puerto US< de tipo ! ue nos permite conectarla a cualuier euipo5 (dem;s tam!i,n es compati!le con todas las tar"etas de eLpansin ue 6an sido dise*ados para esta familia& entre las ue podemos encontrar toda clase de circuitos eLternos ue podemos a*adir a nuestro microcontrolador para dotarla de nuevas funcionalidades5
.5050
)dulo de Et6ernet
-omo este dispositivo no puede ser conectado de forma directa a la red& vamos a necesitar algo de ayuda& por lo ue vamos a utili%ar la s6ield de eLpansin para Et6ernet compati!le con (rduino5 (ctualmente podemos encontrar una gran variedad de circuitos de eLpansin para poder conectar nuestra tar"eta a nuestra red& entre ellas podemos encontrar tanto versiones para conectarte a trav,s de Et6ernet como I#I5 Se 6an estudiado varias alternativas para esta
9
Internet de las cosas: Desarrollo de un servidor Domótico
coneLin& el mdulo [email protected]"H/ tuvo ue ser descartado de!ido a ue no termina de ser compati!le con el (rduino )ega al 0//O& de!ido a un pro!lema de dise*o so!re uno de los pines de este5 tro modulo ue se investigo fue el espJ.HH& este circuito es muy f;cil de conectar a nuestro (rduino y nos permite conectarlo a la red a trav,s de la red I#I5 #inalmente se opt por la opcin m;s sencilla& la tar"eta de eLpansin s6ield Et6ernet de la propia marca (rduino5
Ilustración 4: Shield Arduino Ethernet
Esta tar"eta tiene el mismo formato f=sico ue la versin U@ de (rduino5 -oncretamente esta versin cuenta adem;s con un %calo de eLpansin para tar"etas SD& para utili%ar como sistema de almacenamiento ya ue nos permitir; escri!ir y leer todos los datos ue necesitemos5 Por 'ltimo destacar ue el conector de 4+1 cuenta con la tecnolog=a PE APo8er ne Et6ernetC& la cual nos permite alimentar el sistema a trav,s del ca!le de Et6ernet al mismo tiempo ue via"an los datos 6acia la red y viceversa5 9a estructura de la comunicacin entre los nodos y el servidor estar; formada por tres funciones5 Por un lado la primera funcin se encargar; de esta!lecer la coneLin con el servidor para o!tener un identificador v;lido para el nodo& esta funcin devolver; el identificador nodo ue se utili%ara para marcar los mensa"es5 Por otro lado la segunda funcin esperara reci!ir los datos ue ser;n enviados al servidor& esta funcin montar; los mensa"es UDP marcados con el identificador y estructurara los datos& para ue sea posi!le identificar el nodo y su sensor o actuador5 Por 'ltimo nos 6ar; falta una funcin ue se encargue de escuc6ar posi!les mensa"es ue modifiuen el estado del nodo& de esta forma podremos enviar mensa"es a un puerto para modificar partes concretas del nodo5
.5. -omputador
10
Ilustración 5: Logo Raspberr !I
Para e"ecutar el servidor y los diferentes servicios de los ue dispondremos& necesitamos un ordenador donde e"ecutar los diferentes sistemas y programas5 Se podr=a utili%ar cualuier ordenador para este tra!a"o& pero de!ido a ue el sistema domtico tendr; ue estar en funcionamiento a lo largo de todo el d=a& necesitamos un computador ue tenga un consumo el,ctrico muy !a"o5 En este ordenador se e"ecutaran programas como el demonio ue identifica los nodos& la !ase de datos donde guardaremos la informacin& los servicios eLternos y la p;gina 8e! ue utili%aremos a modo de interfa% gr;fica5
En el )ercado 6ay toda clase de ordenadores disponi!les& pero los ue m;s llamaron mi atencin fueron los denominados ordenadores de placa reducidaQ5 Este tipo de euipos son denominados as= porue todos los componentes del ordenador son integrados en la misma placa5 De entre todas las posi!ilidades de las ue disponemos& se 6a seleccionado la placa 4asp!erry Pi
Ilustración ": Raspberr !I #$
9as especificaciones t,cnicas de la tar"eta son: Características Procesador AM Almacenamiento $%" &nergía Pines GPI'
as!berry PI "#
4asp!erry PI es un ordenador de !a"o coste ue se a"usta perfectamente a nuestras necesidades5 -on el tama*o de una tar"eta de cr,dito y con los recursos suficientes para e"ecutar nuestro proyecto& lo convierten en la me"or opcin5 #unciona con una alimentacin de 3v& lo ue es un consumo muy !a"o si lo comparamos con un ordenador convencional5 Esta placa fue dise*a para eLtender el mundo de la programacin entra la po!lacin& por lo ue es perfecta para todas clase de eLperimentos& lo ue de"a a nuestra disposicin una comunidad de desarrolladores5 Para el sistema operativo se va a utili%ar una tar"eta micro SD& con una capacidad de 1$<& en la ue instalaremos el sistema 4asp!ian5 Este S nos lo proporciona la propia organi%acin de 4asp!erry& es una versin de De!ian adaptada para la aruitectura (4) de la tar"eta5
11
Internet de las cosas: Desarrollo de un servidor Domótico
Ilustración %: Logo de Raspbian
El sistema operativo ser; clave para seleccionar el soft8are y las 6erramientas ue vamos a utili%ar5 $racias a la utili%acin de usar este tipo de soft8are& encontramos gran cantidad de programas gratuitos y procesos ue modificaremos para propsitos propios del servidor5 Un !uen e"emplo es el uso 6ilo de e"ecucin cronta! para reali%ar procesos de mantenimiento del servidor5 Pero el m;s importante es un demonio ue de"aremos continuamente en e"ecucin& este servicio a!rir; uno de los puertos de nuestra tar"eta para reci!ir mensa"es v=a UDP5 El proceso tratar; los datos ue se reci!an y actuar; en funcin del tipo de mensa"e reci!ido5 Programa (!rimosPuerto !ucle 0 Si mensa"e (lta -onsulta a la !ase de datos de la IP Si eListe Devolvemos el id asociados Si @ 4ecuperamos el ultimo id Enviamos Aultimo id R0C #inSi #inSi Si mensa"e Datos Se trata el mensa"e para esta!lecer relacion sensor7valor Se introduce en la !ase de datos #I@SI fin
.5G
Ilustración &: Logo MS'L
9os datos ue son enviados continuamente de los diferentes nodos& contienen informacin acerca del estado en el ue se encuentran& esta informacin de!e ser almacenada y para ello vamos a utili%ar una !ase de datos5 De entre todas las alternativas de li!re distri!ucin ue
12
podr=amos utili%ar& se 6a escogido )ySF95 9os motivos de 6a!er elegido este sistema concreto est;n relacionados con la interfa% 8e!5 -omo la 8e! tendr; ue reali%ar muc6as consultas r;pidas 6acia la !ase de datos& para mantener la informacin a tiempo real5 (unue es muc6o menos ro!usta ue por e"emplo PostgreSF9& esta optimi%ada para reali%ar consultas peue*as y est; muy ligada al desarrollo 8e!5 9a !ase de datos de!er; estar formada por dos ta!las& una de ellas contendr; informacin acerca de los nodos y otra guardara toda la informacin5 Utili%amos )ySF9 para poder esta!lecer claves a"enas ue relacionen am!as ta!las& de esta forma podremos relacionar las medidas o!tenidas con el nodo ue la genero5 9a ta!la ue guarda los nodos mantendr; la informacin acerca de la IP y puerto de estos& y como es posi!le ue sea muy 'til relacionar varios nodos entre si& usaremos un campo para guardar un identificador de grupo5 Por otro lado la ta!la de datos guardara el identificador del nodo ue genero los datos& as= como la fec6a en ue se reci!i5
.51 -ontenedor 8e! 9a seleccin del contenedor 8e! fue !astante complicada& puesto ue la eleccin de este marca!a el desarrollo de la aplicacin5 Entre las alternativas se encontra!an Tomcat y (pac6e5
Ilustración (: Logo )o*cat
Tomcat por un lado& es un contenedor !asado en servlets& una !uena alternativa para este proyecto 6u!iera sido la pu!licacin de la interfa% 8e! con +ava5 De!ido a las limitaciones de la 4asp!erry se decidi no utili%ar esta alternativa& por miedo a ue la m;uina virtual de +ava fuera demasiado para esta5 (dem;s en caso de uerer reali%ar cam!ios en la 8e! se de!er=a de recompilar todo el cdigo +(V(5
Ilustración 1+: Logo Apache
Por otro lado (pac6e podr=a ser una alternativa m;s recomenda!le& ya ue utili%aremos P?P para el cdigo de la 8e!5 -omo este cdigo estar; visi!le& podremos modificarlo en cualuier momento& y cam!iar todo auello ue consideremos necesario en un futuro5
13
Internet de las cosas: Desarrollo de un servidor Domótico
.53 tras tecnolog=as
Ilustración 11: Logo ,-uer
I l ustración 12: Logo !hp
Ilustración 13: Logo ,a.a
tras tecnolog=as ue se utili%ar;n para el desarrollo de todas las funcionales ue componen el sistema son: Utili%aremos +ava para el desarrollo del demonio ue estar; e"ecut;ndose continuamente5 Este creara los socBets y se encargar; de comunicar la informacin pertinente a cada uno de los nodos para identificarse en el sistema5 ?emos elegido este lengua"e en concreto por su universalidad& ue nos permitir; e"ecutar la aplicacin en cualuier dispositivo y por u, fue dise*ado para potenciar la interaccin a trav,s de internet5 Usaremos P?P para el desarrollo de la interfa% 8e!& puesto ue cuenta con una muy completa (PI ue nos permite reali%ar casi cualuier accin so!re el servidor5 $racias a +avaScript podremos e"ecutar cdigo en los navegadores cliente& de modo ue dar; a nuestra interfa% la apariencia de los datos y estados a tiempo real5 Por 'ltimo destacar las li!rer=as ue ser;n utili%as para simplificar el tra!a"o de desarrollo& son la li!rer=a +Fuey y las li!rer=as de (rduino5 9a li!rer=a +Fuery nos facilitara el acceso a los elementos del D) ADocument !"ect )odeloC& para poder modificarlos& y las diferentes li!rer=as (rduino ue se 6an dise*ado para los diferentes mdulos o sensores& en este caso usaremos la li!rer=a Et6ernet& la li!rer=a Servo y la D?T005
14
Ilustración 14: Es-ue*a de cone/iones del proecto0
G5
Presupuesto
Material Arduino Mega 2560R3 Shield Enthernet Ras!err" #i $% 'areta S & *$ 'otal
coste(€) 17,5 11, &0,6 3,& 73,&
15
Internet de las cosas: Desarrollo de un servidor Domótico
15
Dise*o
En este apartado vamos a centrarnos en la estructura de los elementos ue conformaran nuestro sistema& estas estructuras marcar;n las pautas ue se seguir;n a la 6ora de programar la comunicacin entre los nodos y el servidor& la !ase de datos y la 8e!5
150Protocolo de comunicacin Para la comunicacin a trav,s de la red se 6a elegido el protocolo UDP AUser Datagram ProtocolC& ue parece una me"or eleccin ue T-P para este proyecto5 9a ra%n de 6a!er elegido este protocolo es por cuestiones de so!re saturacin de la red& puesto ue como T-P tiene ue esta!lecer una sesin antes de empe%ar a enviar mensa"es puede generar una latencia muy alta en nuestra red5 Un punto negativo ue tiene este protocolo es la !a"a fia!ilidad de entrega de los pauetes& pero en este sistema& la p,rdida de pauetes puntuales no genera pro!lemas de funcionamiento5 El protocolo de comunicacin se 6a dividido en fases para simplificar la identificacin de los nodos& dentro de la red& as= como de enviar la informacin acerca del estado del nodo5 Para la identificacin se 6a dise*ado un peue*o protocolo de 6ands6aBeQ& ue permitir; al controlador o!tener un identificador 'nico dentro del sistema para poder marcar los mensa"es ue contendr;n los registros del estado del sistema5
Ilustración 15: Es-ue*a de co*unicación del protocolo
El servidor ser; el encargado de enviar mensa"es de invitacin a trav,s de la red& para ue los nodos puedan descu!rir cu;l es la direccin donde est; situado el servidor5 Este mensa"e ser; enviado por el servidor a intervalos de tiempos para poder mantener el servicio actuali%ado5 9os nodos esperan reci!ir este mensa"e& cuando reci!en este mensa"e env=an un mensa"e al servidor indic;ndole ue uiere identificarse dentro de la red5 -uando el servidor reci!e un mensa"e de identificacin& el servidor tendr; ue compro!ar si ese nodo ya eList=a dentro del sistema o es
16
necesario darle de alta5 Una ve% el nodo o!tiene el identificador& ya puede empe%ar a reali%ar los env=os necesarios o escuc6ar un puerto determinado5
15.
Ilustración 1": Es-ue*a de la base de datos
#inalmente se 6a optado por dividir la informacin en dos ta!las relacionadas& (rduino y mediciones5 Por un lado la ta!la (rduino se encargar; de guardar la informacin relativa al nodo& por otro lado la ta!la mediciones guardar; los datos enviados por los nodos5 Estas dos ta!las estar;n relaciona a trav,s del campo id de la ta!la (rduino y el campo arduinoId de mediciones& uedando el siguiente esuema relacional5
(rduino Aid:real& nom!re:c6arA./C& tipo:c6arA./C& ip:c6arA./C&puerto:realC -P:id )ediciones Aid:real& arduinoId:c6arA./C& parametros:real& valor0:c6arA./C& valor.:c6ar& valorG:c6arA./C& valor1:c6arA./C& fec6a:dateC -P:id -(": arduinoId 2W (rduinoid 9os campos elegidos para la ta!la (rduino son:
17
Internet de las cosas: Desarrollo de un servidor Domótico
•
•
•
• •
Id: identificador ue se le dar; a cada uno de los nodos& se utili%ar; para marcar la informacin ue se env=e a la red& por lo ue tiene ue ser 'nico para cada nodo5 @om!re: es un valor auLiliar ue se utili%ar; para relacionar diferentes nodos5 Si por e"emplo tenemos varios nodos en un mismo lugar& podemos utili%ar este campo para esta!lecer una relacin entre ellos asoci;ndoles el mismo valor5 Tipo: eListen dos tipos de nodos y por lo tanto dos posi!les valores& sensor o actuador5 Ip: guardara la IP del nodo5 Puerto: guardara el puerto del nodo5
9os campos ue se utili%an para la ta!la )ediciones son: Id: es el identificador de la entrada dentro de la ta!la5 (rduinoId: este campo se utili%ar; para relacionar las dos ta!las& de este modo podremos identificar los datos asoci;ndolos a un nodo5 Par;metros: es un valor num,rico ue nos indica cuantos datos se est;n enviando al servidor5 En este dise*o se 6a optado por limitarlo a 1 puestos ue es el n'mero de puertos serie de los ue dispone nuestra (rduino )ega5 Valor0& Valor.& ValorG& Valor1: son los campos ue se utili%an para almacenar la informacin reci!ida de la red& cada uno de los campos corresponde a un sensor o actuador diferente5 #ec6a: este campo guardar; la fec6a y 6ora en la ue se reci!i el mensa"e5
• •
•
•
•
15G
Estructura 8e!
Para la estructura de la 8e! 6emos decido seguir una estructura por !loues5 9a p;gina estar; dividida en tres %onas diferenciadas& el men'& el contenedor y la lista5
Ilustración 1%: Es-ue*a de la pgina eb
9a parte ro"a de la p;gina corresponde a una lista de los identificadores ue se utili%an para identificar los nodos5 9os elementos de esta lista ser;n clica!les y nos permitir;n mostrar en la
18
p;gina solo auellos nodos ue compartan este identificador5 De este modo podremos tener un acceso r;pido a todos auellos nodos ue se encuentran por e"emplo en la misma 6a!itacin5 9a parte a%ul es el men' de nuestra interfa% en la ue encontraremos todos auellos servicios ue instalaremos en nuestro servidor& de este modo conseguiremos un acceso centrali%ado a todos los servicios del servidor5 En este apartado adem;s a*adiremos el aviso visual naran"a& ue actuar; de sistema de aviso cuando un nuevo nodo se conecte a la red5 -uando se pulse nos permitir; terminar de dar de alta al nodo en nuestro sistema& rellenando los datos ue no se 6an completado por el demonio5 Por 'ltimo la parte verde ser; el contenedor& en esta parte iremos a*adiendo los datos ue nos enviar;n los nodos5 -ada nodo tendr; una entrada en la ue se pu!licar;n los datos ue la (rduino env=e en tiempo real& si el nodo dispone de alg'n actuador& aparecer; un peue*o formulario ue permitir; enviar datos al nodo5 Utili%aremos eventos temporales mediante "avascript y el cronta! del servidor& para e"ecutar el sistema de alertas y avisos ue dotar;n al sistema de datos en tiempo real5
19
Internet de las cosas: Desarrollo de un servidor Domótico
35
Implementacin
350 Preparacin del entorno Para comen%ar con la implementacin del sistema& de!emos preparar el entorno donde e"ecutaremos el servidor5 Empe%aremos preparado la 4asp!erry& una ve% ue tengamos el sistema operativo listo& podremos empe%ar a instalar las 6erramientas necesarias para e"ecutar la aplicacin5 En la p;gina 8e! oficial de (rdruino podemos encontrar una gran variedad de sistemas operativos& pero el ue realmente nos interesa es 4asp!ian5 Este sistema es una versin adaptada de De!ian ue 6a sido optimi%ado para 4asp!erry& cuenta con los programas !;sicos ue se pueden e"ecutar en nuestra tar"eta5 @osotros vamos a utili%ar la versin 6ee%y& y utili%aremos la aplicacin (pple2Pi2
Ilustración 1&: aptura de pantalla Apple!i#aer
-omo se puede ver en la imagen superior& la interfa% del programa utili%ado para instalar el S es !astante sencilla5 (pple2Pi2
20
-on este comando podremos acceder a nuestra 4asp!erry con el usuario piQ& cuando nos pregunte la contrase*a solo tenemos ue introducir la pass8ord por defecto ue tiene el S& rasp!erryQ5 Una ve% dentro del sistema podemos empe%ar a instalar todo lo ue necesitemos5 (ntes de empe%ar a instalar soft8are en nuestra 4asp!erry& vamos a configurar algunos fic6eros ue pueden resultar 'tiles en un futuro5 Para configurar nuestra 4asp!erry vasta con e"ecutar el comando: sudo ras!i0config
Ilustración 1(: aptura del *en6 de con7iguración Raspbian
En este men' encontramos todas las opciones de configuracin a las ue tenemos acceso& en nuestro sistema5 Vamos a destacar las m;s importantes: •
•
•
ELpand #ilesystem nos permitir; aumentar el tama*o del sistema de arc6ivos& esto es muy importante si estamos utili%ando tar"etas micro SD de m;s de .$<& ya ue por defecto en el S viene limitado a dos .$<5 Ena!le
Para terminar la configuracin vamos a cam!iar el arc6ivo config5tLt para cam!iar los formatos de salida del audio y el v=deo de nuestro 4asp!erry para adaptarlo a los est;ndares5 Utili%ando este comando se o!tiene acceso al fic6ero: sudo nano 1boot1config-t2t
Una ve% dentro del fic6ero vamos a a*adir unas l=neas para configurar la salida de v=deo de nuestra tar"eta& por si en alg'n momento es interesante pasar al modo gr;fico: •
•
SdtvXmode. seleccionaremos como salida analgica el formato P(95 P(9 es el tipo de video de codificacin de v=deo ue se usa en Espa*a5 6dmiXgroup.& en este par;metro estamos configurando el tipo de monitor ue se va a utili%ar5 9os posi!les valores son 0& en caso de ue estemos utili%ando una televisin ya ue corresponde con el formato -E( o . D)T& ue es un formato para monitores5
21
Internet de las cosas: Desarrollo de un servidor Domótico
•
6dmiXmode0H& por 'ltimo este par;metro 6ace referencia a la resolucin de salida del v=deo& una !uena forma de sa!er u, alternativas de resolucin se disponen es usar el comando: 1o!t1vc1bin1tvservice 3m TIP'45&4M'6IT'
Una ve% todo configurado ya podemos comen%ar instalando el (pac6e y P?P en el nuestra tar"eta& de modo ue primero de todo necesitamos dar permisos dentro del sistema al grupo ue usa apac6e por defecto5 %udo addgrou! www0data scudo usermod 0a 0G www0data www0data
Una ve% creado el grupo& vamos a actuali%ar nuestro sistema y despu,s instalaremos los pauetes de (pc6e y P?P5 sudo a!t0get u!date sudo a!t0get install a!ac(e, !(!7 liba!ac(e,0mod0!(!7
( continuacin vamos a instalar la m;uina virtual de "ava para poder e"ecutar programas en +(V(5 racle tiene una versin del +DN para aruitecturas (4)& en su 8e! podemos encontrar el enlace a la versin m;s actuali%ada5 -on el siguiente comando podemos descargarnos esa versin5 wget (tt!:11download-oracle-com1otn0!ub18ava18d91/u7*0b*.18d90/u7*0linu20arm0vf!0 (flt-tar-g
Una ve% descargado slo tenemos ue moverlo al directorio ue le corresponde y descomprimirlo5 sudo mv 8d90/u7*0linu20arm0vf!0(flt-tar-g 1usr1local1 cd 1usr1local1 sudo tar 02vf 8d90/u7*0linu20arm0vf!0(flt-tar-g
Por 'ltimo lo a*adiremos al pat6 para ue sea e"ecuta!le desde cualuier lugar mediante este comando5 PAT;<1usr1local18d9*-/-=47*1bin:>PAT; e2!ort PAT;<1usr1local18d9*-/-=47*1bin:>PAT;
35. Instalacin de )ySF9 Es 6ora de instalar la !ase de datos& adem;s instalaremos la aplicacin P6p)y(dmin para facilitar el uso de esta5 P6p)y(dmin es una 6erramienta escrita en P?P de li!re distri!ucin& est; dise*ada para la administracin de !ases de datos )ySF9 a trav,s de la 8e!5 (ntes de
22
empe%ar la instalacin de!emos de activar la interfa% loop!acB de la 4asp!erry& para evitar pro!lemas de instalacin de )ysl5 Podemos activarla con el siguiente comando: sudo ifu! lo
Para instalarlo todo en nuestra 4asp!erry de!eremos de e"ecutar el siguiente comando en el terminal5 sudo a!t0get install mys?l0server mys?l0client !(!70mys?l !(!myadmin
Durante la instalacin se nos preguntar; u, contrase*a ueremos utili%ar para acceder a nuestra !ase de datos& en este caso se 6a introducido la misma contrase*a para todo con el fin de simplificar un poco la implementacin del sistema5 Una ve% est, instalado de!emos de modificar el arc6ivo de p6p5ini: sudo nano 1etc1!(!71a!ac(e,1!(!-ini
-on esto daremos de alta la eLtensin de mysl para p6p5 Por 'ltimo crearemos un enlace sim!lico para poder acceder a P6p)y(dmin5 sudo ln 0s 1etc1!(!myadmin1a!ac(e-conf 1etc1a!ac(e,1conf-d1!(!myadmin-conf
sudo 1etc1init-d1a!ac(e, reload
Una ve% 6ec6o esto& podemos acceder al panel de administracin a trav,s de la url& 0K.50HJ5050H7p6pmyadmin5 @os aparecer; un panel de registro& una ve% dentro tendremos todo a nuestra disposicin para generar las ta!las ue utili%aremos en nuestro servidor5
Ilustración 2+: aptura de la pgina de registro phpMAd*in
Ilustración 21: aptura de la pgina de inicio phpMAd*in
Dentro del apartado !ase de datos podemos crear la !ase de datos ue contendr;n las ta!las ue guardar;n la informacin5 Una ve% creada la !ase datos podremos acceder a ella y crear la ta!la& a trav,s de un sencillo formulario& la interfa% nos permite crear las ta!las ue se 6an mostrado en el punto anterior5 Destacar ue cuando eli"amos el tipo de cote"amiento de los datos&
23
Internet de las cosas: Desarrollo de un servidor Domótico
seleccionar el utfJXunicodeXci& esto evitara ue tengamos pro!lemas cuando se inserten o se !usuen los datos5
Ilustración 22: aptura con7iguración base de datos
Ilustración 23: aptura con7iguración base de datos
35GVP@ (6ora vamos a montar un servicio de VP@ AVirtual Private @et8orBC& ue nos permitir; acceder a nuestro servidor desde cualuier punto del mundo5 En el servidor necesitaremos tener instalando un servicio de @2IP para dar soporte a la VP@5 El servicio @2IP nos proporcionar; todo lo necesario para ue nuestra 4asp!erry sea visi!le a trav,s de internet& sin tener ue tener una direccin p'!lica fi"a5 Es un demonio ue se puede descargar en la propia 8e! del servicio& es gratuito y se encarga de actuali%ar el servidor de D@S5 El D@S se actuali%a continuamente con la informacin de la direccin actual del euipo& por lo ue aunue se reinicie el router siempre sa!r; donde esta nuestra 4asp!erry5 Para instalarlo solo tenemos ue acceder a la p;gina 8e! de 8885no2ip5com y registrarnos5 Esta p;gina nos permite utili%ar una gran cantidad de dominios y asign;rselos a los 6ost ue ueramos5
Ilustración 24: aptura del *en6 de 8oI!
24
Para este proyecto vamos a utili%ar un dominio de la seccin gratuita ue nos ofrece la 8e! y un nom!re de dominio& en este caso el dominio ser=a servidor6ermes5ddns5netQ5 Para instalar el servicio ue actuali%ar; el router para re direccionar el tr;fico 6acia nuestra (rduino vamos a e"ecutar los siguientes comandos: m9dir noi! cd noi!1 wget (tt!:11www-no0i!-com1client1linu21noi!0duc0linu2-tar-g tar 02f noi!0duc0linu2-tar-g cd noi!0,-*-+0*1 ma9e sudo ma9e install
Primero de todo vamos a crear una carpeta donde descargar el arc6ivo comprimido de la 8e! oficial de no2ip5 Una ve% descomprimido este arc6ivo ya tenemos los cdigos de la aplicacin& solo tenemos ue compilar el cdigo para ue se generen todos los arc6ivos necesarios para la instalacin del servicio5 Una ve% todo compilado ya podemos instalar el demonio& durante la instalacin se nos pide ue introdu%camos los datos de la cuenta donde 6emos creado el 6ost5
(6ora vamos a crear un fic6ero para ue el servicio se levante cada ve% ue reiniciamos nuestra tar"eta: sudo vim 1etc1init-d1noi!,
-on el siguiente script y los comandos ue le dan al fic6ero los permisos necesarios para levantar el servicio& ya tenemos todo listo para re direccionar el dominio a nuestra 4asp!erry5
YZ 7!in7s6 Y 7etc7init5d7noip case [\0[ in startC ec6o [(rrancando noip[ 7usr7local7!in7noip. stopC ec6o [Parando noip[ Billall noip. ]C ec6o [Uso: 7etc7init5d7noip start^stop[ eLit 0 esac eLit / sudo c(mod #2 1etc1init-d1noi!,
25
Internet de las cosas: Desarrollo de un servidor Domótico
sudo u!date0rc-d noi!, defaults
(6ora vamos a configurar nuestra VP@ utili%ando para ello PPTP APoint to Point Tunnelling ProtocolC5 Este es un protocolo ue permite esta!lecer coneLiones seguras entre dos puntos cifrando para ello los datos antes de ser enviados5 Para instalarla primero de todo vamos a instalar el servidor de PPTP a trav,s del comando: sudo a!t0get install !!t!d
Una ve% instalado el programa se 6a de configurar& comen%aremos por asignar la IP local de nuestra 4asp!erry y el rango de IPs ue vamos a distri!uir cuando alguien se conecte a la VP@5 Slo tenemos ue acceder al fic6ero con el siguiente comando y descomentar y configurar los campos localipQ y QremoteipQ mediante el comando: sudo vim 1etc1!!t!d-conf
(6ora vamos a a*adir las siguientes instrucciones dentro del fic6ero pptpd2options para configurar los datos de red& en este caso se 6a utili%ado el servidor D@S de googleQ& J5J5J5J5 sudo nano 1etc1!!!1!!t!d0o!tions
_ a*adimos las l=neas: ms2dns J5J5J5J no!sdcomp noipL mtu 01K/ mru 01K/ Por 'ltimo podemos crear un usuario para acceder a la VP@& en el fic6ero c6ap2secret ue se encuentra en la ruta: 1etc1!!!1 Tras reiniciar el servicio y abrir el puerto 1723 de TCP/IP en nuestro router, ya tendremos listo un acceso privado a nuestro servidor. Por temas de seguridad, cuando un usuario acceda a nuestra red, solo tendrí a acceso a nuestra tarjeta. De este modo nos aseguramos de que en caso de una intrusión, no se vea corrompida la red. Como se trata de un servidor que se ejecuta localmente, no corre peligro de ser atacado, la VPN es el elemento que conecta nuestra red a través de internet y necesita de credenciales de usuario para poder conectarse. Además destacar que la comunicación que se realiza entre los dos puntos se realiza de forma cifrada, lo que puede evitar que suframos un ataque de “Man-in-the-middle”.
351 Servicios adicionales En un proyecto como este ue !usca la coneLin de o!"etos comunes a nuestra red& no pod=amos de"ar de 6a!lar del servidor de impresin5 Vamos a utili%ar un servicio 8e! llamado -UPS A-ommon UniL Printing SystemC ue nos permitir; su!ir fic6eros al servidor para ue sean imprimidos por una impresora& la idea es utili%ar una impresora US< convencional como una impresora en red moderna5 Empe%aremos instalando el repositorio mediante el siguiente comando:
26
sudo a!t0get install cu!s
Una ve% se instale la aplicacin de!emos darle permisos& de este modo podr; administrar las impresoras y enviarles los documentos a imprimir5 sudo usermod 0a 0G l!admin !i
El programa por defecto solo de"a ue las impresoras sean administradas de forma local& pero si modificamos el fic6ero de configuracin del programa& podemos acceder al fic6ero con el siguiente comando: sudo nano 1etc1cu!s1cu!sd-conf
Una ve% dentro del fic6ero podemos empe%ar modificando algunos valores para ue ueden de la siguiente manera: Y nly listen for connections from t6e local mac6ine5 9isten ]:HG0 9isten 7var7run7cups7cups5socB Y 4estrict access to t6e server555 `9ocation 7W rder allo8&deny (llo8 0K.50HJ505] `79ocationW Y 4estrict access to t6e admin pages555 `9ocation 7adminW rder allo8&deny (llo8 0K.50HJ505] `79ocationW Y 4estrict access to configuration files555 `9ocation 7admin7confW (ut6Type Default Y 4euire user S_STE) (llo8 0K.50HJ505] rder allo8&deny `79ocationW Una ve% modificado el fic6ero& ya podemos acceder a nuestro servidor de impresin desde cualuier punto de la red& solo tenemos ue utili%ar la url 0K.50HJ5050H:HG05
27
Internet de las cosas: Desarrollo de un servidor Domótico
Ilustración 25: aptura de pantalla ups
_a slo nos ueda configurar nuestra impresora& solo tenemos ue conectarla a nuestra 4asp!erry a trav,s del puerto US< y configurarla en el apartado impresoras del men' de -UPS5 (6ora vamos a instalar 8ncloud& ue es un servicio ue nos proporcionar; nuestra propia nu!e personal5 $racias a esto podremos almacenar en nuestro servidor toda la informacin ue ueramos& v=deos& m'sica& im;genesM 8ncloud es una aplicacin 8e! !asada en P?P y de li!re distri!ucin& es una 6erramienta muy 'til ya ue es compati!le con la mayor=a de las !ases de datos para facilitar su implantacin5 Esta aplicacin no solo nos proporciona un almacenamiento seguro de nuestros datos& tam!i,n podemos encontrar en su 8e! gran cantidad de plugins ue facilitan la eLperiencia del usuario& como un reproductor multimedia online& un calendario de eventos& un visor de arc6ivos o la posi!ilidad de administrar usuarios y grupos5 Para poder instalar la aplicacin& antes de!emos de instalar una serie de li!rer=as necesarias para e"ecutarla& mediante el comando: sudo a!t0get install !(!708son !(!02ml0!arser !(!70gd curl libcurl@ libcurl@0dev
-uando se instalen todas las li!rer=as& solo de!emos de movernos 6asta el directorio 7var7888 y descargar el arc6ivo comprimido de la aplicacin ue podemos encontrar en la p;gina 8e! oficial5 Una ve% descomprimido slo tenemos ue configurarlo& los comandos utili%ados son: cd 1var1www sudo wget download-owncloud-org1community1owncloud07-=-=-tar-b, tar 028f owncloud07-=-=-tar-b, sudo c(own 0 www0data:www0data 1var1www
Para configurarlo de!emos de acceder al arc6ivo de configuracin de P?P y modificar el tama*o m;Limo de arc6ivo ue se puede su!ir al servidor& de este modo eliminaremos la restriccin de J) ue viene por defecto en la instalacin de P?P5 Para llevar a ca!o esta configuracin de!emos cam!iar el par;metro siguiente: sudo nano 1etc1!(!71a!ac(e,1!(!-ini Ma2imum sie of P'%T data t(at P;P will acce!t Its value may be = to disable t(e limit- It is ignored if P'%T data reading is disabled t(roug( enable4!ost4data4reading (tt!:11!(!-net1!ost0ma20sie !ost4ma24sie < *=====M
28
Ilustración 26: Captura pantalla de registro Owncloud
Podremos acceder a nuestra nu!e a trav,s de la url 0K.50HJ5050H7o8ncloud& la primera ve% ue accedamos al servicio tendremos ue configurar la !ase de datos y el usuario ue vamos a utili%ar para administrar y configurar el servicio5 Primero de!eremos crear una !ase de datos nueva con P6p)y(dmin& luego podremos usar la interfa% del o8ncloud para utili%arla para guardar la informacin acerca de los usuarios5 El espacio de almacenamiento en el sistema es algo ue nos preocupa& pero este sistema nos permite en el apartado de configuracin ampliar el tama*o de nuestra nu!e utili%ando todo clase de dispositivos& en nuestro caso vamos a utili%ar un servidor @(S ue tenemos en la red y ue ser; perfecto para almacenar nuestros datos5
Ilustración 27: Captura pantalla principal Owncloud
tra aplicacin muy interesante y ue nos ser; 'til para el sistema de alertas y avisos es )utt5 )utt es un cliente de correo electrnico& para sistemas U@I> y de li!re distri!ucin& ue funciona a trav,s de comandos introducidos por consola5 Esto nos ser; muy 'til para crear un sistema de alertas ue podremos utili%ar para o!tener correos regularmente& con auella informacin ue creamos pertinente& en este caso avisaremos de las nuevas incorporaciones al servidor y avisar en caso de ue se supere cierta temperatura5 Para instalarlo !asta con e"ecutar el siguiente comando y crear el fic6ero de configuracin: sudo a!t0get install mutt sudo nano 1root1-muttrc
Una ve% dentro del fic6ero de!emos de a*adir los siguientes par;metros : set from nuestro)ailgmail5com set realname [Identificador de remitente[ set imapXuser nuestro)ailgmail5com • • •
29
Internet de las cosas: Desarrollo de un servidor Domótico
• • • • • • • • •
set imapXpass [pass8ord[ set folder [imaps:77imap5gmail5com:KKG[ set spoolfile [RI@<>[ set postponed [Rb$mail7Drafts[ set 6eaderXcac6e 75mutt7cac6e76eaders set messageXcac6edir 75mutt7cac6e7!odies set certificateXfile 75mutt7certificates set smtpXurl [smtp:77 nuestro)ailsmtp5gmail5com:3J7[ set smtpXpass [pass8ord[
De este modo podemos utili%ar nuestra cuenta de correo de $mailQ para enviar correos desde nuestra 4asp!erry5 Solo tenemos ue introducir nuestros datos de configuracin y podremos enviar correos electrnicos desde el terminal de 9inuL con el siguiente comando: ec(o BMensa8eB mutt 0s BAsuntoB cuenta5estino)gmail-com
Para terminar vamos a instalar la aplicacin )otion& este soft8are gratuito permite la visuali%acin y configuracin de 8e!cams US< a trav,s de la red5 Este programa es compati!le con una gran variedad de modelos de 8e!cam& es compati!le tanto con las !ase de datos )ySF9 como PostgreSF9 aunue en este tra!a"o no se va a utili%ar dic6a configuracin5 El programa funciona reali%ando capturas de pantallas a trav,s de la 8e!cam y pu!lic;ndolas en el puerto ue ueremos& una ve% conectado el servicio solo de!emos utili%ar una etiueta `imgWQ escuc6ando el puerto configurado para ver a tiempo real lo ue est; sucediendo5 Para instalarlo solo tenemos ue conectar la 8e!cam al US< de nuestra 4asp!erry y e"ecutar los siguientes comandos: sudo a!t0get u!grade sudo a!t0get install motion
Una ve% instalada la nueva aplicacin slo tenemos ue configurarla para ue se a"uste a nuestro sistema5 Para ello podemos usar el comando siguiente para acceder al fic6ero de configuracin de la aplicacin5 sudo nano 1etc1motion1motion-conf
Dentro de este arc6ivo tenemos ue cam!iar los siguientes par;metros: • •
•
•
•
•
De!emos de activar el demonio con el par;metro Daemon on Snaps6otXinterval nos permite seleccionar cada cuanto tiempo se reali%an las capturas de pantallas por parte del programa& para este proyecto se 6a elegido ue se tome una imagen cada segundo Asnaps6otXinterval 0C5 e!camXport au= podemos seleccionar el puerto ue ueremos para mostrar las im;genes5 e!camXlocal6ost off& es muy importante des6a!ilitar esta opcin para poder acceder a servicio desde cualuier punto de la red5 -ontrolXport a diferencia del anterior& este puerto nos dar; acceso a la interfa% de control del programa5 -ontrolXlocal6ost off& des6a!ilitando esta opcin podremos configurar de forma remota el servicio5
-uando lo tengamos todo instalado y configurado solo tenemos ue lan%ar el servicio& como es posi!le ue encendamos y apaguemos la 4asp!erry& vamos a asegurarnos de ue cada ve% ue encendamos nuestra tar"eta se levante el servicio autom;ticamente5 Para reali%ar esta tarea
30
vamos a modificar el arc6ivo rc5local y a*adiremos la instruccin ue levanta el servicio5 Podemos acceder al fic6ero con la instruccin: sudo nano 1etc1rc-local
(l final del arc6ivo de!eremos de a*adir la siguiente instruccin: sudo motion 3n
353 -digo (rduino Para la programacin de todos los cdigos ue se utili%an dentro de los microcontroladores (rduino vamos a utili%ar el IDE oficial& ue podemos encontrar en la p;gina 8e! de la organi%acin5 Es un programa muy sencillo y ligero ue nos facilita la compilacin de los cdigos y la correccin de nuestros cdigos5
Ilustración 2&: aptura I9E Arduino
Ilustración 2(: aptura de la librera Ethernet
(ntes de empe%ar a programar tenemos ue 6acer un cam!io dentro de las li!rer=as ue vienen por defecto en este programa5 De!emos de modificar el tama*o m;Limo de mensa"e ue permite enviar esta li!rer=a dentro de un mensa"e UDP5 Por defecto el tama*o est; limitado a .1 !ytes& una ve% cam!iando a G// tendremos un tama*o lo suficientemente grande como para enviar los mensa"es ue sean necesarios desde nuestra (rduino5 El fic6ero de ca!eceras ue vamos a modificar se encuentra en el directorio de instalacin del programa& dentro de la siguiente ruta: Arduino1Contents1esources1Dava1libraries1&t(ernet1&t(ernet$d!-(
Esta li!rer=a ue es compati!le con la s6ield Et6ernet ue estamos utili%ando& para dar soporte a nuestra (rduino5 Esta li!rer=a complementa la !;sica Et6ernet y nos permite comunicarnos con la s6ield de eLpansin y utili%ar la comunicacin UDP5 Et6ernet nos permite asignar a nuestra
31
Internet de las cosas: Desarrollo de un servidor Domótico
(rduino las direcciones IP y )(-& cuando se conecte a la red& el router utili%ar; esta direccin para enviar el tr;fico5 Por otro lado Et6ernetUdp nos permite escuc6ar el puerto ue ueramos para reci!ir mensa"er=a UDP5 (dem;s de esta li!rer=a tam!i,n vamos a utili%ar las li!rer=as D?T y Servo5 9a li!rer=a Servo viene incluida entre las li!rer=as del programa& esta li!rer=a nos permite configurar un servomotor en uno de los pines de nuestra tar"eta y controlarlo5 -a!e destacar la funcin 8riteAInt valorCQ& ue nos permite modificar el ;ngulo de nuestro servomotor5 9a li!rer=a D?T es una li!rer=a eLterna& desarrollada para el mdulo D?T00 ue usaremos en este proyecto5 Esta li!rer=a nos la proporciona el propio distri!uidor ue nos vendi el mdulo D?T00& este mdulo toma medidas so!re la temperatura y la 6umedad local5 Vale la pena destacar las funciones read?uminityACQ y readTemperatureACQ& las cuales nos devuelven un string con la 6umedad y la temperatura ue est; registrando el modulo5 El cdigo se 6a dividido lo m;Limo posi!le en funciones& ,stas reali%an tareas concretas como la identificacin o el env=o de informacin5 Se 6a tomado la decisin de usar funciones para desarrollar una li!rer=a& de este modo si en un futuro se necesita desarrollar nuevas funciones& solo ser=a necesario a*adirla al fic6ero5 Dentro de la funcin setupACQ & ue es el cdigo ue se e"ecuta en primer lugar en nuestra (rduino& vamos a declarar todas las varia!les ue ser;n utili%adas a lo largo de todo el programa5 Esta funcin solo se e"ecuta una ve% cuando nuestra tar"eta es alimentada& en nuestro caso : void setupAC myservo5attac6AKC Et6ernet5!eginAmac&ipC Udp5!eginAlocalPortC Udp.5!eginAlocalPort.C Serial5!eginAKH//C id proceso4egistroAC En esta funcin declaramos todos los elementos ue se utili%an en este proyecto& en orden ser=a la declaracin servomotor& la asignacin de IP y la )(- a la s6ield& escuc6ar dos puertos UDP& escuc6ar el puerto serie y asignar a la varia!le idQ la respuesta de la funcin proceso4egistro5 Esta funcin devuelve el valor ue el servidor utili%a para identificar la direccin IP& una ve% ue tengamos este valor ya podemos empe%ar a enviar mensa"es a*adi,ndoles este identificador5 String proceso4egistroAC 86ileAtrueC int pacBetSi%e Udp5parsePacBetAC ifApacBetSi%eC IP(ddress remote Udp5remoteIPAC for Aint i / i ` 1 iRRC ipServidorUdp5remoteIPAC puertoServidorUdp5remotePortAC
32
Udp5readApacBetXP(-NETX)(>XSIEC if AstrcmpApacBetXP(-NETX)(>XSIEC Udp58riteAenv=oC Udp5endPacBetAC int separadorStringApacBet
Slo tenemos ue separar el mensa"e por el delimitador 7Q ue estamos usando& y en funcin de los datos coger o no el valor5 -uando la tar"eta tiene este valor& sale del !ucle y ya est; lista para enviar datos5 tras funciones ue se 6an desarrollado para el sistema son enviarDatosAint numDat& String array bCQ y reci!irDatosACQ5 9a funcin enviarDatos se encarga de e"ecutar todas las instrucciones necesarias para enviar el mensa"e ue le pasamos como par;metro y el n'mero de sensores o actuadores de los ue se dispone5 void enviarDatosAint numDat& String array bC String dat[[ for Aint i/ i ` numDat 2 0iRRC dat R[7[Rarraybi
33
Internet de las cosas: Desarrollo de un servidor Domótico
msg[data7[RidR[7[RnumDatR[[Rdat Udp5!eginPacBetAipServidor&puertoServidorC msg5to-6ar(rrayAenvio&UDPXT>XP(-NETX)(>XSIEC Udp58riteAenv=oC Udp5endPacBetAC
Esta funcin recorre el array con los datos ue le 6emos pasado en funcin al n'mero de datos ue tam!i,n le pasamos5 De esta forma podemos crear un String con el par;metro ue 6a reci!ido& una ve% listo podemos reutili%ar el puerto ue ten=amos creado para identificar el nodo para enviar los datos5 En el par;metro numDat le pasaremos a la funcin el n'mero de sensores y actuadores total de los ue disponemos en el nodo5 En el array vamos a introducir una serie de String ue contiene la informacin de cada uno de los sensores o actuadores5 Por e"emplo en nuestro caso disponemos de un sensor de temperatura& uno de 6umedad y un servomotor& por lo ue nuestra array tendr=a la siguiente estructura: String myStringsb [Temperatura:[RStringAd6t5readTemperatureACC& [?umedad:[RStringAd6t5read?umidityACC& [Servomotor:input:JJJ[ -ada uno de los elementos de los ue disponemos tiene una entrada en esta array& como se puede ver todos los elementos siguen la misma la estructura5 9a estructura ser; utili%ada por el servidor 8e! para darle co6erencia a los datos ue se van a mostrar de modo ue para simplificarla 6emos utili%ado el separador :Q para separar los valores del tipo de medida5 9a estructura var=a en funcin de si se trata de un actuador o un sensor5 Si se trata de un sensor la estructura del mensa"e a utili%ar es: ti!o5eMedida:valorActual
)ientras ue en caso de tratarse de un actuador& la estructura del mensa"e es algo m;s comple"a: 6ombre:in!ut:!uerto
En este caso estamos indicando el nom!re del dispositivo& ue se trata de un dispositivo del tipo actuador gracias al dato inputQ y el puerto donde escuc6ar; a la espera de reci!ir mensa"es UDP con informacin para cam!iar el estado5 9a ra%n de 6a!er declarado dos puertos es precisamente esta& en este caso se 6a utili%ado un servomotor& pero con esta estructura se podr=an controlar todo clase de actuadores como 4el,s o motores5 9a funcin reci!irDatos& ue como se 6a dic6o antes& se utili%a para escuc6ar un puerto a la espera de reci!ir un mensa"e con el contenido adecuado ue modifiue el estado de alg'n actuador es la siguiente: String reci!irDatosAC
34
!oolean reci!idotrue String res [[ int pacBetSi%e Udp.5parsePacBetAC ifApacBetSi%eC IP(ddress remote Udp.5remoteIPAC c6ar pacBetXP(-NETX)(>XSIE[[ Udp.5readApacBetXP(-NETX)(>XSIEC reci!idofalse Udp5flus6AC resStringApacBet
El identificador especificar; el actuador al ue va dirigido el mensa"e& la otra parte contiene el valor ue se 6a enviado5 En el proyecto usaremos este tipo de mensa"es para alterar el ;ngulo de giro del servomotor ue sostiene la c;mara US< ue visuali%amos gracias al servicio )otion& creando una pseudo camaraIP5
35H -digo +ava El cdigo ue se 6a desarrollado utili%ando "ava& actuar; de intermediario entre la red y la !ase datos5 Se encargar; de almacenar los datos una ve% tratados& ue son enviados por los nodos& adem;s de registrar los nodos e identificarlos5 9a idea es desarrollar un demonio ue cree un socBet en un determinado puerto y escuc6e la informacin entrante& este dispondr; de dos 6ilos5 Un 6ilo principal ue trate los mensa"es y a*ada los datos a la !ase de datos& y el otro d, a conocer a los nodos la direccin del servidor5 Se 6an utili%ado varias li!rer=as para desarrollar los diferentes elementos ue conforman el programa& entre ellas ca!e desatacar las siguientes: •
5atagramPac9et: esta li!rer=a nos proporciona todos los constructores necesarios para
usar las instancias5 Estas instancias codificar;n los datos en un mensa"e UDP ue puede ser transmitido& la forma ue tendr=a la instancia es la siguiente: Ilustración 3+: !artes de un *ensa;e <9!
De este modo podemos acceder a cada una de las partes del mensa"e a trav,s de m,todos get5 •
5atagram%oc9et: con esta li!rer=a se nos proporciona todo lo necesario para utili%ar y
crear socBets5 Estos socBets son los encargados de transmitir y reci!ir datagramas UDP5
35
Internet de las cosas: Desarrollo de un servidor Domótico
-uando creemos las instancias de los mensa"es de la li!rer=a DatagramPacBet& ser;n enviados a trav,s del socBet creado gracias a DatagramSocBet5 •
InnetAddress: Es una li!rer=a ue nos ayuda a crear instancias de direcciones IP& algo
ue nos ser; 'til para tratar las direcciones de los nodos cuando se reci!an5
•
Fibrerías %F: las li!ras ue se 6a usado es +D<-& concretamente se import un
arc6ivo sl"d!c5"ar5 Este arc6ivo nos proporciona un con"unto de interfaces y m,todos& con todo lo necesario para esta!lecer y mantener coneLiones entre la !ase de datos y el cdigo +(V(5 9a clase ue se 6a utili%ado para el cdigo tiene ue eLtender de la clase T6readQ& de este modo podremos crear varios 6ilos de e"ecucin en el programa5 De este modo el 6ilo principal estar; en continua e"ecucin tratando los datos& y el 6ilo secundario enviara a los nodos el identificador ue usaran en el sistema5 El 6ilo secundario no permanecer; activo todo el tiempo& puesto ue se e"ecutar; una ve% cada minuto5 try -lass5for@ameA[com5mysl5"d!c5Driver[C5ne8InstanceAC conn Driver)anager5get-onnectionA["d!c:mysl:77local6ost:GG/H76ermes[& [root[& [[C comunicacionSl AStatementC conn5createStatementAC catc6 AInstantiationELception eC e5printStacBTraceAC catc6 AIllegal(ccessELception eC e5printStacBTraceAC catc6 A-lass@ot#oundELception eC e5printStacBTraceAC catc6 ASF9ELception eC e5printStacBTraceAC Para esta!lecer la coneLin con la !ase de datos& primero tenemos ue importar el driver ue nos ayudar; a esta!lecer la coneLin entra am!as tecnolog=as5 Una ve% cargado el DriverQ podemos solicitar una coneLin con la !ase datos mediante el m,todo get-onnectionQ5 Este m,todo espera reci!ir como par;metro la direccin de acceso a la !ase de datos& el usuario de acceso y la contrase*a del usuario5 -omo en este proyecto es el mismo servidor el ue e"ecuta el cdigo lo configuraremos localmente& a trav,s del puerto GG/H y seleccionando la !ase de datos donde 6emos creado las ta!las (rduino y )ediciones5 Una ve% esta!lecida se puede guardar en un o!"eto de tipo StatementQ& para ser utili%ada cuando sea oportuno5
86ileAtrueC DatagramPacBet dgp4ecep ne8 DatagramPacBetAmensa"e4eci!ido& mensa"e4eci!ido5lengt6C socBetEnvio5receiveAdgp4ecepC msg ne8 StringAdgp4ecep5getDataAC&/&dgp4ecep5get9engt6ACC
36
datos4eci!idos msg5splitA[7[C ifAdatos4eci!idosb/5eualsA[iniSess[CC String tipo datos4eci!idosb0 flagfalse int res proceso4egistroAdgp4ecep5get(ddressAC&tipo&dgp4ecep5getPortACC String mensa"e [ident7[Rres !yteb dato mensa"e5get
37
Internet de las cosas: Desarrollo de un servidor Domótico
Inet(ddress5get
38
Para ue sea f;cil de e"ecutar se 6a generado un arc6ivo 5"ar con el cdigo del programa ya compilado para ue pueda ser e"ecutado desde nuestra 4asp!erry5 Para asegurarnos de ue se van a e"ecutar& vamos a a*adir un script ue se encargue de lan%ar el programa5 Este script ser; a*adido al arc6ivo rc5local para ue se e"ecute cada ve% ue reiniciemos la tar"eta5 El arc6ivo lo podemos encontrar en la ruta: 1etc1rc-local
En este arc6ivo a*adiremos la ruta 6acia el siguiente script ue se encargar; de levantar el servicio: YZ7!in7!as6 YScript de reinicio "ava 2"ar 76ome7pi7servidorDomotico5"ar hh
35 -digo de la p;gina e! Por 'ltimo pero no menos importante vamos a 6a!lar acerca de la 8e! ue se utili%a en este proyecto& esta 8e! es muy importante puesto ue actuar; a modo de interfa% gr;fica entre el usuario y el servidor5 Para el desarrollo vamos a utili%ar la estructura principal ue se eLplic en el apartado de an;lisis5 Para cargar el contenido de cada parte del sistema se 6an desarrollado cdigos P?P ue cargan el contenido de cada una de ellas& de esta forma podremos renovar el contenido cuando nos interese5 ?a!lando de la estructura tenemos ue aclarar ue se 6a utili%ado una estructura de directorios determinada& de esta forma podremos mantener la co6erencia entre nuestros cdigos y locali%ar cada tipo de fic6ero en un mismo contenedor5 •
•
•
Directorio css: en este directorio guardaremos auellos arc6ivos ue utilicemos para darle estilo en nuestra 8e!5 En estos arc6ivos aparecer;n refle"ados los identificadores de los diferentes elementos de nuestra 8e!& "usto con el con"unto de reglas ue especifican su aspecto visual en el navegador5 Directorio img: la carpeta al!ergar; todas las im;genes ue aparecer;n referenciadas en nuestra 8e!5
Directorio 8s: en esta carpeta se guardar;n todos los cdigos "avascript ue el usuario se descargar; a trav,s del navegador5 Estos fic6eros contienen todas las funciones ue se pueden utili%ar en los fic6eros de la 8e!5 Estos cdigos se e"ecuta en el navegador del cliente& por lo ue la carga de proceso recae so!re el dispositivo5 Destacar ue 6emos a*adido las li!rer=as de +Fuery para facilitar el acceso a los elementos del documento D)& ue contendr; a la interfa%5 De este modo cuando tengamos ue referenciar cualuier elemento o ueramos reali%ar llamadas (+(>& entre otras muc6as funciones& tendremos ue utili%ar muc6as menos instrucciones simplificando de esta manera el cdigo5 9a tecnolog=a (+(> nos permitir; reali%ar llamadas al servidor y traernos de
39
Internet de las cosas: Desarrollo de un servidor Domótico
este fic6ero concreto& de este modo podremos cargar de manera din;mica los fic6eros P?P5
•
Directorio P;P: este directorio contiene los arc6ivos P?P ue complementan la estructura de la 8e!5 Esos fic6eros devuelven el contenido ue luego ser; introducido en las diferentes partes de la 8e!& al utili%ar estos fic6eros "unto a la tecnolog=a (+(> mantendr;n los datos de la 8e! a tiempo real5
Para la estructura principal del documento se 6an dise*ado los elementos lista(rduinosQ& lista)odulosQ& 6eaderQ y alta(rduinoQ5 El nom!re de estos elementos corresponde al identificador ue utili%amos el cdigo ?)T9 para identificarlos5 Estos elementos se 6an etiuetado !a"o la etiueta divQ tienen asociado un estilo en a los arc6ivos css ue puede ser modificado en cualuier momento de manera r;pida5 FistaArduino es un elemento div ue corresponde a la %ona ro"a del dise*o ue se presenta en
el apartado de an;lisis5 Este !loue contendr; la lista de contenedores (rduino de los ue se disponga en la !ase de datos& estos contenedores corresponden al nom!re ue le damos al nodo cuando terminamos el registro de mismo en la 8e!5 De este modo podemos asociar varios nodos a un identificador de grupo& esto es muy 'til si por e"emplo ueremos asociar varios nodos a un mismo lugar como es nuestro caso5 Esta %ona contendr; una lista de elementos ue podremos pulsar para ue en la 8e! slo apare%can los elementos asociados a ese identificador& estos elementos como el contenedor& tienen asociados cdigos css ue lo mantienen en la parte i%uierda de la pantalla ocupando la totalidad del alto de esta5 En caso de ue la lista de elementos supere el tama*o del alto de la pantalla se utili%a un scroll para tratar el pro!lema de des!ordamiento5 9a lista de elementos identificador se carga mediante una llamada a la siguiente funcin "avaScript:
+uncin cargarArduinos() ./aa(-url arduinosist/4h4, t"4e get, success +uncin (res4onse) .(listaArduinos)/a44end(res4onse)88)8 Esta funcin utili%a la li!rer=a "Fuery para llamar desde el navegador cliente un fic6ero P?P y esperar; a ue ,ste le devuelva los datos ue posteriormente ser;n utili%ados para rellenar el elemento lista(rduino5 El arc6ivo P?P 6ace una llamada a la !ase de datos y se trae los datos asociados a los nodos5
.9uer" : SEE;' no?!re>),>id> @RM >Arduino>
40
$racias a esta sentencia sl podemos devolver el nom!re de todos los nodos asociados& pero devolviendo una entrada por cada campo de tipo nom!re5 -omo este campo puede tener varias entradas id,nticas dentro de la ta!la& slo devolver; uno por cada grupo5 Una ve% ue tengamos los elementos ue tenemos ue introducir los introducimos dentro de elementos divQ en los cuales atraparemos el evento onclicB5 -ada uno de estos elementos est; asociado a un clase referenciada dentro del arc6ivo de estilos css& de este modo cuando se realicen cam!ios est,ticos so!re la 8e!& se aplicar;n a todos los elementos simult;neamente5 (l atrapar el evento onclicB& podemos e"ecutar una funcin "avascript ue cam!iar; el contenido de la 8e! por los nodos asociados a este identificador5
BdiC class:listado onclicD:arduinoEs4ecica(&5)F Este es aspecto de la lista de elementos ue devolver; el arc6ivo arduino9ista5p6pQ5 9a funcin a la ue llamamos cuando un usuario pulsa so!re el elemento& llama al arc6ivo modulos9ista5p6pQ& pas;ndole como par;metro el identificador de elemento pulsado para ue cam!ie los nodos ue aparecen en la 8e! sin recargar la p;gina5
Ilustración 31: aptura de la lista de Arduinos
;eader es el elemento div ue corresponde a la %ona a%ul del dise*o ue se presenta!a en la
parte de an;lisis5 En esta %ona se colocan todos los servicios de los ue dispondr; nuestro servidor& en este caso vamos a poner enlaces para el servicio -UPS& 8ncloud y configuracin de la 8e! cam5 Se 6a dise*ado una estructura sencilla de ?T)9 donde podemos colocar la
41
Internet de las cosas: Desarrollo de un servidor Domótico
informacin de los servicios5 Este cdigo es replica!le& por lo ue en caso de a*adir nuevos servicios& !asta con copiar la estructura con los datos asociados a ese servicio5
Ba hre+:FBi?g class:serCicioEterno src:i?gGFBGaF Para a*adir el servicio solo tenemos ue a*adir la direccin local6ost:Q con el puerto asociado a este y una imagen& para darle estilo dentro de la 8e! se 6a creado una clase espec=fica para estos iconos5 Esta imagen es el icono ue aparecer; en el men' para enla%ar la 8e! con el servicio5
Ilustración 32: aptura del *en6 de la pgina eb
listaArduino corresponder; a la %ona verde del esuema& en esta %ona es donde aparecer; la
informacin asociada a cada uno de los nodos ue conectemos a nuestra red5 Se 6a desarrollado un funcin en +avaScript ue cargar; el contenido de este elemento div5
+uncin cargarModulos() ./aa( url ?odulosist/4h4, t"4e get, success +uncin (res4onse) .(listaModulos)/a44end(res4onse)
88)8
En este caso se 6ace una llamada al arc6ivo modu9ist5p6pQ sin pasarle ning'n par;metro& por lo ue devolver; el todos los nodos ue se encuentren en la !ase de datos5 9os elementos ue devuelve este arc6ivo siguen una estructura determina& cada parte tiene asociada una de las dos clases de las ue se dispone sensorQ y actuadorQ5
42
Ilustración 33: aptura de un nodo de la pgina eb
-omo se puede apreciar lo ue m;s llama la atencin es la imagen ue se encuentra en el mdulo& en este caso se 6a puesto un enlace al puerto del servicio ) otion5 De esta forma tendremos una c;mara ip ue podremos controlar& ya ue en este proyecto 6emos montado la 8e!cam so!re un servomotor ue podremos mane"ar desde la p;gina 8e!5 En caso de ue ueramos cam!iar la imagen asociada a cada elemento& solo tenemos ue e"ecutar una funcin ue cam!ie la imagen5 -omo el cdigo "avaScript puede e"ecutarse tanto mientras se carga la p;gina& como cuando ya est; cargada& solo tenemos ue introducirla "usto despu,s de cerrar el div lista(rduino5 -omo se puede ver se ven dos tipos de datos dentro del nodo& dos de ellos corresponden a un sensor y el otro a'n actuador5 En este caso los datos ue se est;n mostrando son los datos reci!idos del mdulo ?DT00 ue se utili%a para medir la temperatura y la 6umedad am!iental& el actuador ue corresponde al servomotor ue se sit'a de!a"o de la 8e!cam5 9os datos del sensor son tratados antes de ser mostrados& para conseguir una representacin de la temperatura m;s realista5 9a funcin encargada de a*adir los datos asociados a los sensores de este tipo aplica la media& o!tiene las 'ltimas 3 medidas ue se 6a a*adido ese sensor para o!tener una visin del sensor m;s representativa y no estar mostrando la temperatura moment;nea5
Hhile (.la2 : ?"s9lI+etchIassoc(.result2)) i+ (.la2JCalor1K L: ) .arra"Au : s4lit(, .la2JCalor1K) .claCe1:.arra"AuJ0K arra"I4ush(.cont1, .arra"AuJ1K) 8
43
Internet de las cosas: Desarrollo de un servidor Domótico
i+ (.la2JCalor2K L: ) .arra"Au : s4lit(, .la2JCalor2K) .claCe2:.arra"AuJ0K arra"I4ush(.cont2, .arra"AuJ1K) 8 i+ (.la2JCalor3K L: ) .arra"Au : s4lit(, .la2JCalor3K) .claCe3:.arra"AuJ0K arra"I4ush(.cont3, .arra"AuJ1K) 8 i+ (.la2JCalor&K L: ) .arra"Au : s4lit(, .la2JCalor&K) .claCe&:.arra"AuJ0K arra"I4ush(.cont&, .arra"AuJ1K) 8
8 Para llevar a ca!o el c;lculo de la media& la funcin crea un array !idimensional relacionando los campos de tipo valor y los valores asociados5 -uando tenemos este array !asta con recorrerlo acumulando los diferentes sumatorios y dividir entre el n'mero de elementos del array interior5 El formato de los actuadores por el contrario consta de un peue*o formulario donde introducir los datos5 Para enviar la informacin !asta con rellenar el campo de teLto con los datos ue ueramos enviar y pulsar el !otn5 -uando se e"ecuta el formulario se e"ecuta la siguiente funcin:
+uncin enCiar;a?!io(datos)
Car Calor : .(CalorI%datos)/Cal() alert(el Calor es %Calor) Car no?!re : .(no?!reI%datos)/Cal() ./aa(data datos:%datos%?od:%no?!re%Calor:%Calor, url ?ensaeArduino/4h4, t"4e get, success +uncin (res4onse) 88)8
Esta funcin tam!i,n utili%a de la tecnolog=a (+(> para llamar al arc6ivo mensa"e(rduino5p6pQ5 (l contrario ue otros fic6eros anteriormente comentados este no devolver; informacin ue modifica el estado de la p;gina sino el de nuestro nodo5 $racias a la
44
eLtens=sima (PI de P?P& se 6a utili%ado esta llamada para crear un socBet UDP y enviar un mensa"e Arespetando la estructura utili%adaC al nodo5
.la : ?"s9lI+etchIassoc(.result) .socD : socDetIcreate(A@I<=E', S;NI*RAM, SIO#) .?sg : /.I*E'J?odK/G/.I*E'JCalorK .len : strlen(.?sg) echo la i4 es /.laJi4K/ el 4uerto /.laJ4uertoK socDetIsendto(.socD, .?sg, .len, 0, .laJi4K,PPP7GQ.laJ4uertoKQG) socDetIclose(.socD) $racias a las funciones socBet& no tenemos por u, comunicar el cdigo de la 8e! con el cdigo "ava del servidor5 De esta forma conseguimos un acceso directo 6asta los nodos& gracias a la informacin ue se o!tiene de la !ase de datos& y reducimos el consumo de recursos de nuestra 4asp!erry& al a*adir m;s carga al cdigo +(V(5 Por 'ltimo aclarar ue se utili%a la funcin setInterval para e"ecutar funciones cada cierto tiempo& entre ellas se encuentran las funciones ue cargan los nodos y los identificadores para mantener los datos actuali%ados a tiempo real5 altaArdiono corresponde a la se*al de color naran"a ue pod=a verse en el esuema ue se
presenta durante el an;lisis de la p;gina 8e!5 Este elemento no es visi!le en la 8e! de forma 6a!itual& como anteriormente se eLplica!a se 6a utili%ado un setInterval para e"ecutar de forma constante ciertas funciones para este elemento es muy importante nuevosElementosQ5 Esta funcin se e"ecuta cada cierto tiempo& es muy sencillo de modificar so!re el cdigo& reali%a una llamada (+(> para compro!ar si eListen nuevos nodos sin dar de alta en el servidor5
+uncin nueCosEle?entos() ./aa( url nueCosEle?entos/4h4, t"4e get, success +uncin (res4onse) i+ (res4onse L: 0) .(aCiso)/css(dis4la",inline) 888)8 Esta funcin es diferente a las anteriores& en este caso cuando el cdigo P?P se e"ecuta sin devolver nada de informacin significa ue no 6ay nuevos nodos conectados en la red5 Pero en caso de ue ese cdigo devuelva informacin se 6ar; visi!le el aviso ue indicar; al usuario ue tiene informacin ue configurar5
45
Internet de las cosas: Desarrollo de un servidor Domótico
Ilustración 34: Icono alerta de la pgina eb
-uando el usuario pulsa so!re el icono ue aparece en la esuina superior i%uierda se e"ecuta la funcin dar(ltaQ5 Esta funcin 6ace aparecer un !loue de configuracin con una animacin desli%ante desde la i%uierda5 9a informacin de este formulario se rellena mediante otra funcin (+(>5
+uncin dareAlta() clear
Ilustración 35: aptura del *en6 de registro de nodos
Slo 6ay ue rellenar el campo del nom!re& ue es el identificador ue usamos para agrupar (rduinos y estar; listo5 -uando se refrescan los datos de la 8e! aparecer; este nuevo elemento aparecer; con el resto de datos y desaparecer; el men' de configuracin "unto con la alerta de nuevo nodo5
35J -ronta!
46
El cronta! es un fic6ero ue se encuentra en los servidores y permite e"ecutar scripts o P?P regularmente5 Esto nos es muy 'til para e"ecutar funciones ue actuar;n a modo de alertas& en este proyecto vamos a e"ecutar dos script5 Un script se e"ecutar; cada minuto y consultar; la 'ltima medida introducida& en caso de ue ,sta supere el tope introducido nos enviar; un correo electrnico avis;ndonos del pro!lema5 El otro cdigo se e"ecutar; una ve% a la semana y nos informara de los 'ltimos cam!ios producidos en la red5 crontab 3e
Esta funcin nos permite entrar dentro del fic6ero para configurar la e"ecucin de nuestros scripts5
Ilustración 3": aptura de pantalla del 7ichero crontab
En este arc6ivo podemos e"ecutar toda clase de acciones en el servidor& como por e"emplo !acBups de seguridad o toda clase de alertas o actuali%aciones5 El cdigo P?P ue se e"ecuta es un con"unto de cdigo P?P y !as65 Utili%aremos el P?P para o!tener la informacin de la !ase de datos ue nos interesa y rellenar la informacin del mensa"e ue luego se le pasa a la funcin s6ellXeLecQ& ,sta e"ecutar; los comandos necesarios para utili%ar el gestor de correo para enviar mensa"es al correo electrnico5
35K )anual de usuario Para utili%ar este servidor slo tenemos ue utili%ar las funciones (rduino dise*adas para configurar el esuema de nuestro nodo y las li!rer=as necesarias5 Una ve% ue inicialicemos el identificador del nodo gracias a la funcin proceso4egistroACQ utili%ando la varia!le idQ& podemos utili%ar las otras funciones para reci!ir datos o enviarlos dependiendo de la utilidad ue ueramos darle a nuestro nodo5 9os datos ue son enviados al servidor 6an de seguir la estructura ue se eLpon=a anteriormente& para mantener la co6erencia de datos en el servidor5 Una ve% listo y cargado el cdigo en nuestra (rduino& solo tenemos ue conectarla a la red5 El servidor se encargar; de registrar la direccin IP y el puerto del nodo para ser configurado
47
Internet de las cosas: Desarrollo de un servidor Domótico
posteriormente5 Si entramos en la 8e! podemos ver ue aparecen los datos asociados al nodo& pero este no tiene datos asociados5 Tras esperar dentro de la 8e! 0 minuto podemos ver ue nos aparece una se*al ue nos indica ue se 6a detectado un nuevo nodo5
Ilustración 3%: aptura de pantalla= a.iso pgina eb
Si pulsamos so!re el icono de coneLin ue 6a aparecido en la parte superior i%uierda nos aparecer; un formulario& mediante una funcin desli%ante5 En este formulario se configura el identificador de grupo del nodo ue aca!amos de conectar5
Ilustración 3&: aptura de pantalla= *en6 de con7iguración de nodo
48
Vamos a utili%ar el nom!re -)ED4Q para identificar este mdulo5 -uando mandamos los formularios& con el fin de ue se e"ecute en el servidor el p6p ue a*ade la nueva configuracin al nodo5 Tras enviar la informacin se nos recargara la p;gina con la nueva informacin5
Ilustración 3(: aptura de pantalla= pgina eb con7igurada
Una ve% 6ec6o esto ya est; el nuevo nodo configurado dentro de nuestro servidor5 De esta forma ya est; listo para enviarle la informacin ue ueramos o ver los datos ue est; enviando5
49
Internet de las cosas: Desarrollo de un servidor Domótico
H -onclusiones En conclusin este es un tra!a"o con muc6o potencial ue puede eLplotarse de muc6as maneras5 Este proyecto a!re la puerta a la imaginacin del desarrollador& por un lado permite ue podamos tener conectados toda clase de elementos de nuestra vida cotidiana a nuestra red como las luces del comedor o la cafeter=a5 Es tan sencillo como conectar un rel, a una (rduino y podremos activarlos o desactivarlos desde cualuier lugar del mundo5 Esto es algo fascinante& el 6ec6o de ue podamos conectar la cafetera al despertarnos por la ma*ana& parece digno de estudio5 (l ver el proyecto terminado me 6e dado cuenta de ue se tom la decisin correcta en lo ue se refiere al uso de apac6e5 9a decisin de no usar servlets para comunicar el cdigo 8e! y el cdigo "ava podr=a 6a!er generado muc6os pro!lemas5 -omo 6emos utili%ado ?T)9 para el contenido de la 8e! y se 6an importado todas las li!rer=as "Fuery& se me ocurren millones de posi!ilidades para utili%ar el formulario ue nos proporciona el servidor5 Por e"emplo en caso de ue tengamos un actuador ue encienda las luces del comedor& se pueden a*adir funciones ue modifiuen el aspecto del formulario5 -omo este cdigo se e"ecuta so!re el navegador del cliente no nos preocupa de ue se so!recargue nuestro servidor& por lo ue cualuier modificacin ue se 6aga no afectara al funcionamiento del servidor5 En mi opinin a este servidor le faltan muc6as me"oras& como activar el puerto de ?TTPS para cifrar el trafico 8e! en caso de ue alguien esp=e nuestra red& cerrar todos los puertos ue puedan suponer un pro!lema en caso de un ataues maliciosos& configurar el cortafuegos ue podemos instalar en nuestra tar"eta tratando todo el tr;fico entrante y saliente& crear un sistema de usuarios y permisos para limitar el acceso a determinadas partes o me"orar el sistema de alertas5 ?a sido una l;stima no contar con presupuesto para pro!ar la 'ltima versin de 4asp!erry& me 6u!iera gustado poner a prue!a el nuevo 6ard8are5 Es muc6o m;s potente ue la ue se 6a utili%ado para este proyecto al contar con un procesador de 1 n'cleos y 0 $< de 4()& lo ue supondr=a un mayor rendimiento en el servidor5 En resumen 6e disfrutado muc6o con el desarrollo de este proyecto& me 6a parecido un tema interesant=simo con un potencial incre=!le5 Puede ser un primer paso para a!rir las puertas a un futuro en el ue tendremos control de toda clase cosas como plantas o cerraduras5
50
51
Internet de las cosas: Desarrollo de un servidor Domótico
J (neLos J50 #uncin de registro A(rduinoC String 4rocesoRegistro() Hhile(true) int 4acDetSie : Od4/4arse#acDet() i+ (4acDetSie) <#Address re?ote : Od4/re?ote<#() i4SerCidor:Od4/re?ote<#() 4uertoSerCidor:Od4/re?ote#ort() Od4/read(4acDet$uer,O#I'TI#A;NE'IMATIS
J5. #uncion para enviar datos A(rduinoC Coid enCiaratos(int nu?at, String arra" JK) String dat:
52
+or (int i:0 i B: nu?at V 1i%%) dat %:G%arra"JiK 8 ?sg:dataG%id%G%nu?at%%dat Od4/!egin#acDet(i4SerCidor,4uertoSerCidor) ?sg/to;harArra"(enCio,O#I'TI#A;NE'IMATIS
J5G #uncin para reci!ir datos A(rduinoC String reci!iratos() Serial/4rintln(entra?os reciCir) !oolean reci!ido:true String res : int 4acDetSie : Od42/4arse#acDet() i+ (4acDetSie) -
<#Address re?ote : Od42/re?ote<#() char 4acDet$uer2JO#I'TI#A;NE'IMATIS
J51 -digo "ava i?4ort aCa/io/<Ece4tion i?4ort aCa/net/atagra?#acDet i?4ort aCa/net/atagra?SocDet i?4ort aCa/net/
53
Internet de las cosas: Desarrollo de un servidor Domótico
i?4ort aCa/net/OnDnoHnXostEce4tion i?4ort aCa/s9l/;onnection i?4ort aCa/s9l/riCerManager i?4ort aCa/s9l/SYEce4tion i?4ort aCa/util/ate i?4ort co?/?"s9l/d!c/ResultSet i?4ort co?/?"s9l/d!c/State?ent 4u!lic class SerCidor etends 'hread 4riCate static int 4uertoArduino:PPPP 4riCate static atagra?SocDet socDetEnCio 4riCate String id 4riCate static String ?sg 4riCate static StringJK datosReci!idos 4riCate static State?ent co?unicacionS9l 4riCate static ResultSet res4uestaS9l 4riCate static ;onnection conn 4riCate static !oolean Wag : true 4u!lic static Coid ?ain(StringJK args) tr" tr" ;lass/+or=a?e(co?/?"s9l/d!c/riCer)/neH
54
Hhile(true) atagra?#acDet dg4Rece4 : neH atagra?#acDet(?ensaeReci!ido, ?ensaeReci!ido/length) socDetEnCio/receiCe(dg4Rece4) ?sg : neH String(dg4Rece4/getata(),0,dg4Rece4/getength()) datosReci!idos : ?sg/s4lit(G) i+ (datosReci!idosJ0K/e9uals(iniSess)) String ti4o : datosReci!idosJ1K Wag:+alse S"ste?/out/4rintln(#roceso de registro) int res : 4rocesoRegistro(dg4Rece4/getAddress(),ti4o,dg4Rece4/get#ort()) String ?ensae :identG%res !"teJK dato : ?ensae/get$"tes() atagra?#acDet dg4 dg4 : neH atagra?#acDet(dato, dato/length,
55
Internet de las cosas: Desarrollo de un servidor Domótico
aCa/util/ate +echa : neH ate() String s9l:<=SER' <=' >Mediciones>( >arduino, >4ara?etros>, >Calor1>, >Calor2>, >Calor3>, >Calor&>, >+echa>) ZAOES (%id%,%cont%%datos%,%+echa%) co?unicacionS9l/eecuteO4date(s9l) 8 8 8 catch (SocDetEce4tion e) S"ste?/out/4rintln(@allo al crear el socDet) S"ste?/out/4rintln(e) 8 catch (Securit"Ece4tion e) S"ste?/out/4rintln(@allo de seguridad) S"ste?/out/4rintln(e) 8 catch (<Ece4tion e) GG ' AutoVgenerated catch !locD e/4rintStacD'race() 8 catch (SYEce4tion e) GG ' AutoVgenerated catch !locD e/4rintStacD'race() 8 8 4u!lic Coid run() String ?ensae : id !"teJK dato : ?ensae/get$"tes() atagra?#acDet dg4 tr" Hhile (true) dg4 : neH atagra?#acDet(dato, dato/length,
56
e/4rintStacD'race() 8 catch (i4>:%i4/toString()/re4lace(G, )% res4uestaS9l : (ResultSet) co?unicacionS9l/eecuteYuer"(s9l) res4uestaS9l/net() i+ (res4uestaS9l/getArduino>(>ti4o>, >i4>,>4uerto>) ZAOES (%ti4o%,%i4/toString()/re4lace(G, ) %,%4uerto%) co?unicacionS9l/eecuteO4date(s9l) s9l : SEE;' id @RM Arduino [XERE >i4>:%i4/toString()/re4lace(G, )% res4uestaS9l : (ResultSet) co?unicacionS9l/eecuteYuer"(s9l) res4uestaS9l/net() return i4>:%i4/toString()/re4lace(G, )% res4uestaS9l : (ResultSet) co?unicacionS9l/eecuteYuer"(s9l) res4uestaS9l/net() return
57
Internet de las cosas: Desarrollo de un servidor Domótico
e/4rintStacD'race() 8 return 0 return 0 8 8
J53 J53 Serv Servid idor or5p 5p6p 6p AIn AInte terf rfa% a%CC Bht?lF B\4h4 i+ (.I*E') (.I*E') .linD : ?"s9lIconnect(localhost ?"s9lIconnect(localhost,, root root,, )) or die die((=o se 4udo conectar / / ?"s9lIerror()) ?"s9lIselectId!(her?es ?"s9lIselectId!(her?es)) or die die((=o se 4udo seleccionar la !ase de datos) datos) +or (.i:0 +or (.i:0 .i B .I*E'Jnu?ero .I*E'Jnu?eroK K .i%%) .no?!re : no?!re no?!re/.i /.i .id : id id/.i /.i .s9l : O#A'E >Arduino> SE' >no?!re>:/ >no?!re>: / .I*E'J.no?!reK/ .I*E'J.no?!reK/ [XERE >id>:/.I*E'J.idK >id>:/.I*E'J.idK GGecho .s9l/]n ?"s9lI9uer"(.s9l) GGecho .s9l 8 8 \F BheadF B?eta na?e:ti4oIcontenido na?e:ti4oIcontenido content:tetGht?l content:tetGht?l htt4V htt4V e9uiC:contentVt"4e charset:ut+VPF charset:ut+VPF BtitleFSerCidor o?oticoBGtitleF BlinD rel:st"lesheet rel:st"lesheet t"4e:tetGcss t"4e:tetGcss hre+:cssGestilos/cssGF hre+:cssGestilos/cssGF Bscri4t t"4e:tetGaCascri4t t"4e:tetGaCascri4t src:sG9uer"V src:sG9uer"V 1/11/3/?in/sFBGscri4tF Bscri4t t"4e:tetGaCascri4t t"4e:tetGaCascri4t src:sGscri4ts/sFBGs src:sGscri4ts/sFBGscri4tF cri4tF Bscri4t t"4e:tetGaCascri4tF t"4e:tetGaCascri4tF .(docu?ent)/read"(+unction(.)cargarArduinos() cargarModulos() re+rescarACiso:set
58
BGscri4tF BGheadF B!od"F BdiC class:4aginaF BdiC id:listaArduinos class:listaF BcenterF Bi?g src:i?gGArduinIlogo/4ngF BGcenterF BGdiCF BdiC class:headerF Bi?g src:i?gGtitulo/4ng Hidth:3004 st"le:?arginV st"le:?arginV le+t&0^F Bi?g class:serCicioEterno class:serCicioEterno src:i?gGnu!e/4ng src:i?gGnu!e/4ng Hidth:604F Bi?g class:serCicioEternosrc:i?g class:serCicioEternosrc:i?gGi?4resor Gi?4resora/4ng a/4ng Hidth:604F BdiC onclicD:dareAlta() id:aCisoF Bi?g src:i?gGaCiso/4ngFBGdiCF BGdiCF BdiC id:listaModulos class:contenidoFBGdiCF BdiC id:altaArduinoFBGdiCF id:altaArduinoFBGdiCF BGdiCF BG!od"F BGht?lF
J5H mensa"e(rduino5p6p B\4h4 .linD : ?"s9lIconnect(localhost ?"s9lIconnect(localhost,, root root,, )) or die die((=o se 4udo conectar / / ?"s9lIerror()) ?"s9lIselectId!(her?es ?"s9lIselectId!(her?es)) or die die((=o se 4udo seleccionar la !ase de datos) datos) .au: s4lit(V s4lit(V,, .I*E'Jdatos .I*E'JdatosK) K) .9uer" : SEE;' >i4>,>4uerto> @RM >Arduino> [XERE >id>:/.auJ0K/ >id>: /.auJ0K/ .result : ?"s9lI9uer"(.9uer") ?"s9lI9uer"(.9uer") or die die((;onsulta +allida / /
59
Internet de las cosas: Desarrollo de un servidor Domótico
?"s9lIerror()) i+ (?"s9lInu?IroHs(.result) (?"s9lInu?IroHs(.result) L: 0) .la : ?"s9lI+etchIassoc(.result) .socD : socDetIcreate(A@I<=E', S;NI*RAM, SIO#) .?sg : /.I*E'J /.I*E'J?od ?odK/ K/G G/.I*E'J /.I*E'JCalor CalorK K .len : strlen(.?sg) echo la i4 es /.laJ /.laJi4 i4K/ K/ el 4uerto /.laJ /.laJ4uerto 4uertoK K socDetIsendto(.socD, socDetIsendto(.socD, .?sg, .len, 0, .laJi4 .laJi4K,PPP7 K,PPP7GQ.laJ4uertoKQG GQ.laJ4uertoKQG) ) socDetIclose(.socD) 8 \F
J5 modulos9ist5p6p B\4h4 .linD : ?"s9lIconnect(localhost ?"s9lIconnect(localhost,, root root,, )) or die die((=o se 4udo conectar / / ?"s9lIerror()) ?"s9lIselectId!(her?es ?"s9lIselectId!(her?es)) or die die((=o se 4udo seleccionar la !ase de datos) datos ) .9uer" : SEE;' arduino) @RM >Mediciones> >Mediciones> .result : ?"s9lI9uer"(.9uer") ?"s9lI9uer"(.9uer") or die die((;onsulta +allida / / ?"s9lIerror()) i+ (?"s9lInu?IroHs(.result) (?"s9lInu?IroHs(.result) L: 0) Hhile (.la Hhile (.la : ?"s9lI+etchIassoc(.result)) ?"s9lI+etchIassoc(.result)) .s9l : SEE;' Q @RM >Mediciones> [XERE >arduino: >arduino:// .laJarduino+echa> ES;
60
.claCe3: .cont& :arra"() .claCe&: .total:arra"() Hhile (.la2 : ?"s9lI+etchIassoc(.result2)) i+ (.la2JCalor1K L: ) .arra"Au : s4lit(, .la2JCalor1K) .claCe1:.arra"AuJ0K arra"I4ush(.cont1, .arra"AuJ1K) 8 i+ (.la2JCalor2K L: ) .arra"Au : s4lit(, .la2JCalor2K) .claCe2:.arra"AuJ0K arra"I4ush(.cont2, .arra"AuJ1K) 8 i+ (.la2JCalor3K L: ) .arra"Au : s4lit(, .la2JCalor3K) .claCe3:.arra"AuJ0K arra"I4ush(.cont3, .arra"AuJ1K) 8 i+ (.la2JCalor&K L: ) .arra"Au : s4lit(, .la2JCalor&K) .claCe&:.arra"AuJ0K arra"I4ush(.cont&, .arra"AuJ1K) 8 8 i+ (Le?4t"(.cont1)) .totalJ.claCe1K:.cont1 i+ (Le?4t"(.cont2)) .totalJ.claCe2K:.cont2 i+ (Le?4t"(.cont3)) .totalJ.claCe3K:.cont3 i+ (Le?4t"(.cont&)) .totalJ.claCe&K:.cont&
+oreach (arra"IDe"s(.total) as .De") .?edia:0 .sensor:+alse .cont:0 +or (.i:0 .i B count(.totalJ.De"K) .i%%) i+ (LisInu?eric(.totalJ.De"KJ.iK)) i+ (.totalJ.De"KJ.iK :: in4ut) .cont%% .actuador : BdiC class
61
Internet de las cosas: Desarrollo de un servidor Domótico
: ]sensor]FBcenterF/.De"/ Bin4ut id:]no?!reI/ .laJarduino
J5J
nuevosDatos5p6p
B\4h4 .linD : ?"s9lIconnect(localhost, root, ) or die(=o se 4udo conectar / ?"s9lIerror()) ?"s9lIselectId!(her?es) or die(=o se 4udo seleccionar la !ase de datos) .9uer" : SEE;' Q @RM >Arduino> [XERE >no?!re>:]] .result : ?"s9lI9uer"(.9uer") or die(;onsulta +allida / ?"s9lIerror())
62
echo B+or? id:]+or?AltaArduino] onsu!?it:]return Calidacion(/?"s9lInu?IroHs(.result)/ )] FBeldsetF .cont:0 Hhile (.la : ?"s9lI+etchIassoc(.result)) echo BdiC class]identicador]FEl identicador asignado es / .laJidK/BGdiCF echo BdiC class]identicador]FEl ti4o es / .laJti4oK/BGdiCF echo BdiC class]identicador]Fa i4 es /.laJi4K/BGdiCF echo A`ada un no?!re 4ara ter?inar registro echo BcenterF echo Bin4ut t"4e:]tet] id:]no?!re/.cont/] na?e:]no?!re/.cont/] Calue:]]F echo BGcenterF echo Bin4ut t"4e:]hidden] na?e:]id/.cont/] Calue:]/ .laJidK/]F echo B!rF .cont%% 8 echo Bin4ut t"4e:]hidden] na?e:]nu?ero] Calue:]/?"s9lInu?IroHs(.result)/ ]F echo Bin4ut t"4e:]su!?it] Calue:]Su!?it]FBGeldsetF echo BG+or?F \F
J5K nuevosElementos5p6p B\4h4 .linD : ?"s9lIconnect(localhost, root, ) or die(=o se 4udo conectar / ?"s9lIerror()) ?"s9lIselectId!(her?es) or die(=o se 4udo seleccionar la !ase de datos) .9uer" : SEE;' ;O='(Q) @RM >Arduino> [XERE >no?!re>:]] .result : ?"s9lI9uer"(.9uer") or die(;onsulta +allida / ?"s9lIerror()) .line : ?"s9lI+etchIarra"(.result) echo .lineJ0K \F
63
Internet de las cosas: Desarrollo de un servidor Domótico
J50/ arduino9ist5p6p B\4h4 .linD : ?"s9lIconnect(localhost, root, ) or die(=o se 4udo conectar / ?"s9lIerror()) ?"s9lIselectId!(her?es) or die(=o se 4udo seleccionar la !ase de datos) .9uer" : SEE;' no?!re>),>id> @RM >Arduino> .result : ?"s9lI9uer"(.9uer") or die(;onsulta +allida / ?"s9lIerror()) i+ (?"s9lInu?IroHs(.result) L: 0) Hhile (.la : ?"s9lI+etchIassoc(.result)) echo BcenterF echo BdiC class:]listado] onclicD :]arduinoEs4ecica(/ .laJno?!reK/)]FB4F/.laJno?!reK/BG4FBGdiCF echo BGcenterF 8 8 \F
J500 unico)odulo5p6p B\4h4 .linD : ?"s9lIconnect(localhost, root, ) or die(=o se 4udo conectar / ?"s9lIerror()) ?"s9lIselectId!(her?es) or die(=o se 4udo seleccionar la !ase de datos) ..s9l : SEE;' Q @RM >Arduino> a,>Mediciones> ? [XERE a/>id>:?/>arduino A= a/>no?!re>: /.I*E'JdatosK/ .result : ?"s9lI9uer"(.9uer") or die(;onsulta +allida / ?"s9lIerror()) i+ (?"s9lInu?IroHs(.result) L: 0) Hhile (.la : ?"s9lI+etchIassoc(.result))
64
.s9l : SEE;' Q @RM >Mediciones> [XERE >arduino:/ .laJarduino+echa> ES;
i+ (.la2JCalor2K L: ) .arra"Au : s4lit(, .la2JCalor2K) .claCe2:.arra"AuJ0K arra"I4ush(.cont2, .arra"AuJ1K) 8 i+ (.la2JCalor3K L: ) .arra"Au : s4lit(, .la2JCalor3K) .claCe3:.arra"AuJ0K arra"I4ush(.cont3, .arra"AuJ1K) 8 i+ (.la2JCalor&K L: ) .arra"Au : s4lit(, .la2JCalor&K) .claCe&:.arra"AuJ0K arra"I4ush(.cont&, .arra"AuJ1K) 8 8 i+ (Le?4t"(.cont1)) .totalJ.claCe1K:.cont1 i+ (Le?4t"(.cont2)) .totalJ.claCe2K:.cont2 i+ (Le?4t"(.cont3)) .totalJ.claCe3K:.cont3 i+ (Le?4t"(.cont&)) .totalJ.claCe&K:.cont&
65
Internet de las cosas: Desarrollo de un servidor Domótico
+oreach (arra"IDe"s(.total) as .De") .?edia:0 .sensor:+alse .cont:0 +or (.i:0 .i B count(.totalJ.De"K) .i%%) i+ (LisInu?eric(.totalJ.De"KJ.iK)) i+ (.totalJ.De"KJ.iK :: in4ut) .cont%% .actuador : BdiC class : ]sensor]FBcenterF/.De"/ Bin4ut id:]no?!reI/ .laJarduino
66
J50. script5"s Car re+rescarACiso +unction nueCosEle?entos() ./aa( url nueCosEle?entos/4h4, t"4e get, success +unction (res4onse) i+ (res4onse L: 0) .(aCiso)/css(dis4la",inline) 8 8 8) 8 +unction dareAlta() clear
.(ident)/css(!order,24 solid 0000) return +alse 8
67
Internet de las cosas: Desarrollo de un servidor Domótico
8 return true 8 +unction cargarArduinos() ./aa( url arduinosist/4h4, t"4e get, success +unction (res4onse) .(listaArduinos)/a44end(res4onse) 8 8) 8 +unction enCiar;a?!io(datos)
Car Calor : .(CalorI%datos)/Cal() alert(el Calor es %Calor) Car no?!re : .(no?!reI%datos)/Cal() ./aa(data datos:%datos%?od:%no?!re%Calor:%Calor, url ?ensaeArduino/4h4, t"4e get, success +unction (res4onse) alert(res4onse) 8 8)
8 +unction arduinoEs4ecica(datos) ./aa( data datos:%datos, url unicoModulo/4h4, t"4e get, success +unction (res4onse) .(listaModulos)/ht?l(res4onse) 8 8) 8 +unction cargarModulos() ./aa( url ?odulosist/4h4,
68