Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Proyecto Bluelight
Proyecto Bluelight
2009
BLUELIGHT
SISTEMA PARA EL CONTROL DE LA INTENSIDAD DE LUZ DE LÁMPARAS
INCANDESCENTES POR MEDIO DE BLUETOOTH
2
BLUELIGHT
SISTEMA PARA EL CONTROL DE LA INTENSIDAD DE LUZ DE LÁMPARAS
INCANDESCENTES POR MEDIO DE BLUETOOTH
DIRECTOR
ALEXIS ALBERTO RAMÍREZ OROZCO
Ms@. En ingeniería con énfasis en Electrónica
3
Nota de aceptación
_____________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
______________________________
Firma del director
______________________________
Firma del jurado
______________________________
Firma del jurado
4
AGRADECIMIENTOS
A mis padres, quienes con su apoyo y amor han hecho de mí, una persona con
valores, determinada y exitosa. Deseo agradecer en especial a mi madre, quien
con sus consejos, me ha ayudado a tomar las mejores decisiones en mi vida.
A Dios, por las oportunidades que me ha brindado de salir adelante, por hacerme
parte de una familia maravillosa y permitirme conocer personas grandiosas en
esta aventura llamada VIDA, personas como Alexis Ramírez, quien no solo es mi
director de proyecto, sino también mi amigo.
5
CONTENIDO
INTRODUCCIÓN ...................................................................................................................... 12
1. DOMÓTICA...................................................................................................................... 14
2. TECNOLOGÍA BLUETOOTH................................................................................................ 17
2.2 Seguridad........................................................................................................................ 19
2.2.2 BlueSnarfing......................................................................................................... 21
2.3.4 Host Controller Interface (HCI) o Interfaz del Controlador de Enlace. ....................... 28
6
2.4.3 Perfil Genérico de Intercambio de Objetos (GOEP). ................................................ 34
2.6 CARACTERÍSTICAS............................................................................................................ 40
2.6.2 Espectro............................................................................................................... 41
2.6.3 Interferencias....................................................................................................... 41
2.6.5 Potencia............................................................................................................... 42
3. TELÉFONO CELULAR......................................................................................................... 43
3.2 DIFERENCIAS ENTRE LOS TELÉFONOS CELULARES Y LOS RADIOS DE BANDA CIVIL ................ 45
4. JAVA ............................................................................................................................... 48
4.1 J2ME............................................................................................................................... 51
4.1.1 Configuraciones.................................................................................................... 53
4.1.2 Perfiles................................................................................................................. 54
7
5. MICROCONTROLADORES ................................................................................................. 63
6. DISEÑO E IMPLEMENTACIÒN............................................................................................ 67
6.3 HARDWARE..................................................................................................................... 90
6.3.1 PIC16F876A.......................................................................................................... 91
8
LISTA DE FIGURAS
Figura 9. Microcontrolador...................................................................................................... 64
9
Figura 10.1.6 Clase RemoteDevice ........................................................................................... 77
Figura 10.1.10 Alerta de Error por nombre de usuario y/o contraseña no válidos ....................... 81
Figura 10.1.21 Pantalla de petición para guardar el estado actual de las luces ............................ 89
Figura 10.2.4 Señal de cruce por cero a la entrada del microcontrolador .................................... 94
10
LISTA DE TABLAS
11
INTRODUCCIÓN
La tecnología parece no tener límites, pues día a día surgen cada vez nuevos y
mejores dispositivos que permiten crear lo que hasta hace poco parecía imposible.
Al parecer, si algo puede ser imaginado por el hombre, entonces puede ser creado
y cuando de automatización de hogares se habla, la imaginación parece no tener
fin, ya que una necesidad que tiene n casi todos los seres humanos es llevar una
vida segura y confortable, empezando en ese lugar al que todos llaman hogar.
La tecnología más apetecida por los usuarios del hogar es sin duda el control de
las diferentes tareas del hogar sin desplazarse de un lugar a otro . Los elementos
que permiten este tipo de automatización son también conocidos como
dispositivos de control remoto.
Los dispositivos de control remoto, no solo están diseñados para controlar tareas
del hogar, también se pueden usar en la industria, donde se requiere una acción
de control sobre cargas de alto riesgo, sustancias tóxicas o explosivas, las cuales
pueden poner en riesgo la vida de un ser humano.
12
Se obtiene mayor rapidez de respuesta en el momento de tomar acciones sobre
los equipos a controlar, lo que se traduce en mayor eficiencia.
Una de las razones por las que este tipo de dispositivos es tan popular en
viviendas es el confort que genera, ya que se reduce el esfuerzo físico al hacer
uso de elementos de control remoto.
13
1. DOMÓTICA
14
otros que nos permitan ir dividiendo la domótica con el fin de conseguir detallar el
alcance de los proyectos, por ejemplo, la seguridad en esta tecnología tiene dos
vertientes: La Seguridad por Intrusismo y La Seguridad Técnica [Flor07 ].
Control Independiente
Control Centralizado
Control Distribuido en Red
15
llamado BUS, con el fin de controlar automáticamente otro sistema s uperior,
teniendo cada dispositivo de la red una o varios tareas específicas.
El Bus de Instalación Europeo EIB es un control de este tipo, otro de los sistemas
característicos de control distribuido en red es el X10, creado para facilitar la
instalación domótica en viviendas antiguas.
16
2. TECNOLOGÍA BLUETOOTH
17
En Febrero de 1998, se fundó el Bluetooth Special Interest Group (SIG) o Grupo
de Interés Especial de Bluetooth, creado con el fin de ofrecer soporte para la
nueva tecnología. Actualmente, más de mil compañías lo integran y trabajan
conjuntamente por un estándar abierto para el concepto Bluetooth.
Cuando dos dispositivos desean comunicarse deben establecer una gran cantidad
de parámetros entre ellos antes de poder hacer alguna transmisión, deben acordar
cómo van a comunicarse, por medio de cables o sin ellos usando alguna forma de
ondas electromagnéticas, después deben especificar cuanta información enviarán
a la vez y que significado tendrán los bits que usarán, para garantizar que el
mensaje recibido sea fiel al original. Bluetooth provee una solución al problema y
elimina la necesidad de que el usuario intervenga en el proceso de configurar
todas estas opciones.
18
bloqueadas por obstáculos que se muevan entre los dispositivos, lo cual resulta
conveniente para conectar varios aparatos (8 como máximo) simultáneamente.
2.2 Seguridad
19
o Servicios que requieren autorización y autenticación.
o Servicios que requieren autenticación solamente.
o Servicios que están abiertos a todos los dispositivos.
20
Usualmente un bluejacker solo envía un mensaje de texto, pero con los teléfonos
modernos es posible hasta enviar imágines o sonidos también.
Esto del Bluejacking ha sido usado para técnicas de marketing en algunos centros
comerciales quienes se hacen publicidad por este medio.
21
palabras, significa que el BlueBugger toma el control de tu teléfono, y lo usa para
enviar mensajes o para hacer una llamada.
22
diversas funciones de red en un sistema de niveles. En conjunto, permiten el
intercambio transparente de información e ntre aplicaciones diseñadas de acuerdo
con dicha especificación y fomentan la interoperabilidad entre los productos de
diferentes fabricantes.
La pila de protocolos Bluetooth se divide en dos zonas, cada una de las cuales se
implementa en distintos procesadores:
23
o El host Bluetooth (software), encargado de la parte relacionada con las
capas superiores de enlace y aplicación.
24
2.3.1 Radio. La capa física de radio (RF) Bluetooth opera en la banda de 2.4 GHz
libre para ISM (banda de frecuencia industrial, científica y médica). El sistema
emplea un transmisor de salto de frecuencia para contrarrestar las interferencias y
la pérdida de intensidad, y cuenta con gran número de portadoras de espectro
ensanchado por salto de frecuencia (FHSS). Para minimizar la complejidad del
transmisor, se utiliza una modulación de frecuencia binaria. La tasa de
transferencia de símbolos es de 1 MS/s (megasímbolos por segundo), que admite
una velocidad de transmisión de 1 Megabit por segundo (Mbps) en el modo de
transferencia básica y una velocidad de transmisión aérea total de 2 a 3 Mbps en
el modo de transferencia mejorada. Estos modos se conocen como transferencia
básica y transferencia de datos mejorada, respectivamente.
2.3.2 Banda Base. La banda base Bluetooth es la parte del sistema Bluetooth
que especifica o introduce los procedimientos de acceso de medios y capa física
entre dispositivos Bluetooth. Su función principal es permitir el enlace físico por
radiofrecuencia (RF) entre unidades Bluetooth de ntro de una piconet realizando
tareas de modulación y demodulación de los datos en señales RF que se
transmiten por el aire.
25
Un conjunto de dos o más piconets interconectadas forman scatternets. La figura
2.2 muestra una ilustración de estos dos tipos de redes. Un dispositivo Bluetooth
puede ser esclavo en varias piconets, pero solo puede ser maestro en una. Los
dispositivos que participan en más de una red, pueden actuar como puerta de
enlace, reenviando información de una piconet a otra.
Aunque los dispositivos pueden participar en varias piconets, solo pueden estar
activos en una de ellas, dividiendo el tiempo entre estas [Dide04].
26
¤ Reloj Bluetooth
Todos los dispositivos Bluetooth cuentan con un reloj nativo que debe derivarse de
un reloj del sistema de libre funcionamiento. Para la sincronización con otros
dispositivos los esclavos de una piconet usan la dirección Bluetooth del maestro y
su reloj para determinar la secuencia de saltos de frecuencia.
¤ Dirección de dispositivos Bluetooth
¤ Códigos de acceso
En el sistema Bluetooth, todas las transmisiones que se realizan a través del canal
físico se inician con un código de acceso. Se definen tres códigos diferentes,
código de acceso del dispositivo (DAC), código de acceso del canal (CAC), código
de acceso de consulta (IAC)
27
¤ Canal físico básico de la piconet
Por definición, el dispositivo que inicia una conexión mediante una b úsqueda de
terminales hace las veces de maestro. Una vez establecida la piconet, es posible
intercambiar las funciones de maestro y esclavo.
El canal físico básico de la piconet se divide en ranuras de tiempo de 625 μs de
duración cada una.
28
paquetes más grandes para la capa superior. La conexión L2CAP permite el
intercambio de información referente a la calidad de la conexión, además maneja
grupos, de tal manera que varios dispositivos pueden comunicarse entre sí.
29
encontrados. De esta forma, ese dispositivo podrá identificar todos los dispositivos
encontrados por sus direcciones Bluetooth.
30
Protocolos Específicos
¤ Protocolo OBEX.
31
También permite a las aplicaciones operar en la pila de protocolos de la tecnología
Bluetooth y en la pila de la tecnología de infrarrojos. En los dispositivos Bluetooth,
sólo se admiten conexiones OBEX para el intercambio de objetos. Se han
desarrollado tres perfiles de aplicaciones basadas en el protocolo OBEX: SYNC,
FTP y OPP.
Cada perfil incluye, como mínimo, información sobre las siguientes cuestiones:
32
La figura 2.3 muestra los diferentes perfiles Bluetooth.
33
2.4.1 Perfil Genérico de Acceso (GAP). Este perfil define los procedimientos
generales para el descubrimiento y establecimiento de conexión entre dispositivos
Bluetooth. El GAP maneja el descubrimiento y establecimiento entre unidades
que no están conectadas y asegura que cualquier par de unidades Bluetooth, sin
importar su fabricante o aplicación, puedan intercambiar información a través de
Bluetooth para descubrir qué tipo de aplicaciones soportan las unidades.
Esencialmente, este perfil describe como son usadas las capas bajas (LMP y
Banda Base), junto con algunas capas superiores.
2.4.2 Perfil de Puerto Serial (SPP). El perfil de puerto serial define los
requerimientos para dispositivos Bluetooth necesarios para establecer conexiones
de cable serial usando RFCOMM entre dos dispositivos semejantes. Este perfil
define los protocolos y procedimientos que se usarán por dispositivos que utilizan
Bluetooth para emulación de cable serial RS232 (o similar).
34
2.5 PROCESO DE CONEXIÓN
35
el dispositivo A (cliente) envía paquetes de paginación preguntándole si posee un
servicio definido por un registro de servicios (service record). Un dispositivo
disponible para la conexión (Dispositivo B) responderá retornando el registro de
servicios al cliente si posee uno con los atributos especificados y un vínculo de
Banda Base se establece entre ambos dispositivos.
Si se desea por ejemplo una conexión de perfil Dial-up Networking (DUN) entre
ambos dispositivos, primero se establece una conexión L2CAP antes de que
puedan intercambiar información de servicio, la cual será manejada por el
Protocolo de Descubrimiento de Servicios (SDP). Si el dispositivo B responde
indicando que posee el servicio necesitado por el dispositivo A, entonces se puede
establecer una conexión RFCOMM a través del vínculo L2CAP existente. Por
último la conexión Dial-up Networking se establece sobre la conexión RFCOMM.
La figura 2.4 ilustra el establecimiento de este tipo de conexión.
36
Registro de Servicios (Service Record). Los registros de servicios
contienen información adicional que no se encuentra en los registros de la clase
de dispositivo. Este es el encargado de responder a las preguntas ¿Qué tipo de
sevicio ofrece esta aplicación? ¿Cómo se conecta un cliente a este servicio?
37
¤ Añadir el registro de servicios a la SDDB.
¤ Registrar las medidas de seguridad asociadas al servicio.
¤ Aceptar conexiones de clientes solicitando el servicio.
¤ Actualizar la SDDB si el servicio cambia.
¤ Remover o deshabilitar el registro de servicios en la SDDB.
38
Distintos atributos contienen valores de varios tipos y tamaños, que son
almacenados por un elemento de datos. Un elemento de datos está conformado
por dos partes: La primera es un descriptor del tipo de elemento y la segunda es
un campo de datos. El descriptor de tipo de elemento contiene información sobre
el tipo y tamaño del dato, en cuanto que el campo de datos contiene el dato en sí.
Por lo tanto, un dispositivo remoto siempre sabrá cual es el tipo de dato y su
tamaño cuando esté buscando un determinado atributo.
39
OBEX Object Push Profile 0x1105 16-bit
OBEX File Transfer Profile 0x1106 16-bit
Personal Area Networking User 0x1115 16-bit
Network Access Point 0x1116 16-bit
Group Network 0x1117 16-bit
2.6 CARACTERÍSTICAS
40
definiciones para la capa de enlace y de aplicaciones, lo que permite que sea
compatible con soluciones de voz y datos.
o Los radios de clase 3 suelen tener un alcance de entre uno y tres metros.
o Las radios de clase 2 son habituales de los dispositivos portátiles y tienen
un alcance de diez metros.
o Las radios de clase 1 se utilizan principalmente en el sector industrial y
logran un alcance de cien metros.
41
2.6.5 Potencia. Las radios más utilizadas son las de clase 2, con una potencia de
2,5 mW. La tecnología Bluetooth se ha diseñado para minimizar el consumo de
energía. Para ello, la especificación cambia las radios al modo de ahorro de
energía cuando no están activas.
42
3. TELÉFONO CELULAR
Las tecnologías inalámbricas han tenido mucho auge y desarrollo en estos últimos
años, una de las que ha tenido un gran desarrollo ha sido la telefonía celular.
Desde sus inicios a finales de los 70 ha revolucionado enormemente las
actividades que realizamos diariamente. Los teléfonos celulares se han convertido
en una herramienta primordial para la gente común y de negocios haciéndolas
sentir más seguras y más productivas.
43
Figura 3. Red de Celdas de telefonía Celular
Fuente: Tomado de
[http://www.yucatan.com.mx/especiales/celular/comofunciona.asp ].
Cada celda tiene una estación base que consiste de una torre y un pequeño
edificio que contiene el equipo de radio.
Cada celda en un sistema análogo utiliza un séptimo de los canales de voz
disponibles. Eso es, una celda, más las seis celdas que la rodean en un
arreglo hexagonal, cada una utilizando un séptimo de los canales disponibles
para que cada celda tenga un grupo único de frecuencias y no haya
colisiones:
o Cada teléfono celular utiliza dos frecuencias por llamada, por lo que
típicamente hay 395 canales de voz por portador de señal. (las 42
frecuencias restantes son utilizadas como canales de control).
44
En otras palabras, en cualquier celda, pueden hablar 56 personas en sus
teléfonos celulares al mismo tiempo. Con la transmisión digital, el número de
canales disponibles aumenta. Por ejemplo el sistema digital TDMA puede
acarrear el triple de llamadas en cada celda, alrededor de 168 canales
disponibles simultáneamente.
Los teléfonos celulares tienen adentro transmisores de bajo poder. Muchos
teléfonos celulares tienen dos intensidades de señal: 0.6 watts y 3.0 watts (en
comparación, la mayoría de los radios de banda civil transmiten a 4 watts.) La
estación central también transmite a bajo poder. Los transmisores de bajo
poder tienen dos ventajas:
45
Figura 4. Celular vs. Radio
Fuente: Tomado de
[http://www.yucatan.com.mx/especiales/celular/bandacivilVscelular.asp]
3.2.1 Simplex Vs. Dúplex. Los radios de banda civil y los walkie talkies son
dispositivos simplex. Eso significa que cuando dos personas se comunican,
utilizan la misma frecuencia, por lo que sólo una persona puede hablar al mismo
tiempo. Un teléfono celular es un dispositivo dúplex. Eso significa que utiliza una
frecuencia para hablar y otra para recibir, de esa manera dos personas pueden
platicar al mismo tiempo.
46
3.3 SOFTWARE PARA DISPOSITIVOS MÓVILES
Los celulares no son los únicos dispositivos móviles para los cuales se pueden
hacer desarrollos, también se puede hacer para otros aparatos como Palm o
Pocket PC, dispositivos de mano pequeños con ciertamente una gran potencia.
Hay que tener en cuenta varios aspectos tanto para elegir el dispositivo correcto,
como la tecnología a usar, para ello es necesario conocer cuáles son las
necesidades, tanto presentes como futuras, las capacidades del dispositivo que se
elija, el conocimiento actual o la facilidad de adquirir este conocimiento sobre el
software de desarrollo, entre otras.
47
4. JAVA
Esta edición de Java es la que en cierta forma recoge la iniciativa original del
lenguaje Java. Tiene las siguientes características:
48
o Código independiente de la plataforma, precompilado a bytecodes
intermedio y ejecutado en el cliente por una JVM (Java Virtual Machine).
49
reducidas, tales como teléfonos móviles, PDAs o electrodomésticos inteligentes.
Esta edición tiene unos componentes básicos que la diferencian de las otras
versiones, como el uso de una máquina virtual denominada KVM (Kilo Virtual
Machine, debido a que requiere sólo unos pocos Kilobytes de memoria para
funcionar) en vez del uso de la JVM clásica, inclusión de un pequeño y rápido
recolector de basura
La separación dada por Sun permite que cada edición evolucione por sí sola y se
adapte mejor al conjunto de dispositivos para el cual fue diseñada; sin embargo,
las diferentes ediciones se traslapan.
50
Aunque Sun Microsystems es la máxima autoridad en lo que respecta al futuro de
Java, otras corporaciones o empresas pueden participar en la definición y revisión
de la plataforma Java a través del Java Community Process (JCP), entre ellas:
Motorola, Nokia, Sony, Phillips, Siemens, Palm, IBM, Ericsson, Cisco Systems,
Samsung, Oracle, Texas Instruments, NEC, Symbian, Hitachi, Panasonic.
4.1 J2ME
J2ME (Java 2 Micro Edition) está enfocado para ser usado en dispositivos con
recursos limitados. Tiene una sola parte de las clases de J2SE, las necesarias
para poder manejar los recursos de un teléfono celular. La tecnología J2ME se ha
difundido ampliamente en los últimos años en más de 110 operadores telefónicos
alrededor del mundo, tanto GSM como CDMA, gracias a que es independiente de
la estructura de red o de un modelo de negocios determinado. Además, existe una
gran base de programadores Java, que sin mucho esfuerzo dan el salto a J2ME.
En una primera etapa se definió MIDP 1.0, el cual era muy general y por eso no
incluía algunas características de los teléfonos más recientes. Debido a esto,
compañías como Nokia y Samsung, lanzaron clases propias para sacar mayor
provecho de los recursos de sus teléfonos, no contemplados en la versión MIDP
1.0.
51
permiten ocupar más recursos de los dispositivos actuales, como son: multimedia,
graficación 3D, manejo de los archivos del teléfono, envío y recepción de
mensajes de texto y multimedia, implementar web services, entre otros.
Como se puede observar en la figura 6, J2ME contiene una mínima parte de las
APIs de Java. Esto es debido a que la edición estándar de APIs de Java ocupa
aproximadamente 20 Mb, y los dispositivos pequeños disponen de una cantidad
de memoria mucho más reducida. En concreto, J2ME usa 37 clases de la
plataforma J2SE provenientes de los paquetes java.lang, java.io, java.util [Galv03].
javax.microedition
52
4.1.1 Configuraciones. Una configuración define las funcionalidades mínimas
para dispositivos con características semejantes. Por lo tanto, más
específicamente, define las características en cuanto a máquina virtual y el
conjunto de clases derivadas de la plataforma Java SE.
53
Figura 6.1 Relación entre CDC y CLDC
4.1.2 Perfiles. Un perfil proporciona las librerías para que el programador pueda
desarrollar aplicativos para un determinado dispositivo. Un perfil podría ser
considerado como las características de un dispositivo que pertenece a una familia
y está representando un tipo de configuración.
54
decisión de los fabricantes implementarlos o no de acuerdo a las necesidades y
capacidades de cada dispositivo [Hole09].
4.1.4 APIs Java para Bluetooth (JSR-82 / JABWT). El JCP (Java Community
Process) es el hogar de la comunidad desarrolladora internacional que tiene como
objetivo desarrollar y evolucionar las especificaciones de la tecnología Java. El
proceso JCP conlleva el uso de JSR (Java Specification Request) los cuales son
documentos formales que describen las especificaciones y tecnologías propuestas
para que sean añadidas a la plataforma Java. Las revisiones públicas formales de
JSRs son controladas antes de que los JSR se conviertan en final y sean votados
por el Comité Ejecutivo JCP. Un JSR final suministra una implementación de
referencia la cual da una implementación libre de la tecnología en código fuente y
un Kit de Compatibilidad de Tecnología para verificar la especificación de la API.
JSR-82 ó JABWT (Java Apis for Bluetooth Wireless Technology) es un API que
está dividida en dos partes: el paquete javax.bluetooth y el paquete javax.obex.
Los dos paquetes son totalmente independientes. El primero de ellos define clases
e interfaces básicas para el descubrimiento de dispositivos, descubrimiento de
servicios, conexión y comunicación. La comunicación a tra vés de javax.bluetooth
es a bajo nivel: mediante flujos de datos o mediante la transmisión de arrays de
bytes.
55
La plataforma principal de desarrollo del API JSR-82 es J2ME. El API ha sido
diseñada para depender de la configuración CLDC. Sin embargo existen
implementaciones para poder hacer uso de este API en J2SE [Gime04].
56
o Especificar los atributos de servicio
Una vez obtenido este objeto se pueden conseguir datos importantes del teléfono
celular. Para obtener la dirección del dispositivo local (no el remoto), se usa el
método getBluetoothAddress(), para el nombre GetFriendlyName(), el tipo de
método de descubrimiento se obtiene con getDiscoverable(), este último retorna
unas constantes que están incluidas de modo estático en el objeto
DiscoveryAggent. Para modificarlo podremos usar la función setDiscoverable(),
peró puede dar un BluetoothStateException en caso de Error.
57
o Máximo número de atributos por servicio (bluetooth.sd.attr.retrievable.max)
58
método getFriendlyName() puede lanzar una java.io.IOException en caso de que
no se pueda contactar con el dispositivo o este no provea un "friendly-name".
59
para realizar la conexión. La URL será diferente dependiendo si se desea ser
cliente o servidor de una conexión L2CAP o SPP.
Las diferentes interfaces a utilizar así como la línea de la URL que define el
protocolo, están indicadas en la tabla 3.
60
Figura 7. Caso de uso específico de una aplicación Bluetooth
Inicializ a 1
Descubre
Dispositivos
cercanos y servicios Cliente
2
Utiliza los Servicios
descubiertos
Ofrece servicio
Deja de ofrecer
servicio
61
o Servidor: Un servidor pone servicios a disposición de los clientes. Los
registra en la Base de Datos de Descubrimiento de Servicios (SDDB), en
efecto publicándolos. Luego espera por conexiones entrantes, las acepta a
medida que van entrando y sirve a los clientes que las realizan. Finalmente
cuando el servicio no se necesita más, la aplicación lo remueve de la
SDDB.
La figura 8 ilustra los elementos que componen una aplicación Bluetooth típica, en
este caso un MIDlet.
Javax.microedition.midlet::MIDlet Javax.bluetooth::DiscoveryListener
Javax.bluetooth::DiscoveryAgent 1 Javax.microedition.io::
1 * StreamConnection
Mi MIDlet 1
Javax.microedition.io::
Javax.bluetooth::LocalDevice 1 1 Bluetooth *
StreamConnectionNotifier
1
1 1 1 *
Javax.bluetooth::RemoteDevice *
Javax.bluetooth::L2CAPConnection
Javax.bluetooth::ServiceRecord * * Javax.bluetooth::
L2CAPConnectionNotifier
62
5. MICROCONTROLADORES
63
Figura 9. Microcontrolador
µC
PERIFÉRICOS
µP
PERIFÉRICOS
E/S
E/S
UC
Memoria
Fuente: [Propia]
64
instrucciones de forma indistinta. A dicha memoria se accede a través de un
sistema de buses único (direcciones, datos y control).
UNIDAD
INSTRUCCIONES DATOS
OPERATIVA
Los microcontroladores más populares se encuentran, sin duda, entre las mejores
elecciones:
65
o 80186, 80188 y 80386 EX (Intel). Versiones en microcontrolador de los
populares microprocesadores 8086 y 8088. Su principal ventaja es que
permiten aprovechar las herramientas de desarrollo para PC.
o 68HC11 (Motorola y Toshiba). Es un microcontrolador de 8 bits potente y
popular con gran cantidad de variantes.
o 683xx (Motorola). Surgido a partir de la popular familia 68k, a la que se
incorporan algunos periféricos. Son microcontroladores de altísimas
prestaciones.
o PIC (Microchip). Familia de microcontroladores que gana popularidad día a
día. Fueron los primeros microcontroladores RISC.
66
6. DISEÑO E IMPLEMENTACIÒN
El desarrollo de este proyecto debió dividirse en dos grandes bloques, por un lado
el Software desarrollado para el dispositivo móvil, en este caso un teléfono celular,
y el hardware encargado de recibir las órdenes enviadas desde el celular y
ejecutarlas.
Dispositivo
móvil (SW)
Fuente: [Propia]
67
Tal vez la única característica de la metodología XP que no hizo parte en el
desarrollo del proyecto fue la programación en parejas, debido a que el desarrollo
fue hecho por una sola persona.
La metodología XP fue bastante adecuada para este desarrollo, ya que permite
fácilmente hacer cambios a los requerimientos al considerar ciclos iterativos
menores de desarrollo, además se pretende ir agregando cada vez más
funcionalidades tanto a la aplicación como al hardware, de hecho, esta versión de
Bluelight es la segunda de una serie de aplicaciones que permiten hacer control
domótico desde un teléfono celular. La versión 1.0 fue dada a conocer en la
semana universitaria y permitía enviar las órdenes de encender una luz, un
ventilador y abrir una puerta a un PC que las ejecutaba haciendo uso del puerto
paralelo. La base del programa del celular es la misma usada en Bluelight Versión
2.0 lo cual demuestra una evolución del código sin perder la esencia.
Bluetooth
Fuente: [Propia]
68
La aplicación consta de tres clases que la hacen completamente funcional y
modular, permitiéndole agregar más funciones a futuro para hacerla más amigable
y robusta.
Fuente: [Propia]
69
con el hardware, desde la búsqueda de dispositivos y servicios Bluetooth hasta el
envío de órdenes por medio del objeto HiloConexion creado en la clase BTMidlet.
Fuente: [Propia]
La clase Registro (Ver figura 10.1.3) fue implementada para una funcionalidad que
no estaba planeada al inicio del proyecto, pero que debido a las sugerencias de
posibles usuarios a medida que se desarrollaba el software permitió agregársela.
Lo que se hace por medio de esta clase es guardar en una pequeña “base de
datos” el estado actual de las luces lo cual permite establecer una intensidad para
cada luz y en caso de que alguien más modifique su estado, se podrán restablecer
de nuevo las intensidades que se guardaron en el celular.
70
Figura 10.1.3 Clase Registro
Fuente: [Propia]
LocalDevice provee métodos para recibir información acerca del dispositivo local y
para tener acceso al gestor Bluetooth.
71
o getRecord() retorna uno de los registros de servicios para la conexión
Bluetooth especificada.
o updateRecord() actualiza el registro de servicio SDDB para el
ServiceRecord.
o getDiscoverable() retorna el estado de descubrimiento del dispositivo.
o setDiscoverable() Pone el estado de descubrimiento del dispositivo.
o getDiscoveryAgent() retorna una referencia de DiscoveryAgent.
o getProperty() retorna una de las propiedades del dispositivo.
Fuente: [Orti04]
72
Las aplicaciones cliente que deseen ser notificadas cuando un dispositivo o
servicio ha sido encontrado deberán implementar y registrar la interfaz
DiscoveryListener.
73
(servRecord) es un arreglo de objetos ServiceRecord. Un objeto ServiceRecord
describe las características de un servicio Bluetooth, en otras palabras es el
servicio como tal.
74
da.searchServices(int[] attrSet, UUID[] uuidSet, RemoteDevice dispRemoto,
DiscoveryListener claseQueEscucha)
Cada servicio tiene varios atributos como nombre, descripción, etc., y si se está
interesado en conocer uno o más de ellos, se tendrán que especificar en la
búsqueda agregándolos en el arreglo attrSet, de lo contrario se podrá usar null
teniendo en cuenta que si luego se desea saber por ejemplo el nombre del servicio
indicando su atributo, arrojará un NullPointerException ya que en la búsqueda no
se especificó.
75
Figura 10.1.5 Clase DiscoveryAgent e interfaz DiscoveryListener
Fuente: [Orti04]
76
o getBluetoothAddress() retorna la dirección Bluetooth.
o getFriendlyName() retorna el nombre (friendly name) del dispositivo
Bluetooth.
o getRemoteDevice() retorna el RemoteDevice que corresponde a la
conexión Bluetooth especificada.
Fuente: [Orti04]
Para la conexión, la aplicación Bluelight V2.0 deberá ser cliente ya que el módulo
BlueSMIRF será quien ofrezca el servicio de puerto serie. El protocolo a usar será
el de emulación de puerto serie RS-232.
77
StreamConnection conexion;
InputStream is;
OutputStream os;
conexion = (StreamConnection)
Connector.open("btspp://direcciónServidor:canalServicio");
os = conexion.openOutputStream();
is=conexion.openInputStream();
78
Figura 10.1.7 Diagrama de clases del software Bluelight
<<interface>>
MIDlet
CommandListener <<interface>>
ItemStateListener
<<interface>>
ItemStateListener
BTMidlet
<<interface>>
DiscoveryListener
1
* Thread
1
Registro
*
HiloConexion
1
LocalDevice 1
1
1 1 1 *
StreamConnection
1
DiscoveryAgent
* *
RemoteDevice StreamConnectionNotifier
*
ServiceRecord
Fuente: [Propia]
79
Fuente: [Propia]
Fuente: [Propia]
Si la contraseña es incorrecta, se mostrará una alerta (Alert) con un mensaje de
error indicando que el nombre de usuario y/o la contraseña son inválidos. Esta
80
alerta no estará por un tiempo determinado, sino que permanecerá en pantalla
hasta que se presione el comando Done para que regrese al formulario de
ingreso.
Figura 10.1.10 Alerta de Error por nombre de usuario y/o contraseña no válidos
Fuente: [Propia]
81
Figura 10.1.11 Pantalla de búsqueda de dispositivos
Fuente: [Propia]
Fuente: [Propia]
82
Una vez se empieza a buscar dispositivos, los nombres (Friendly Names) de estos
se van adicionando a una pantalla de tipo Lista (List) a medida que van siendo
encontrados y cuando se termina la búsqueda, esta se muestra como una lista
exclusiva, o sea que solo se podrá elegir un elemento de ella.
Fuente: [Propia]
83
Figura 10.1.14 Pantalla de búsqueda de servicios
Fuente: [Propia]
84
Figura 10.1.16 Pantalla de confirmación para establecer conexión cliente
Fuente: [Propia]
Fuente: [Propia]
85
Si por algún motivo no se puede establecer conexión ya sea porque el celular y el
módulo se alejan demasiado o si BLUELIGHT está desactivado en ese momento,
aparecerá una pantalla de Error durante 3 segundos indicándole al usuario que
BLUELIGHT puede estar apagado.
Fuente: [Propia]
86
Figura 10.1.19 Pantalla de selección de luces
Fuente: [Propia]
Cualquiera de las dos opciones para controlar la intensidad (OK y Último Estado)
llevará a la pantalla de control en la que aparecerán unos controles (Gauges) que
permitirán seleccionar en un rango de 0 a 30 la intensidad deseada de cada una
de las luces seleccionadas. En el ejemplo de la figura 9.1.17 se ha escogido una
intensidad de 15 (mitad de la intensidad) para la luz exterior, de 30 (intensidad
máxima) para la luz de la sala principal, y una intensidad de 1 para la luz del baño.
87
Figura 10.1.20 Pantalla de control de luces
Fuente: [Propia]
88
Figura 10.1.21 Pantalla de petición para guardar el estado actual de las luces
Fuente: [Propia]
Por último, se muestran los créditos con los nombres de los desarrolladores.
Fuente: [Propia]
89
6.3 HARDWARE
Cruce
por cero
Fuente: [Propia]
Fuente: [Propia]
90
6.3.1 PIC16F876A
Fuente [http://www.microchip.com]
o Características
o Tipo de memoria FLASH
o Memoria de programa de 14KB
o 368 Bytes de RAM
o 256 bytes de memoria EEPROM
o Conversor análogo/digital
91
o Módulo USART
o Set de 35 instrucciones
o 3 temporizadores
Especificaciones
o Módem de Radio Bluetooth de clase 1 aprobado por la FCC.
o Compatible con todos los productos Bluetooth que soporten SPP.
o Vinculación robusta tanto en integridad como en distancia de transmisión
(30m).
o Bajo consumo de corriente: 25mA aprox.
o Esquema de salto de frecuencia resistente – Opera en severos ambientes
de RF como WiFi, 802.11g y Zigbee.
92
o Conexión encriptada.
o Frecuencia: 2.4 ~ 2.524 GHz.
o Voltaje de operación: 3.3V – 6V.
o Comunicaciones serial: 2400-115200bps.
o Temperatura de operación: -40 ~ +70ºC.
o Antena integrada.
Dimensiones
o 51.5x15.8x5.6mm
Diodos de protección a la entrada (diseñados dentro de los pines del PIC) regulan
cualquier voltaje mayor a Vdd o menos a Vss. De esta forma, cuando el voltaje AC
se encuentra en el ciclo negativo, el pin RB7 se mantendrá con un voltaje entre
Vss – 0.6V. Esto se interpretará como un cero lógico. Cuando el voltaje AC se
eleva por encima del valor de alimentación del PIC, el valor lógico en RB7 será „1‟.
93
Figura 10.2.4 Señal de cruce por cero a la entrada del microcontrolador
Fuente: [Propia]
94
INICIO
Configurar puertos
y módulo USART
No ¿Buffer de
recepción lleno?
Si
Leer Buffer
START bank1
movlw b'10000101' ;Rate de 64 para TMR0
movwf OPTION_R
movlw b'10000000' ;RB7 entrada para Interrupción por
;cambio de estado en cruce por cero
movwf PORTB
bsf PIE_1,5 ;Habilita interrupción por recepción en
;USART (RCIE = 1)
bcf TXSTA_,4 ;Configura USART para operación
;asíncrona (SYNC = 0)
bsf TXSTA_,2 ;High Baud Rate (BRGH = 1)
movlw .64 ;BAUD RATE = 19200
movwf SPBRG_
bank0
bsf RCSTA,7 ;Habilita USART (SPEN = 1) configura
;RC7 como IN (RX) y RC6 como OUT (TX)
95
bsf RCSTA,4 ;Habilita recepción continua en USART
;(CREN = 1)
movlw 0C0h ;Habilita GIE y PEIE Para primera
;interrupción por recepción en USART
movwf INTCON
Una vez se recibe esta información y se genera la interrupción, se lee el buffer del
USART por medio del registro RCREG y se deshabilita la interrupción por
recepción en el módulo serial para dejar habilitada solo la interrupción por cambio
de estado la cual será producida por el detector de cruce por cero.
Interrupción
No ¿Buffer de Si
recepción lleno?
Atender Leer Buffer
Interrupción de
cruce por cero
Deshabilitar interrupción de
recepción en USART
Retorne
96
ORG 4h ;Vector de interrupciones
btfss PIR1,5 ;¿Recepción en USART?
goto ZERO_CROSS ;No: Interrupción de cruce por cero
call readBuffer ;Si: Lee Buffer
INT btfsc INTflags,0 ;¿Primera interrupción por
;recepción en USART?
goto ZERO_CROSS ;No: Fue interrupción por cambio de
;estado
bsf INTflags,0 ;Si: Pone un 1 en bandera de
;recepción por USART
Movlw 088h ;Habilita interrupción por cambio de
;estado y deshabilita interrupción
;por recepción de USART
movwf INTCON
retfie ;Retorna de la interrupción
97
Interrupción de
cruce por cero
No ¿Semi-ciclo Si
negativo?
Espere 0,5µS Espere 0,8µS
No ¿Porcentaje de Si
luz exterior es 0?
Poner en 1 bandera
¿Es tiempo de No de luz exterior
disparar Triac?
Si
Poner en 1 bandera
de luz exterior
98
ZERO_CROSS clrf LIGHTS ;Limpia banderas de luces
btfsc PORTB,7 ;¿Ciclo negativo?
goto up ;No: Flanco de subida
call _0.8mS ;Si: Tiempo que tarda el Triac
;en conducir en ciclo negativo
movlw .240
movwf TMR0 ;Carga TMR0 para que se
;desborde en 205.6uS
goto goON
movlw .238
movwf TMR0 ;Carga TMR0 para que se
;desborde en 231.4uS
movlw .30
movwf ciclo
99
bsf LIGHTS,0 ;Si: Ponga en uno bandera de luz
;exterior indicando que no se hará
;nada más con esa luz
100
La cantidad de intensidades posibles son 30, por lo tanto, cada semiciclo debió ser
dividido en este número para hallar el tiempo de cada intensidad, esto se logró de
acuerdo a los siguientes cálculos:
TproPos=0.88mS (Tiempo prohibido de disparo del triac antes del próximo cruce
en el ciclo positivo)
TproNeg=1.1mS (Tiempo prohibido de disparo del triac antes del próximo cruce en
el ciclo negativo)
ThabilPos=Tciclo-(TdisPos+TproPos)=8.34mS-(0.5mS+0.88mS)=6.96mS (Tiempo
habilitado para el control de las intensidades en el ciclo positivo)
ThabilNeg=Tciclo-(TdisNeg+TproNeg)=8.34mS-(0.8mS+1.1mS)=6.44mS (Tiempo
habilitado para el control de las intensidades en el ciclo negativo)
101
TminIntNeg=ThabilNeg/30=6.44mS/30=214.6µS (Tiempo de conducción de la
mínima intensidad en el ciclo negativo)
102
Figura 10.2.5 División de tiempos de la señal de línea
Fuente: [Propia]
103
Figura 10.2.6 Control de una luz a una intensidad de 7.
Fuente: [Propia]
104
6.4 PRUEBAS Y AJUSTES
Durante las primeras pruebas del módulo Bluetooth BlueSMIRF, se logró hacer
una conexión entre este y una dongle Bluetooth USB conectada al computador
desde bluesoleil e hyperterminal, pero cuando se intentó enviar el comando AT
+++ para configurarlo, no se recibía la respuesta OK por parte del módulo. Esto se
debía a que el módulo solo puede ser configurado con comandos AT enviados
directamente por el puerto RS-232 y no vía Bluetooth.
Se decidió recibir estos datos en un microcontrolador haciendo uso del USART del
mismo, por lo cual se desarrolló un programa en ensamblador que muestra por un
puerto el dato recibido serialmente desde el módulo BlueSMIRF. No confundir el
105
funcionamiento de los pines RX y TX del módulo, el primero recibe datos para
enviar vía Bluetooth y el segundo transmite datos recibidos por el módulo vía
Bluetooth.
A última hora se le agregó una nueva función a la aplicación del celular, la cual
permite crear un nuevo usuario si es la primera vez que se ejecuta el programa y
una vez creado, los datos del nombre usuario y su contraseña quedarán
guardados en una pequeña base de datos del celular.
106
RESULTADOS FINALES
107
CONCLUSIONES
Para mejorar el corto alcance del Bluetooth Clase 2 del celular que es de
aproximadamente 10 metros, debió usarse un módulo Bluetooth Clase 1 de la
empresa SparkFun que permite hacer control a una distancia de 25 metros con
línea de vista.
El uso del protocolo RFCOMM hizo aún más fácil la comunicación con el
microcontrolador pues este emula el protocolo de puerto serie RS-232.
108
Los entornos de desarrollo usados para el desarrollo del software del celular
y del microcontrolador son el NetBeans IDE 6.5 y el MPLAB 8.30 respectivamente.
Por un lado el NetBeans provee librerías para el desarrollo de aplicaciones en
J2ME, además de la herramienta Sun Java(TM) Wireless Toolkit 2.5.2 for CLDC
que es una plataforma de emulación de dispositivos inalámbricos. Por otro lado, el
MPLAB es un software provisto por la empresa Microchip y permitió hacer la
depuración del software junto con el hardware por medio del programador ICSP.
Una ventaja en común es que ambas aplicaciones son de libre distrib ución, por lo
cual no se requiere ningún tipo de licencia.
109
BIBLIOGRAFÍA
[Arph06] ARPHEAN, Nih. Tutorial para aplicaciones móviles J2ME con NetBeans y
Mobility Pack. [En línea]. Publicado en Abril de 2006. Disponible en:
<http://wainu.ii.uned.es:8081/WAINU/canal-programacion/tutoriales/java/tutorial-
j2me.pdf> [Consultado el 10 de Junio de 2008].
[BLUE08] Bluetooth SIG, Inc. Bluetooth, Descripción general. [En línea]. 2008.
Disponible en: <http://spanish.bluetooth.com> [Consultado el 12 de Mayo de
2008].
[Borc04] BORCHES Juzgado, Pedro. JAVA 2 Micro Edition Soporte Bluetooth. [En
línea]. 2004. Disponible en:
<http://www.it.uc3m.es/celeste/docencia/j2me/tutoriales/bluetooth/EstudioTecnolog
ico1_0.pdf> [Consultado el 20 de Mayo de 2008].
110
[EBLU09] EXPLÍCAME, “Explícame: Qué significa Bluetooth”. [En línea].
Disponible en: < http://www.explicame.org/content/view/25/1/1/0/> [Consultado el
19 de Marzo de 2009]
[Galv03] GÁLVEZ Rojas, Sergio; Ortega Díaz, Lucas. JAVA a Tope. Java 2 Micro
Edition. [En línea]. Disponible en: < http://www.lcc.uma.es/~galvez/J2ME.html>
[Consultado el 11 de Julio de 2008].
[Gime04] GIMENO BRIEBA, Alberto. JSR-82: Bluetooth desde Java. 2004. [En
línea] <http://www.javahispano.org/contenidos/archivo/150/tooth.zip> Consultado
el 05 de Febrero de 2009.
111
[Iaco05] IACONO, Matías. Desarrollo para dispositivos móviles. [En línea].
Publicado en Febrero de 2005. Disponible en:
<http://www.netveloper.com/contenido2.aspx?IDC=166_0> [Consultado el 08 de
Mayo de 2008].
112
[More09] MORENO Tablado, Alberto. Arquitectura de protocolos Bluetooth. [En
línea]. 2009. <[http://www.seguridadmobile.com/bluetooth/especificacion-
bluetooth/arquitectura-de-protocolo/index.html> [Consultado el 25 de Marzo de
2009].
[Orti04] Ortiz, C. Enrique. Using the Java APIs for Bluetooth WirelessTechnology.
[En línea]. Publicado en Diciembre de 2004.
<http://developers.sun.com/mobility/apis/articles/bluetoothintro/> [Consultado el 31
de Mayo de 2009].
113
ANEXO A – Programa del microcontrolador
LIST P=16F876a
INCLUDE <P16F876a.INC>
bank0 MACRO
bcf STATUS,6
bcf STATUS,5
ENDM
bank1 MACRO
bcf STATUS,6
bsf STATUS,5
ENDM
bank2 MACRO
bsf STATUS,6
bcf STATUS,5
ENDM
RX equ .7
TX equ .6
PIE_1 equ 0ch
IOCB_ equ 16h
TXSTA_ equ 18h
SPBRG_ equ 19h
OPTION_R equ 1h
OSCCON_ equ 0fh
ANSELH_ equ 9h
114
cblock 20h
DATA_RCVD
PDel0
PDel1
luz
light0
light1
light2
LIGHTS
INTflags
cien
ciclo
endc
ORG 0
GOTOSTART
;*********************************************************************************************
; VECTOR DE INTERRUPCIONES PARA CADA CRUCE POR CERO
;*********************************************************************************************
ORG 4
btfss PIR1,5
goto ZERO_CROSS
call readBuffer
INT btfsc INTflags,0
goto ZERO_CROSS
bsf INTflags,0
movlw 088h
movwf INTCON
sleep
115
ZERO_CROSS clrf LIGHTS
clrf PORTB
bcf INTCON,2
btfsc PORTB,7
goto up
call _0.8mS
bcf INTCON,2
movlw .240
movwf TMR0
goto goON
up call _0.5mS
bcf INTCON,2
movlw .238
movwf TMR0
movlw .30
movwf ciclo
ask decfsz light0,0
goto ilumine0
bsf LIGHTS,0
goto zero1
116
xorwf ciclo,0
btfss STATUS,2
goto zero1
btfsc LIGHTS,0
goto zero1
bsf LIGHTS,0
bsf PORTB,0
movlw .50
call _uS
bcf PORTB,0
117
bsf LIGHTS,2
goto no1
ilumine2 decf light2,0
xorwf ciclo,0
btfss STATUS,2
goto no1
btfsc LIGHTS,2
goto no1
bsf LIGHTS,2
bsf PORTB,2
movlw .50
call _uS
bcf PORTB,2
;*********************************************************************************************
no1 btfss INTCON,2
goto no1
bcf INTCON,2
btfsc PORTB,7
goto up2
movlw .10
call _uS
movlw .240
movwf TMR0
goto clear
118
decre decf ciclo,1
verify movlw 07h
xorwf LIGHTS,0
btfss STATUS,2
goto ask
;*********************************************************************************************
; RUTINA PARA LEER DATO RECIBIDO Y VACIAR BUFFER
;********************************************************************************************
readBuffer movfw RCREG
movwf DATA_RCVD
movlw b'00001000'
xorwf PORTC,1
swapf DATA_RCVD,0
andlw 0fh
movwf luz
rrf luz,1
bcf luz,7
btfss luz,0
goto jmp
movlw 1fh
andwf DATA_RCVD,0
movwf light1
incf light1,1
return
119
movlw 1fh
andwf DATA_RCVD,0
movwf light2
incf light2,1
return
;*********************************************************************************************
; INICIO DE PROGRAMA
;*********************************************************************************************
START bank1
movlw b'10000101' ;Rate de 64 -> TMR0 para generar 820uS
movwf OPTION_R
;movlw b'00001000'
movlw b'10000000'
movwf PORTB
bsf PIE_1,5
bcf TXSTA_,4
bsf TXSTA_,2 ;High Baud Rate (BRGH = 1)
movlw .64 ;BAUD RATE = 19200
movwf SPBRG_
clrf PORTC
;bsf IOCB_,3
bsf PORTC,7
bank0
120
clrf LIGHTS
movlw 1h
movwf light0
movwf light1
movwf light2
clrf DATA_RCVD
clrf luz
clrf INTflags
bsf RCSTA,7
bsf RCSTA,4
clrf PORTB
clrf PORTC
bcf PIR1,5
clrf RCREG
movlw 0C0h
movwf INTCON
askAgain btfss PIR1,5
goto $-1
goto $-2
;*********************************************************************************************
; RUTINA PARA GENERAR uS
;*********************************************************************************************
_uS movwf PDel0 ;1 |
PLoop0 nop ; 1 delay
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no, loop
nop
return ; 2+2 Fin.
121
cienmili movlw .50
movwf cien
oh call dosmili
decfsz cien,1
goto oh
return
END
122
ANEXO B – SOFTWARE DEL CELULAR (Clase BTMidlet)
import java.io.IOException;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
123
int QtyLights;
boolean[] Quantity;
HiloConexion hilo;
short i,x=0;
int[] gauges;//Arreglo con la intensidad de cada Gauge
Registro RMS;
boolean numUsuarios;
public BTMidlet(){//Constructor
cmdExit=new Command("Salir", Command.EXIT, 1);
cmdLogin=new Command("Ingresar", Command.OK, 1);
txtUsername=new TextField("Usuario ", null, 10, TextField.ANY);
txtPassword=new TextField("Contraseña", null, 10, TextField.PASSWORD);
txtnewUsername=new TextField("Usuario ", null, 10, TextField.ANY);
txtnewPassword=new TextField("Contraseña", null, 10,
TextField.PASSWORD);
txtRePassword=new TextField("Contraseña", null, 10,
TextField.PASSWORD);
alertMessages=new Alert("Bienvenid@","BIENVENIDO A
BLUELIGHT",null,AlertType.INFO);
alertMessages.setTimeout(2000);
formLogin=new Form("Ingreso");
formLogin.addCommand(cmdExit);
formLogin.addCommand(cmdLogin);
formLogin.append(txtUsername);
formLogin.append(txtPassword);
formLogin.setCommandListener(this);
124
cmdOk=new Command("OK",Command.OK,1);
formSignUp=new Form("Nuevo Usuario");
formSignUp.addCommand(cmdExit);
formSignUp.addCommand(cmdOk);
formSignUp.append(txtnewUsername);
formSignUp.append(txtnewPassword);
formSignUp.append(txtRePassword);
formSignUp.setCommandListener(this);
cmdCancel=new Command("Cancelar",Command.CANCEL,1);
cmdLast=new Command("Último Estado",Command.OK,1);
listLights=new List("Luces", List.MULTIPLE);
listLights.addCommand(cmdExit);
listLights.addCommand(cmdOk);
listLights.addCommand(cmdLast);
listLights.append("Luz exterior", null);
listLights.append("Luz Sala Principal", null);
//listLights.append("Living Room 2 Light", null);
listLights.append("Luz Baño", null);
listLights.setCommandListener(this);
cmdSS=new Command("Conectar",Command.OK,1);
listDevices=new List("Dispositivos", List.EXCLUSIVE);
listDevices.addCommand(cmdExit);
listDevices.addCommand(cmdSS);
listDevices.setCommandListener(this);
125
formControl=new Form("Control");
cmdBack=new Command("Atrás", Command.BACK, 1);
formControl.setItemStateListener(this);
formControl.setCommandListener(this);
//Intensity=new Gauge[4];
Intensity=new Gauge[3];
QtyLights=0;
//Quantity=new boolean[4];
Quantity=new boolean[3];
gauges=new int[3];
i=0;
for(i=0;i<3;i++)
gauges[i]=0;
hilo=new HiloConexion(this);
RMS=new Registro();
numUsuarios=RMS.getNumUsuarios();
}
public void startApp() {
marquesina.setString("BLUELIGHT Versión 2.0");
formLogin.setTicker(marquesina);
pantalla=Display.getDisplay(this);
if(numUsuarios)
pantalla.setCurrent(alertMessages,formLogin);//Empieza con mensaje
else{
marquesina.setString("Nuevo Usuario");
formSignUp.setTicker(marquesina);
pantalla.setCurrent(alertMessages,formSignUp);
}
hilo.refMidlet(this);
}
126
public void pauseApp() {
}
127
//para que inicie más de 1 vez
hilo.refMidlet(this);
hilo.start();
pantalla.setCurrent(listLights);*/
listDevices.deleteAll();
hilo.searchDevices();
}
else{
alertMessages.setTitle("Error");
alertMessages.setString("Usuario y/o Contraseña inválidos");
alertMessages.setTimeout(Alert.FOREVER);
alertMessages.setType(AlertType.ERROR);
marquesina.setString("BLUELIGHT Versión 2.0");
alertMessages.setTicker(marquesina);
txtPassword.setString("");
pantalla.setCurrent(alertMessages,formLogin);
}
}
else if(cmd==cmdExit){
destroyApp(true);
notifyDestroyed();
}
}
if(display==formSignUp){
if(cmd==cmdOk){
if(txtnewPassword.getString().equals(txtRePassword.getString())){
RMS.guardarRegistros(txtnewUsername.getString(),txtnewPassword.getString(),
"Usuarios");
128
pantalla.setCurrent(formLogin);
}
else{
alertMessages.setTitle("Error");
alertMessages.setString("Contraseñas para
"+txtnewUsername.getString()+" no concuerdan");
alertMessages.setTimeout(Alert.FOREVER);
alertMessages.setType(AlertType.ERROR);
marquesina.setString("BLUELIGHT Versión 2.0");
alertMessages.setTicker(marquesina);
txtnewPassword.setString("");
txtRePassword.setString("");
pantalla.setCurrent(alertMessages,formSignUp);
}
}
else if(cmd==cmdExit){
destroyApp(true);
notifyDestroyed();
}
}
else if(display==listLights){
if(cmd==cmdOk){
hilo.searchServices("Bluelight");
i=0;
formControl.addCommand(cmdBack);
QtyLights=listLights.getSelectedFlags(Quantity);
do{
if(Quantity[i]==true){
129
Intensity[i]=new Gauge("Intensidad "+listLights.getString(i), true, 30,
gauges[i]);
formControl.append(Intensity[i]);
}
i++;
}
while(i<3);
//while(i<4);
marquesina.setString("INTENSIDAD DE LUCES");
formControl.setTicker(marquesina);
pantalla.setCurrent(formControl);
}
else if(cmd==cmdLast){
formControl.addCommand(cmdBack);
QtyLights=listLights.getSelectedFlags(Quantity);
try {
for(i=0;i<3;i++){
if(Quantity[i]==true){
gauges[i]=Integer.parseInt(new
String(RMS.leerRegistros(i+1,"Intensidades"),0,RMS.leerRegistros(i+1,"Intensidad
es").length));
Intensity[i]=new Gauge("Intensidad "+listLights.getString(i), true,
30, gauges[i]);
formControl.append(Intensity[i]);
if(i==0)
hilo.os.write(Intensity[0].getValue());
if(i==1)
hilo.os.write(Intensity[1].getValue()|32);
if(i==2)
hilo.os.write(Intensity[2].getValue()|64);
130
}
}
marquesina.setString("INTENSIDAD DE LUCES");
formControl.setTicker(marquesina);
pantalla.setCurrent(formControl);
} catch (IOException ex) {
ex.printStackTrace();
}
}
else if(cmd==cmdExit){
alertMessages.setTitle("Guardar");
alertMessages.setString("¿Desea guardar el estado de las luces?");
alertMessages.setTimeout(Alert.FOREVER);
alertMessages.addCommand(cmdOk);
alertMessages.addCommand(cmdCancel);
alertMessages.setType(AlertType.CONFIRMATION);
alertMessages.setCommandListener(this);
pantalla.setCurrent(alertMessages);
}
}
else if(display==listDevices){
if(cmd==cmdSS){
if(listDevices.getString(listDevices.getSelectedIndex()).equals("BLUELIGHT")){
hilo.searchServices("Bluelight");
}
else{
alertMessages.setTitle("Error");
131
alertMessages.setString("El dispositivo seleccionado no es
BLUELIGHT");
alertMessages.setTimeout(3000);
alertMessages.setType(AlertType.ERROR);
marquesina.setString("BLUELIGHT Versión 2.0");
alertMessages.setTicker(marquesina);
pantalla.setCurrent(alertMessages,formLogin);
}
}
else if(cmd==cmdExit){
destroyApp(true);
notifyDestroyed();
}
}
else if(display==formControl){
if(cmd==cmdBack){
i=0;
formControl.deleteAll();
//for(i=0;i<4;i++)
for(i=0;i<3;i++){
if(Intensity[i]!=null)
gauges[i]=Intensity[i].getValue();//Guarda las intensidades
Intensity[i]=null;
}
pantalla.setCurrent(listLights);
}
}
if(display==alertMessages){
132
if(cmd==cmdOk){
RMS.guardarRegistros(gauges, "RegIntensidades");//Guarda el estado
de luces en la BD
destroyApp(true);
notifyDestroyed();
}
else{
destroyApp(true);
notifyDestroyed();
}
}
}
133
hilo.os.write(x);
} catch (IOException ex) {
ex.printStackTrace();
}
}
else if(item==Intensity[2]){
System.out.println("El Gauge LR2 requiere "+Intensity[2].getValue());
gauges[2]=Intensity[2].getValue();
try {
x=(short)Intensity[2].getValue();
x=(short)(x | 64);
hilo.os.write(x);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
134
marquesina.setString("BLUELIGHT Versión 2.0");
alertMessages.setTicker(marquesina);
pantalla.setCurrent(alertMessages,formLogin);
}
}
}
135
ANEXO C - SOFTWARE DEL CELULAR (Clase HiloConexion)
import javax.microedition.io.*;
import java.io.*;
import javax.bluetooth.*;
import java.util.*;
import javax.microedition.lcdui.*;
ConnectionListener listener;
StreamConnection conexion;
InputStream is;
OutputStream os;
BTMidlet BTMidlet;
LocalDevice dispositivoLocal;
DiscoveryAgent da;
Vector dispositivosEncontrados=new Vector();
Vector serviciosEncontrados=new Vector();
136
}
}
try{
BTMidlet.alertMessages.setTitle("Servicios...");
BTMidlet.alertMessages.setString("Buscando servicios...");
BTMidlet.alertMessages.setTimeout(Alert.FOREVER);
BTMidlet.alertMessages.setType(AlertType.INFO);
BTMidlet.marquesina.setString("BLUELIGHT Versión 2.0");
BTMidlet.alertMessages.setTicker(BTMidlet.marquesina);
BTMidlet.pantalla.setCurrent(BTMidlet.alertMessages);
da.searchServices(null,new UUID[]{new
UUID(0x1101)},dispositivo_remoto,this);
}
catch(BluetoothStateException be){
BTMidlet.alertMessages.setTitle("Error...");
BTMidlet.alertMessages.setString("Excepción buscando servicios...");
BTMidlet.alertMessages.setTimeout(Alert.FOREVER);
BTMidlet.alertMessages.setType(AlertType.INFO);
BTMidlet.marquesina.setString("BLUELIGHT Versión 2.0");
BTMidlet.alertMessages.setTicker(BTMidlet.marquesina);
BTMidlet.pantalla.setCurrent(BTMidlet.alertMessages);
137
}
}
public void searchDevices(){
BTMidlet.alertMessages.setTitle("Dispositivos...");
BTMidlet.alertMessages.setString("Buscando dispositivos...");
BTMidlet.alertMessages.setTimeout(Alert.FOREVER);
BTMidlet.alertMessages.setType(AlertType.INFO);
BTMidlet.marquesina.setString("BLUELIGHT Versión 2.0");
BTMidlet.alertMessages.setTicker(BTMidlet.marquesina);
BTMidlet.pantalla.setCurrent(BTMidlet.alertMessages);
dispositivosEncontrados.removeAllElements();
try{
dispositivoLocal = LocalDevice.getLocalDevice();
dispositivoLocal.setDiscoverable(DiscoveryAgent.GIAC);
da = dispositivoLocal.getDiscoveryAgent();
da.startInquiry(DiscoveryAgent.GIAC,this);
}
catch(BluetoothStateException be){
}
}
public void run() {
ServiceRecord sr = (ServiceRecord)serviciosEncontrados.elementAt(0);
String url =
sr.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT,
false);
try{
BTMidlet.alertMessages.setTitle("Conectando...");
138
BTMidlet.alertMessages.setString("Espere, Bluelight está estableciendo
conexión");
BTMidlet.alertMessages.setTimeout(Alert.FOREVER);
BTMidlet.alertMessages.setType(AlertType.INFO);
BTMidlet.marquesina.setString("BLUELIGHT Versión 2.0");
BTMidlet.alertMessages.setTicker(BTMidlet.marquesina);
BTMidlet.pantalla.setCurrent(BTMidlet.alertMessages);
conexion = (StreamConnection) Connector.open( url );
is = conexion.openInputStream();
os = conexion.openOutputStream();
listener.connectionAction( "OK", 0 );
}
catch (IOException ex) {
ex.printStackTrace();
listener.connectionAction( "BAD", 0 );
}finally {
if( conexion != null ){
try {
conexion.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
139
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
for(int i=0;i<servRecord.length;i++){
ServiceRecord record = servRecord[i];
serviciosEncontrados.addElement(record);
}
}
if(serviciosEncontrados.size()>0){
BTMidlet.alertMessages.setTitle("Servicios encontrados...");
BTMidlet.alertMessages.setString("Intentaré conectar");
BTMidlet.alertMessages.setTimeout(Alert.FOREVER);
BTMidlet.alertMessages.setType(AlertType.INFO);
BTMidlet.marquesina.setString("BLUELIGHT Versión 2.0");
BTMidlet.alertMessages.setTicker(BTMidlet.marquesina);
BTMidlet.pantalla.setCurrent(BTMidlet.alertMessages);
run();
}
else{
BTMidlet.alertMessages.setTitle("Servicios no encontrados...");
BTMidlet.alertMessages.setString("Error");
BTMidlet.alertMessages.setTimeout(Alert.FOREVER);
BTMidlet.alertMessages.setType(AlertType.INFO);
BTMidlet.marquesina.setString("BLUELIGHT Versión 2.0");
BTMidlet.alertMessages.setTicker(BTMidlet.marquesina);
BTMidlet.pantalla.setCurrent(BTMidlet.alertMessages,BTMidlet.listDevices);
}
}
140
public void inquiryCompleted(int discType) {
for(int i=0;i<dispositivosEncontrados.size();i++)
{
try{
RemoteDevice dispositivoRemoto = (RemoteDevice)
dispositivosEncontrados.elementAt(i);
BTMidlet.listDevices.append(dispositivoRemoto.getFriendlyName(true),null);
BTMidlet.pantalla.setCurrent(BTMidlet.listDevices);
}catch(Exception e){
}
}
if(dispositivosEncontrados.size()==0){
BTMidlet.alertMessages.setTitle("Error...");
BTMidlet.alertMessages.setString("No se encontraron dispositivos
Bluetooth");
BTMidlet.alertMessages.setTimeout(Alert.FOREVER);
BTMidlet.alertMessages.setType(AlertType.INFO);
BTMidlet.marquesina.setString("BLUELIGHT Versión 2.0");
BTMidlet.alertMessages.setTicker(BTMidlet.marquesina);
BTMidlet.pantalla.setCurrent(BTMidlet.alertMessages,BTMidlet.formLogin);
}
}
}
141
ANEXO D – SOTWARE DEL CELULAR (Clase Registro)
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreNotOpenException;
public Registro(){
numUsuarios=false;
rs = null;
crearRegistros("Intensidades");
crearRegistros("Usuarios");
}
142
ex.printStackTrace();
}
try {
rs.closeRecordStore();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void abrirRegistros(String DB) {
try {
rs = RecordStore.openRecordStore( DB, true );
} catch( Exception e ) {}
}
143
ex.printStackTrace();
}
}
144
rs.getRecord( i, registro, 0 );
System.out.println( " +" + new String( registro, 0, registro.length ) );
}
byte[] registros = new byte[rs.getRecordSize( x )];
rs.getRecord( x, registros, 0 );
return registros;
} catch( Exception e ) {
System.out.println( " Eror en la lectura" );
}
try {
rs.closeRecordStore();
} catch (Exception ex) {
ex.printStackTrace();
}
return reg;
}
public void cerrarRegistros() {
try {
rs.closeRecordStore();
} catch( Exception e ) {}
}
145