Simulación de un entorno ubicuo para elevadores de un edificio con OSGI
Tags: java, ubicomp, osgi, iot
Published: 2020-02-11 14:37:56

El término OSGi generalmente se refiere a cualquiera de las organizaciones de la Alianza OSGi o la tecnología “Plataforma de Servicios OSGi”. La OSGi Alliance es una empresa independiente, cuya finalidad es definir una especificación para ofrecer y consumir servicios a través de redes WAN o LAN.

Fue pensado principalmente para su aplicación en redes domésticas y por ende en la llamada domótica o informatización del hogar.

En este articulo, veremos como implementar un sistema ubicuo para un conjunto de elevadores de un determinado edificio utilizando OSGI.

### Herramientas y complementos de instalación necesarios:###
+ Eclipse for RCP and RAP Developers: https://www.eclipse.org/downloads/packages/release/helios/sr2/eclipse-rcp-and-rap-developers.
+ Instalación de Bndtools 4.3.1. Instrucciones: https://bndtools.org/installation.html.

### Aspectos generales ###

La aplicación sobre la implementación de mecanismos y elevadores para un edificio en particular cuenta con las siguientes funcionalidades: 

+ Un edificio dispone de dos ascensores y un solo botón de llamado en cada planta del edificio.
+ Un usuario puede solicitar un ascensor desde un piso determinado. Acudirá el elevador que esté más cerca o el que esté desocupado. Si los dos están ocupados, el elevador que primero se desocupe atenderá esta solicitud. 
+ Si el elevador se encuentra desocupado, este retorna a su piso defecto.
+ Estando dentro del ascensor, el usuario debe presionar el piso destino. 
+ Si un usuario presiona más de una vez el botón de llamado en una planta determinada, el panel del ascensor de la planta respectiva emite un pitido indicando que ya existe una solicitud en progreso. 

El entorno ubicuo cuenta con los siguientes componentes:

+ Elevador 1
+ Elevador 2

+ Mecanismo de llamada piso 1
+ Mecanismo de llamada piso 2
+ Mecanismo de llamada piso 3
+ Mecanismo de llamada piso 4
+ Mecanismo de llamada piso 5

Estos componentes están ubicados en un edificio de 5 pisos en total. Las características especiales de cada elevador son:

+ El elevador 1 puede desplazarse entre el primer y quinto piso y su planta defecto es el primer piso (primera planta). 
+ El elevador 1 puede desplazarse entre el primer y quinto piso y su planta defecto es el quinto piso (ultima planta). 

###Partes importantes del proyecto ###
 
Cada sección se define de la siguiente manera: 

![](https://thepracticaldev.s3.amazonaws.com/i/7ccom221jmsj0d7jpkek.png)

+ En el API se definen las interfaces para los bunbles.
+ En el Provider la implementación de los bundles.
+ En el command los métodos y los comandos que permiten interactuar con las funcionalidades de los bundles. 

###Comandos de operación ###

Para la interacción con las funcionalidades del sistema, esto se lo puede realizar a través de la consola de comandos con las siguientes instrucciones: 

+ **llamar1** - Mecanismo de llamada elevador piso 1
+ **llamar2** - Mecanismo de llamada elevador piso 2
+ **llamar3** - Mecanismo de llamada elevador piso 3
+ **llamar4** - Mecanismo de llamada elevador piso 4
+ **llamar4** - Mecanismo de llamada elevador piso 5

+ **mir1 [Piso destino]** - Orden de desplazamiento del Elevador 1 al piso destino especificado.
+ **mir2 [Piso destino]** - Orden de desplazamiento del Elevador 2 al piso destino especificado.

Además de los comandos de instrucción, también se encuentran los comandos que nos permiten obtener información sobre el estado actual de cada uno de los elevadores y de los diferentes mecanismos en cada una de las plantas del edificio: 

+ **m1** - Información sobre mecanismo piso 1
+ **m2** - Información sobre mecanismo piso 2
+ **m3** - Información sobre mecanismo piso 3
+ **m4** - Información sobre mecanismo piso 4
+ **m5** - Información sobre mecanismo piso 5

+ **e1** - Información general sobre el Elevador 1
+ **e2** - Información general sobre el Elevador 2

###Ejecución del proyecto en Eclipse for RCP and RAP Developers###

Para la ejecución del proyecto debemos dirigirnos a la solución: `org.elevador.impl` en el archivo `ejecutar.bndrun` y seleccionar Run OSGi para ejecutar el mismo. En la siguiente imagen se puede evidenciar este proceso: 

![](https://thepracticaldev.s3.amazonaws.com/i/3o8ru26lgdh0pr2ovmra.png) 

Una vez ejecutado, el primer comando que podemos escribir es `lb`, el cual nos indicara que las implementaciones definidas en la sección Partes importantes de este documento están ejecutándose correctamente: 
 
![](https://thepracticaldev.s3.amazonaws.com/i/jatexyujzgfflny8togz.jpg)

Posteriormente, se pueden hacer uso de los comandos especificados en la sección Comandos de Operación definidos en este documento para la interacción con el sistema implementado: 

![](https://thepracticaldev.s3.amazonaws.com/i/srqxoplh30xazyj5xuxx.jpg)

El código fuente de esta implementación la puedes encontrar en el siguiente repositorio en GitHub: [ElevadorOSGI](https://github.com/esdanielgomez/ElevadorOSGI)

¡Hasta pronto!
Nos vemos en [Twitter](https://twitter.com/esDanielGomez)!! :)