Full text
Equation Chapter 1 Section 1 Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de la Telecomunicación Software de monitorización de Smart Meter a través del módem MTX65i Autor: Manuela Moreno Sánchez Tutor: Germán Madinabeitia Luque Dep. Ingeniería Telemática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2015
Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Software de monitorización de Smart Meter a través del módem MTX65i Autor: Manuela Moreno Sánchez Tutor: Germán Madinabeitia Luque Doctor Ingeniero de Telecomunicación Profesor Colaborador Dep. de Ingeniería Telemática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2015
Trabajo Fin de Grado: Software de monitorización de Smart Meter a través del módem MTX65i Autor: Manuela Moreno Sánchez Tutor: Germán Madinabeitia Luque El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2015 El Secretario del Tribunal
A mi familia, amigos y compañeros
Agradecimientos Diciendo gracias a todos consigo que todas las personas que habéis sido no solo un apoyo, sino el aire que he respirado en los momentos de desaliento, seáis los primeros en ser mencionados en esta breve reseña de agradecimiento. A mis padres, por enseñarme la constancia en el trabajo desde la infancia, haciendo que cada día diese gracias por todos los recursos que el mundo nos da, pero siendo siempre consciente de que sin trabajar la tierra nunca se consiguen los frutos. A mis hermanas, por hacerme la persona que soy hoy, por educarme cuando no había nadie más para hacerlo, por apoyarme cuando nadie más confiaba en mí, y por alentar sueños que quizá nunca alcance. A mi compañero, por transmitirme que las cosas tienen solución o no, pero que si la tienen, tarde o temprano la encontraremos, con más o menos suerte, con más o menos paciencia. Y por estar. A mis amigos y amigas, que han sabido soportarme y hacerme reír en cualquier momento, y que no han salido corriendo ni se han olvidado de mí cuando parecía que yo sí me había olvidado de ellos. A mis profesores, que desde pequeña no solo me han enseñado, sino que me han valorado, siendo un ejemplo y objeto de mi admiración. A todo el departamento y en especial a mi tutor, por facilitarme conocimientos necesarios para intentar comprender el mundo que me rodea, por exigirme con paciencia y darme una oportunidad de mejora en cada fracaso. A todas las personas, positivas o negativas, que han estado en mi vida durante estos años. Las primeras por aportar luz en cualquier momento. Las segundas por ser mi motivación para llegar más allá. Ojalá todas las personas aquí mencionadas reciban lo que yo he recibido de ellas.
5 Preparación del entorno ...................................................................................................................... 31 5.1 Instalación del Software............................................................................................................................ 31 5.1.1 Requisitos del sistema ....................................................................................................................... 31 5.1.2 Instalación de las herramientas de desarrollo [55]......................................................................... 32 5.1.3 Problemas encontrados en la instalacion de las herramientas de desarollo ............................... 40 5.1.4 Instalación de Putty [51] ................................................................................................................... 41 5.1.5 Instalación de Minicom [52] ............................................................................................................. 41 5.2 Primeros pasos con el módem MTX65i .................................................................................................... 41 5.2.1 Conexión y arranque ......................................................................................................................... 41 5.2.1.1 Vía Micro USB/USB para acceder a la memoria ...................................................................... 42 5.2.1.2 Vía Micro USB/USB para establecer una comunicación serie ............................................... 44 5.2.1.3 Vía puerto serie con un conector DB9 para establecer una comunicación serie ................. 45 5.2.2 Configuración de la conectividad GPRS del módem ....................................................................... 46 5.3 Problemas en la instalación y configuración del módem ....................................................................... 49 6 Programación de aplicaciones MIDlet .................................................................................................. 52 6.1 Introducción al entorno de programación ............................................................................................... 52 6.2 Introducción a la programación de aplicaciones MIDlet [67] ................................................................ 53 6.2.1 Hello World ........................................................................................................................................ 58 6.2.2 Thread ................................................................................................................................................ 58 6.2.3 Timer .................................................................................................................................................. 59 7 Desarrollo de la solución ...................................................................................................................... 60 7.1 Comunicación Módem – Red .................................................................................................................... 60 7.1.1 Time Sync Module ............................................................................................................................. 60 7.2 Comunicación Módem – Contador .......................................................................................................... 60 7.2.1 Serial Port Module ............................................................................................................................. 60 7.3 Comunicación Módem – Servidor Central ............................................................................................... 61 7.3.1 Socket TCP Module ........................................................................................................................... 61 7.3.2 HTTP vía GET Module ........................................................................................................................ 62 7.3.3 HTTP vía POST Module ..................................................................................................................... 63 7.4 TimerTask Module ..................................................................................................................................... 63 7.5 File Backup Module ................................................................................................................................... 63 7.6 Application Module ................................................................................................................................... 64 8 Pruebas ................................................................................................................................................ 66 8.1 Herramientas de pruebas ......................................................................................................................... 66 8.2 Pruebas realizadas a los componentes .................................................................................................... 67 9 Resultados ........................................................................................................................................... 68 10 Conclusiones y propuestas de mejora .............................................................................................. 69 10.1 Conclusiones .............................................................................................................................................. 69 10.2 Propuestas de mejora ............................................................................................................................... 70 ANEXOS ....................................................................................................................................................... 71 I. Códigos de ejemplo ....................................................................................................................................... 71 II. Código implementado ................................................................................................................................... 74 III. Relación de Comandos AT relevantes [69] .............................................................................................. 88 IV. Manuales de SDK Cinterion TC65i [70] .................................................................................................. 119 Bibliografía y Referencias .......................................................................................................................... 122
ÍNDICE DE ILUSTRACIONES Ilustración 3-1. Esquema secuencial de las acciones de la aplicación 17 Ilustración 3-2. Esquema de las conexiones entre los dispositivos 18 Ilustración 3-3. Esquema de los protocolos para el envío de la información 18 Ilustración 4-1. Módem Siemens MTX65i 19 Ilustración 4-2, Antena externa 19 Ilustración 4-3. Conversor MicroUSB/USB 19 Ilustración 4-4. Cable de alimentación 19 Ilustración 4-5. Interfaces serie del módem 20 Ilustración 4-6. Contador Cirwatt B200RCP 20 Ilustración 4-7. Captura de la ejecución del comando AT+IPR=? 22 Ilustración 4-8. Captura de la ejecución del comando AT+IPR? 22 Ilustración 4-9. Captura de la ejecución del comando AT+IPR 23 Ilustración 4-10. Captura de pantalla de la ejecución del comando ATI 23 Ilustración 4-11. Cable con conector DB9 Macho 25 Ilustración 4-12. TCP en el modelo de capas OSI 25 Ilustración 4-13. Esquema de comunicación y mensajes entre maestro y esclavo 27 Ilustración 4-14. Formato de PDU en el protocolo Modbus aplicado a comunicación serie 27 Ilustración 4-15. Trama con caracteres ASCII 28 Ilustración 4-16. Tramas de datos ASCII entre módem y contador 28 Ilustración 5-1. Diagrama de secuencia de la instalación del SDK 31 Ilustración 5-2. Modificación de la variable de entorno JAVA_HOME en Windows7 32 Ilustración 5-3. Instalador del CMTK de Cinterion 33 Ilustración 5-4. Captura de la ventana de instalación de MES 33 Ilustración 5-5. Captura de pantalla de la ventana de instalación de IMP Debug Connection 34 Ilustración 5-6. Captura de pantalla del Scan COM ports 34 Ilustración 5-7. Ventana de búsqueda de IDEs instalados en el sistema 35 Ilustración 5-8. Ventana de instalación del IDE Eclipse Pulsar 35 Ilustración 5-9. Ventana de instalación del plugin Mobile Tools for Java 36 Ilustración 5-10. Captura de la ventana “Preferences” lista para incluir el dispositivo MTX65i 37 Ilustración 5-11. Captura de la ventana de Manual Device Installation 38 Ilustración 5-12. Captura de la ventana “Preferences” con las herramientas del dispositivo añadidas 39 Ilustración 5-13. Captura de la ventana “Edit IMP-NG” 40 Ilustración 5-14. Captura de pantalla de la ventana “Equipo” 42 Ilustración 5-15. Captura de pantalla de “Propiedades” de “Module” 43 Ilustración 5-16. Captura de pantalla de la Selección de puerto 43 Ilustración 5-17. Captura de pantalla de la interfaz de Putty 44
Ilustración 5-18. Captura de la interfaz de Putty con comunicación serie abierta con el módem 45 Ilustración 5-19. Captura de pantalla de la sesión establecida en la interfaz de Minicom 46 Ilustración 5-20. Captura de la ejecución del comando AT+COPS en modo consulta y lectura 47 Ilustración 5-21. Captura de la ejecución del comando AT+COPN 47 Ilustración 5-22. Captura de pantalla con la ejecución de AT^SCFG? y AT+CGREG? 51 Ilustración 6-1. Selección del Workspace 52 Ilustración 6-2. Vista general Eclipse 53 Ilustración 6-3. Estados y métodos de cambio de estado básicos en aplicaciones MIDlet 54 Ilustración 6-4. Captura de selección del wizard para crear un nuevo Proyecto 55 Ilustración 6-5. Ventana de Propiedades del MIDlet creado 55 Ilustración 6-6. Captura de la ventana 2 de Propiedades del MIDlet 56 Ilustración 6-7. Propiedades del compilador de Java para cualquier proyecto 57 Ilustración 6-8. Captura de la ventana para Importar proyectos existentes 57 Ilustración 7-1. Diagrama de flujo de la aplicación final 64 Ilustración 7-2. Diagrama de las clases y métodos incluidas en el fichero principal de la aplicación 65
12 1 INTRODUCCIÓN Este proyecto ha sido propuesto por la empresa Wellness Telecom desde el área Wellness Smart, la cual se encarga del desarrollo de los proyectos relacionados con las denominadas “ciudades inteligentes” que mediante el uso de las nuevas tecnologías pretenden mejorar nuestro entorno y día a día. La idea del proyecto es realizar un software que permita que el terminal módem MTX65i se comunique bidireccionalmente tanto con un contador de medidas eléctricas como con el centro de recolección de datos. Para ello se utilizarán comunicaciones a través del puerto serie en el binomio módem-contador, y GPRS en el caso del módem y la central. La principal ventaja de la incorporación del módem es que, a bajo coste, podemos conseguir una pasarela de comunicación entre un dispositivo que de otro modo no sería capaz de transmitir los datos obtenidos sin ser sustituido por otro compatible. Para cumplir este cometido se necesita una aplicación que se ejecute en el módem gracias al firmware que contiene basado en Java ME (versión reducida de la máquina virtual de Java para sistemas embebidos). Esta aplicación se encargará de implementar las comunicaciones necesarias entre un contador compatible, el módem y el servidor. El contador utilizará el protocolo DLMS [1] o Modbus [2] en un principio, aunque podría ser implementado para todos los contadores que cumplan el estándar IEC 60870-5, adaptando únicamente la trama esperada por el módem y la comunicación del contador. Para la codificación y pruebas será necesario un ordenador con el sistema Windows XP o 7 con el IDE de Eclipse y el plugin Mobile Tools for Java para el desarrollo de aplicaciones MIDlet. También contará con el SDK proporcionado por el fabricante correspondiente al TC65i que es el módulo interno del módem. Dentro del mismo se incluye el driver que posibilita la detección del dispositivo al ser conectado mediante USB. De manera puntual, para las comunicaciones serie se utilizará el sistema operativo Linux Ubuntu y Minicom a través de una terminal para establecer la comunicación serie RS232. La central deberá implementar un servidor que atienda las peticiones HTTP o de conexión del módem para la recepción de medidas el cual implementaremos mediante una instancia virtual de Ubuntu con Apache y PHP así como la posibilidad de comportarse como cliente en el caso de solicitar una medida puntual en un momento indeterminado. Gracias a todos estos elementos diseñaremos y desplegaremos un software autónomo capaz de enviar medidas a través de la red de forma segura y reduciendo los costes que supone la sustitución de un nuevo equipo de telegestión.
1.1 Objetivos El principal objetivo de este proyecto es conseguir una aplicación software autónoma instalada en el módem que de manera periódica solicite las medidas tomadas por el contador y acto seguido, las envíe a través de GPRS utilizando conexiones TCP vía socket o con HTTP Get o Post. Así mismo, otro objetivo crucial es que dada la futura localización del módem, se puedan establecer conexiones externas de manera segura con el terminal para solicitar una lectura asíncrona de las medidas del contador que se envíe de manera inmediata al solicitante. Esto supone el principal reto dada la naturaleza del dispositivo, ya que el módem cuenta con un firmware basado en Java ME diseñado para aplicaciones sencillas en sistemas embebidos. El tercer objetivo es la comunicación con el contador de manera que se establezca un protocolo de comunicación en el que a solicitud del módem, el contador devuelva los datos en un formato determinado de trama que permita su mínimo procesamiento antes de ser enviada a la central. Dado que para lograr la comunicación con el exterior vía GPRS es necesario contratar un proveedor de servicio que nos suministre el acceso a la red de datos, lo ideal es que la comunicación de éstos consuma lo menos posible y para ello es necesario que el tamaño de los datos a envía no supere ciertos límites con lo que además disminuiremos el número de errores en la transmisión o recepción. Tampoco podemos olvidar que el módem tiene una capacidad computacional reducida (400KB de RAM) lo que nos obliga a utilizar Java Micro Edition que es una versión reducida cuya librería cuenta con un número de clases muy escaso, entre las que se incluyen las que permiten el uso de comandos destinados al módem por lo que otro de los objetivos sería que la aplicación fuese lo más eficiente posible teniendo en cuenta la herramienta utilizada. Pero a su vez debemos conseguir que dos procesos independientes como son la realización de solicitud de medidas síncronas al contador y la permanente escucha a la espera de solicitudes por parte del servidor central se ejecuten con normalidad y que interaccionen entre sí llegado el momento. También sería conveniente lograr la menor probabilidad de error y si éste se produjese, que pueda ser solventado mediante una nueva versión desplegada vía OTAP. Y del mismo modo si ocurre algún fallo en la alimentación del dispositivo cuando ésta se restablezca que tanto el módem como la aplicación reinicien su funcionamiento con total autonomía sin que un agente externo intervenga en el proceso. Por último se fijará como objetivo dada la naturaleza del dispositivo y del lenguaje de programación utilizado que la plataforma sea lo más escalable posible y compatible con el mayor número de dispositivos. En caso de necesitar adaptación se promoverá que tenga el menor impacto posible. 1.2 Alcance El alcance de este proyecto comprenderá prácticamente la totalidad de los objetivos marcados en el punto anterior, salvo los relacionados con la comunicación con el contador dado que este dispositivo no ha sido proporcionado aún por la empresa. Esto implica que la parte de la comunicación serie entre el contador y el módem se realizará de forma simulada conectando el módem a un ordenador con puerto serie en su lugar y enviando y recibiendo datos por esta conexión. De igual modo ocurre con la autenticación con el contador cuya implementación no ha sido posible. En definitiva se alcanzará el objetivo final de comunicación entre los tres elementos (módem, servidor y contador) pero emulando la parte del contador mediante un ordenador conectado al otro lado de la comunicación serie.
14 1.3 Estructura de la memoria Este apartado tiene como objetivo dar una vista preliminar del documento al completo de manera que el lector pueda navegar con menor dificultad en el caso de buscar extractos concretos. 1. Introducción Es el apartado en el que nos encontramos, que proporciona información general acerca del desarrollo del proyecto así como una descripción de los objetivos identificados y el alcance del mismo. 2. Estado del arte Pretende informar sobre algunas de las soluciones similares que se han implementado o se están desarrollando actualmente relativas a las comunicaciones entre dispositivos de telemetría y los sistemas centrales que necesitan sus medidas, como puede ser el caso del software MTX Tunnel o el proyecto Meters and More. 3. Descripción de la solución Se dará una primera visión de la solución que se desea implementar para cumplir con los objetivos y el alcance descritos anteriormente. 4. Herramientas En este extenso apartado detallaremos todas las herramientas utilizadas a lo largo del proyecto. Comenzaremos por los dispositivos físicos que se utilizarán como son el módem MTX65i, una tarjeta SIM con acceso a servicio de datos, el contador de medidas eléctricas, un ordenador con SO Windows 7 y otro con Linux Ubuntu. También se mencionarán los lenguajes de programación para la implementación como son Java en su versión JME y los comandos Hayes (conocidos también como comandos AT). De igual modo se explicarán los protocolos fundamentales como TCP en el caso de sockets para el envío de la información capturada por el módem o HTTP si elegimos trabajar a nivel de aplicación con el mismo propósito de envío. Se hará una mención a DLMS [1] o Modbus [2] como protocolos para la lectura de datos del contador y el uso de RS232 para la comunicación del puerto serie. En cuanto al software necesitaremos que el módem cuente con la versión de firmware adecuada, un cliente como putty para establecer y emular conexiones serie si nos encontramos en el SO Windows y Minicom en el caso de Ubuntu. Para el desarrollo y la codificación utilizaremos el IDE de eclipse, con plugins adicionales, además del SDK del módulo TC65i que contiene el módem. Por último para las pruebas será necesario levantar un servidor Apache con PHP sobre Ubuntu 14.04 gracias a una instancia virtual en la nube y tener acceso a la VPN para realizar las comunicaciones en la intranet de la empresa. 5. Preparación del entorno
Aquí se proporcionará información detallada de todas las instalaciones de software, puesta en marcha de dispositivos y pruebas de comunicaciones realizadas. Finalmente se incluirá un breve apartado de los problemas encontrados en la instalación y las soluciones aportadas. 6. Programación de aplicaciones MIDlet Este apartado consistirá en una inmersión en la programación de aplicaciones MIDlet que utilizan java como base con una versión reducida (JME) pensada especialmente para dispositivos con pocos recursos. También se incluirán algunos ejemplos de aplicaciones sencillas como son un Hello World o un Timer. 7. Desarrollo de la solución La arquitectura y disposición del hardware, así como el desarrollo software de la aplicación serán detalladas en este apartado. Se explicará como a través de una programación modular se logran por separado los hitos marcados. Por ejemplo para un hito como la comunicación de la información usando HTTP vía Post, se crea un módulo que únicamente realiza esta función y cuando ésta funciona, se añade al resto de módulos ya implementados como puede ser Serial Port de manera que vamos construyendo la aplicación final. 8. Pruebas Se describirán las pruebas realizadas a la aplicación por la interacción entre el módem y las herramientas destinadas a la comprobación del funcionamiento y el cumplimiento de los requisitos especificados. 9. Resultados Exposición de los resultados obtenidos al realizar las pruebas así como en la puesta en funcionamiento de la aplicación desarrollada. 10. Conclusiones y propuestas de mejora Se detallarán las conclusiones extraídas de todo el proyecto en su conjunto, incluyendo un subapartado con las vías de mejora propuestas sobre la aplicación funcional inicialmente desplegada. 11. Bibliografía, Referencias y ANEXOS El contenido de estos apartados contará con una relación de las fuentes de información utilizadas, así como de un conjunto de anexos como puede ser una lista de los comandos AT utilizados durante el desarrollo.
22 - Modo de comandos: los datos recibidos se interpretan como comandos que deben ser ejecutados por el módem en cuestión. Para cambiar del modo de datos al de comandos hay una secuencia de escape (“+++”) seguido de una pausa de un segundo [28]. Para regresar al modo de datos se envía “O” aunque en realidad es raro utilizar el comando de línea ya que tras los comandos puede configurarse para que vuelva al modo de datos. Las principales funciones de los comandos AT son manipulaciones de línea, marcado y colgado, así como controles de configuración como el baud rate o tasa de símbolos por segundo. El conjunto de comandos AT se puede dividir en: - Comandos básicos: Se componen por AT seguidos de una letra y opcionalmente (en el caso de que haya varios que hagan referencia al mismo comando) un número. Por ejemplo, con ATE1 habilitamos el eco de los comandos que enviemos para que se muestren por la pantalla de la interfaz de conexión que estemos utilizando, mientras que con ATE0 lo deshabilitaríamos. - Comandos especiales: Se escriben AT& seguido de una letra. Por ejemplo AT&F restaura los valores de configuración de fábrica. Ocurre igual con AT\, que repite el último comando ejecutado. - Comandos extendidos: Vienen definidos por el fabricante del módem. En nuestro caso pueden ser del tipo AT+ seguido de unas siglas que ayudan a conocer la función del comando, como por ejemplo, AT+COPS que se utiliza para seleccionar el operador. Para comandos sobre parámetros de configuración lo habitual es que aparezca un ^ en lugar del signo +. Un ejemplo de este comando sería AT^SCFG que permite ver o modificar los parámetros de la configuración extendida. Además, dependiendo de la naturaleza de cada comando, éstos se podrán ejecutar en 4 modos distintos: - Modo consulta. En este modo podremos ver los posibles valores que podemos asignar al comando. Se ejecuta insertando el comando seguido de “=?”. Un ejemplo sería AT+IPR=?, que nos devolvería la lista de tasas de bit que podemos utilizar en el modem. Ilustración 4-7. Captura de la ejecución del comando AT+IPR=? - Modo lectura. En este caso se ejecuta el nombre del comando seguido de un signo “?”. De esta manera obtendremos el valor actual del comando. Por ejemplo el comando anterior sería: Ilustración 4-8. Captura de la ejecución del comando AT+IPR? - Modo escritura. Gracias a este modo podemos asignar un valor de la lista de valores soportados por cada
comando (que podemos conocer ejecutando el modo consulta). Por ejemplo, para asignar un valor a la tasa de bits que utilizará el módem: Ilustración 4-9. Captura de la ejecución del comando AT+IPR - Modo ejecución. Ciertos comandos solo pueden ser ejecutados puesto que no tiene utilidad alterar su valor, basta con que realicen la acción para la que están definidos. Es el caso del comando ATI, que nos muestra información acerca del dispositivo. Ilustración 4-10. Captura de pantalla de la ejecución del comando ATI Por último cabe destacar que, al ejecutar un comando de escritura, los cambios que apliquemos pueden aplicarse inmediatamente y quedar registrados en la memoria no volátil del dispositivo, aplicarse tras el reinicio del terminal y quedar registrados en la memoria no volátil del dispositivo, o aplicarse con carácter inmediato pero que dejen de tener efecto si se deja de alimentar el terminal. En el caso de que queramos guardar los valores para la configuración que hayamos dado en un momento determinado como un perfil propio de configuración para restaurarlos al reiniciar el terminal debemos ejecutar el comando AT&W que almacena estos ajustes en la memoria no volátil. Para restaurar esta configuración al encender el dispositivo basta con ejecutar AT&Z y si queremos recuperar los valores de fábrica podemos utilizar AT&F. En el anexo Relación de Comandos AT relevantes se pueden ver una relación de los comandos AT más utilizados y para una consulta más completa el pdf con el manual de comandos AT disponible en el SDK del módulo TC65i. 4.2.2 Java [29] Es el lenguaje de programación orientada a objetos por excelencia. Se trata de un lenguaje de propósito general basado en clases y diseñado para tener el menor número de dependencias de implementación (aunque deriva de C y C++ tiene un menor número de instalaciones de bajo nivel que éstos). Su objetivo es permitir a sus desarrolladores programar una sola aplicación que se pueda ejecutar en cualquier dispositivo sin necesidad de volver a ser compilado (Write Once Run Anywhere) [30]. Es ampliamente utilizado para aplicaciones web cliente servidor [31]. Actualmente Oracle Corporation es la propietaria de la aplicación oficial de la plataforma Java SE. La implementación de Java carece de normativa al respecto por parte de la ITU, IEC, etc., por lo que la ofrecida por Oracle es el estándar de facto. Existen dos distribuciones: Java Runtime Enviroment (JRE) que contiene lo necesario para ejecutar programas Java y está destinado a usuarios finales, y el set de desarrollo Java Development Kit (JDK) que contiene además herramientas de desarrollo como el compilador de Java [32], Javadoc [33], un depurador, etc.
24 4.2.2.1 JME [34] Conocido anteriormente como Java 2 Micro Edition, JME es una derivación de Java que proporciona un entorno para las aplicaciones que se ejecutan en sistemas embebidos y dispositivos móviles (sensores, teléfonos móviles, etc.) Incluye interfaces flexibles, una función de diversos protocolos y soporte para aplicaciones en red y fuera de línea. Estas aplicaciones son compatibles con multitud de dispositivos pero a la vez tratan de aprovechar los recursos de cada uno de ellos. En nuestro caso Java incluye Java ME SDK para desarrollar aplicaciones con la configuración CLDC (Connected Limited Device Configuration) [35] que define el conjunto base de las interfaces de programación gracias a las cuales se construyen aplicaciones en dispositivos móviles como es nuestro caso. Combinado con un perfil Mobile Information Device Profile (MIDP) como el Information Mobile Profile – Next Generation (IMP-NG) [36] proporciona una sólida plataforma java para la ejecución de aplicaciones en sistemas embebidos. La empresa Cinterion ha desarrollado una serie de librerías para esta plataforma que se incluyen en el SDK del TC65i y que complementan la programación de aplicaciones MIDlet. 4.3 Comunicaciones 4.3.1 Comunicación serie RS232 [37] La comunicación serie RS232 es la base de la transmisión de datos entre el módem MTX65i y el contador de medidas eléctricas. Se trata de un estándar eléctrico y mecánico de los sistemas de transmisión de información [38]. Aquí se especifica el método de conexión entre los dispositivos equipo terminal de datos (DTE) y equipo de terminación del circuito de datos (DCE) que en su origen fue desarrollado para interconectar terminales de datos a los módems [39]. Este estándar cuenta con tres partes principales: características eléctricas de la señal, las características mecánicas de la interfaz y la descripción funcional de los circuitos de enlace [40]. RS-232 define los niveles de tensión y las características que debe tener la puesta a tierra, en referencia a las características eléctricas de la señal que en nuestro caso vendrán definidas por las características dadas por los equipos que intervienen en la comunicación (módem y ordenador de sobremesa) que cumplen con el estándar. También se describen los circuitos asociados a un sistema desequilibrado. En cuanto a las características mecánicas de la interfaz entre el DTE y el DCE se indica que la toma de corriente normalmente estará en el DCE y que se utilizará un cable con conectores DB9/DB25. En nuestra aplicación utilizaremos un conector DB9 entre el módem (DCE) y el equipo (DTE).
Ilustración 4-11. Cable con conector DB9 Macho Sobre la descripción funcional podemos decir que el protocolo permite fijar los bits que serán identificados como datos, si queremos bit o no de paridad y si utilizaremos bit de parada. 4.4 Protocolos 4.4.1 TCP [41] El Protocolo de Control de Transmisión busca dar fiabilidad en la capa de transporte del modelo OSI entre los equipos que establezcan conexiones en internet. Se trata de un protocolo fiable, orientado a conexión extremo a extremo. Está diseñado para que encaje en el modelo de capas OSI, concretamente en la capa de transporte que es la capa que soporta a la de aplicación y justo por encima de la capa de red, que proporciona a TCP un camino para el envío y recepción de segmentos de longitud variable según el canal. Ilustración 4-12. TCP en el modelo de capas OSI En nuestro caso TCP puede utilizarse como alternativa a la solución de peticiones y respuestas HTTP diseñadas para que la aplicación comunique los datos recopilados o como soporte del socket servidor.
26 4.4.2 HTTP [42] El Protocolo de Transferencia de Hipertexto se diseñó para la distribución de información entre sistemas conectados a través de internet, encontrándose en la capa de aplicación. El protocolo se utiliza también en servidores de nombres o sistemas de gestión de distribución de objetos gracias a sus métodos de petición, códigos de error y encabezados. Una de las características de HTTP es la negociación de la representación de los datos, permitiendo que sean los sistemas a la hora de transferir la información los que fijen este aspecto sin venir prefijado anteriormente. Se basa en la disciplina que le proporciona el Identificador Uniforme de Recursos (URI) [43], a través de una ubicación (URL) o un nombre (URN) para indicar al recurso al que se va a aplicar el método que se indique. HTTP se utiliza como protocolo genérico para la comunicación entre los agentes de usuario y proxis/entrada a otros sistemas de Internet incluyendo SMTP [44], FTP [45], etc. Algunos aspectos básicos a tener en cuenta sobre HTTP son los términos que lo definen: - Conexión: Se trata de un circuito virtual que la capa de transporte establece con el propósito de llevar a cabo comunicación. - Mensaje: Unidad básica de comunicación en HTTP que consiste en una secuencia estructurada de octetos que cumplen con la sintaxis del protocolo [35]. - Request: Mensaje que contiene un HTTP Request con los campos que se definen en la RFC [35]. - Response: Mensaje que se envía en respuesta al mensaje anterior con los campos definidos [35]. - Cliente: Programa que establece conexión con el propósito de enviar peticiones. - Agente de usuario: El cliente que inicia la petición. Suelen ser navegadores, editores, etc. - Servidor: Programa que acepta conexiones con el fin de dar respuestas a los clientes. Cualquier programa puede actuar como servidor al ser el que envíe las respuestas. Según donde se encuentre la información (parte de la URI o no) se definen los principales métodos: GET y POST que aportan el primer paso de seguridad dentro del protocolo. Además en esta línea podemos mencionar la mejora a HTTPS que establece una conexión cifrada segura para este protocolo. En nuestro caso tendremos que el cliente será el módem que de manera periódica enviará un HTTP Request con la información obtenida del contador vía POST con el formato definido en el siguiente apartado. 4.4.2.1 Mensaje de datos enviados por HTTP Los datos con la información sobre las medidas realizadas se transmitirán en un mensaje de tipo HTTP utilizando el método Post para evitar que la información viaje en la cabecera y lo haga en el cuerpo del mensaje. El formato del mensaje, además de los campos obligatorios como Content-Length o el Content-Type, incluiría en el cuerpo la cadena data= seguida de dos parámetros especificados por las claves measure y time separados por comas, cuyo valor nos proporcionará el contador mediante la comunicación serie. Por tanto el cuerpo del mensaje quedaría de la siguiente manera: measure=value&time=valueTime
En nuestro caso utilizaremos como se puede comprobar en el anexo del código implementado el Content-type /xwww-form-urlencoded que es el necesario para que la petición HTTP sea procesada correctamente por nuestro servidor y recibamos el correspondiente eco. El content-type no tiene por qué ser el mismo en todos los casos, también se puede utilizar texto plano por ejemplo. Los valores se envían en el cuerpo de la solicitud, en el formato que especifica el tipo de contenido. Los métodos utilizados en JME para añadir el contenido de los campos necesarios incluyendo el body se especificarán en el apartado referente al desarrollo del módulo HTTP vía POST Module. 4.4.3 Modbus [46] Dado que por motivos ajenos al desarrollo de este proyecto no se dispone del contador con el se iba a establecer la comunicación de los datos para su transmisión, la parte referente al protocolo utilizado para la petición y respuesta de datos entre el módem y el contador se va a emular de la manera que se explica a continuación. Con objeto de simplificar esta emulación y puesto que se trata de un protocolo muy utilizado para propósitos similares a este en el que la comunicación se produce entre dispositivos punto a putno con un conector como elemento de transmisión se ha escogido el protocolo Modbus. Modbus aplicado a comunicación serie [46] es un protocolo maestro-esclavo donde solo hay un maestro (en nuestro caso el módem) y uno o varios esclavos (contadores) conectados al mismo bus. Ilustración 4-13. Esquema de comunicación y mensajes entre maestro y esclavo Utilizaremos el modo unicast, en el que cada comunicación se compone de un mensaje request desde el maestro y otro response por parte del esclavo, que no podrá comunicarse sin un request previo por parte del esclavo. La PDU quedará compuesta según estas características de la siguiente forma: Ilustración 4-14. Formato de PDU en el protocolo Modbus aplicado a comunicación serie El campo de dirección solo es necesario en el caso de los esclavos ya que en la otra dirección solo existe un maestro al que comunicarse. El código de función sirve para indicar al esclavo que acción quiere el maestro que realice (por ejemplo, envio de medidas).
28 Los bytes de datos se transmite primero el bit menos significativo. Estos datos pueden ser transmitidos utilizando el modo RTU (los campos son directamente un flujo de bits) o en modo ASCII en el que los bytes de datos representan caracteres según esta codificación, que será la utilizada: Ilustración 4-15. Trama con caracteres ASCII 4.4.3.1 Formato de los datos recibidos por Modbus Para el envío de los datos los mensajes que utilizamos en serán Request Data y Response Data cuyo contenido se muestra en la ilustración: Ilustración 4-16. Tramas de datos ASCII entre módem y contador En ambas tramas se indica el número de esclavo ya que en la del maestro se requiere la medida a es esclavo en concreto y en la respuesta indica de cuál de los posibles viene la información. El código de operación será en la trama del esclavo Measure Request (MR) y en la respuesta Measure Info (MI) indicando que devuelve la información solicitada. 4.5 Software a instalar 4.5.1 Firmware del Módem Siemens MTX65i Este dispositivo cuenta con la versión de firmware 2.004 que incluye un cambio sustancial en cuanto a las anteriores. El cambio consiste en que el nombre de la ruta de directorios que contiene la librería de J2ME diseñada para el modem pasa de com.siemens.* a com.cinterion.*. En cuanto al firmware se encuentra basado en la plataforma Java ME explicada en el apartado anterior JME. El módem permite además que podamos comunicarnos a través de comandos Hayes (más popularmente conocidos como comandos AT) con los que podemos llevar a cabo cualquiera de las acciones de interacción con sí mismo y con la red que contiene. Una muestra de los mismos así como una relación de los más relevantes será incluida en el Anexo B.
4.5.2 Eclipse Helios SR2 versión 3.6.2 [47] Se trata del entorno de desarrollo en el cual podremos programar la aplicación incluyendo las herramientas necesarias mediante la plataforma Eclipse Mobile cuyo paquete se denomina Pulsar y contiene lo necesario para el desarrollo. Aunque no se trata de las versiones más recientes de estas herramientas son las que el distribuidor recomienda utilizar para evitar problemas tanto en tiempo de ejecución como de compilación y de configuración en general de las mismas. También ofrece la posibilidad de utilizar NetBeans IDE versión 6.9.1. Eclipse, además de tratarse de la plataforma más extendida para este dispositivo, cuenta con numerosas ventajas de sobra conocidas que aporta [48], como ser multiplataforma y contar con numerosos plugins disponibles para añadir multitud de utilidades. Eclipse dispone de un editor de texto con analizador sintáctico. La compilación es en tiempo real, incluye desarrollo de pruebas con JUnit, control de versiones con CVS y wizards para asistir la creación de proyectos, clases, etc. 4.5.3 Java Development Kit (JDK) versión 1.6.0_25 [49] Contiene las herramientas necesarias para desarrollar aplicaciones en java como son librerías de clases, compilador de Java, Webstart y archivos para applets, etc., además del Java Runtime Execution (JRE). El JRE es una versión reducida sin compilador que contiene la JVM y otros componentes para ejecutar aplicaciones y applets de java únicamente. 4.5.4 SDK del módulo TC65i El CD de instalación Cinterion Mobility Toolkit (o en nuestro caso el Zip proporcionado por el proveedor oficial de Gemalto) contiene los siguientes elementos. - Wireless Toolkit. El WTK es el directorio en el que se encuentran todos los componentes necesarios para la creación específica de aplicaciones Java ME y su depuración. La versión se encuentra en un archivo de texto en "Archivos de programa \ Cinterion \ CMTK \ <nombre del producto> \ WTK \ VersionWTK.txt". - Doc con la documentación HTML - Lib es el directorio donde se encuentra la librería J2ME con las clases necesarias almacenadas en un fichero denominado classes.zip - Ejemplos WTK que se hallan en el directorio "All Users \ Cinterion ABC2 WTK Examples" que son ejemplos específicos de aplicaciones en JME (J2ME). Module Exchange Suite. La configuración MES se encuentra "Installer \ MES Setup.exe". El MES proporciona herramientas para acceder al sistema de archivos Flash a través de una interfaz en serie desde el explorador de Windows. MES se puede instalar de manera independiente o como parte del CMTK como veremos en el apartado de instalación
30 Preparación del entorno. - IMP debugging connection, para depurar la conexión. La configuración se encuentra en "Installer\IMPDbgConnectionSetup.exe". Además instala un módulo para la depuración del dispositivo. Igual que en el caso de MES se puede instalar de manera independiente o dentro del instalador del CMTK. - SDK de Java para la programación de aplicaciones de java, es necesario tanto el IDE escogido (En nuestro caso Eclipse) como el Java Development Kit que contiene la JVM: o JDK (versión 6.25) o NetBeans IDE (versión 6.9.1 para 32 y 64 bits) o Eclipse Helios SR2 (versión 3.6.2 para 32 y 64 bits) - Documentación con distintos ficheros de información del dispositivo (hardware, fuente de alimentación, etc.) así como anexos como por ejemplo una lista de comandos AT o una Guía Java para Usuarios en la que se desarrollan desde cero algunos ejemplos para ayudar en el aprendizaje y familiarización con el software [50]. 4.5.5 Putty versión 0.64 [51] Software con licencia libre que permite establecer conexiones Telnet, SSH, TCP o Serie a través de una interfaz similar al terminal de comandos. Lo utilizaremos para establecer conexiones en Windows 7 ya que en esta versión no disponemos del HyperTerminal. El software está disponible para su descarga en internet en su página oficial. [26] 4.5.6 Minicom versión 2.7 [52] Se trata de un software emulador de terminal que se utiliza en distribuciones Linux para establecer comunicaciones mediante el puerto serie a través de un terminal. Cumple la función de permitirnos establecer una comunicación serie utilizando Linux. 4.5.7 Apache2 versión 2.4.7 [53] Dentro de Apache incluiremos el servidor HTTP que intercambiará información con el módem a través de peticiones. 4.5.8 PHP versión 5.5.28 [54] Versión de PHP que utilizaremos en el servidor Apache.
5 PREPARACIÓN DEL ENTORNO 5.1 Instalación del Software Vamos a pasar a la instalación del SDK de Cinterion versión 2.004 para poder desarrollar aplicaciones MIDlet. Para ello es necesario disponer de los archivos que vienen en el CD de instalación que el proveedor suministra o en caso de no tener dicho CD, ponerse en contacto con el proveedor para que lo envíe. Si esto ocurre el proveedor proporcionará un enlace al que podréis acceder mediante autenticación con usuario y contraseña. Desde ahí basta con descargar los ficheros del CD de instalación. Para que tengamos una visión general de los principales pasos de la instalación tenemos este diagrama de secuencia: Ilustración 5-1. Diagrama de secuencia de la instalación del SDK En él podemos ver como tras los preparativos para ejecutar el setup.exe éste archivo ejecuta dentro de su propia instalación la del resto de componentes necesarios como el MES para acceder a la memoria del dispositivo, el IMP Debug Connection, etc. A continuación pasamos a explicar en detalle la instalación completa. 5.1.1 Requisitos del sistema El kit de herramientas de Cinterion CMTK que se encuentra en el CD de instalación necesita que el equipo en el que se instale tenga: - Windows XP, Windows Vista o Windows 7 instalado - 110 MB de espacio libre en disco para la CMTK (sin JDK e IDE)
38 Ilustración 5-11. Captura de la ventana de Manual Device Installation Una vez seleccionemos el directorio de WTK si pulsamos “Refresh” debe aparecernos el dispositivo tal y como ocurre en la figura lo que seleccionándolo y pulsando “Finish” quedará añadido. Para configurar sus propiedades lo seleccionamos en la ventana “Preferences” y clicamos Editar.
Ilustración 5-12. Captura de la ventana “Preferences” con las herramientas del dispositivo añadidas Es necesario editar estas herramientas porque aunque por defecto se instala WTK hasta que no se incluye el plugin MTJ no podemos configurar todo para que nos aparezcan las clases soportadas por el módem o el enlace al Javadoc (que se encuentran en el directorio del CD de instalación). En la siguiente figura se muestra como incluir la ruta del Javadoc:
40 Ilustración 5-13. Captura de la ventana “Edit IMP-NG” Con este último paso tendremos el SDK de Cinterion completamente instalado incluyendo el IDE elegido (Eclipse) con el plugin para desarrollo de aplicaciones para dispositivos móviles Mobile Tools for Java y el conjunto de herramientas específico para el módem MTX65i Wireless Toolkit que nos proporcionará las librerías con las clases que soporta este módulo, quedando el entorno completamente configurado para iniciar el desarrollo de aplicaciones como se describirá en el apartado Introducción a la programación de aplicaciones MIDlet. Toda la información sobre la instalación del SDK ha sido extraída del manual destinado a tal efecto que incluye [58]. 5.1.3 Problemas encontrados en la instalacion de las herramientas de desarollo En nuestro caso, debido a la falta del CD se solicitó el SDK al distribuidor (Gemalto propietaria de Cinterion [59]), pero por tratarse del periodo estival, no recibimos el SDK hasta pasado un mes durante el cual se trabajó con una versión anterior (versión 1.100) que ha propiciado diversos problemas a lo largo del proceso de instalación.
- En primer lugar, dado ya contábamos con Eclipse instalado en su versión 4.3.2 pasamos a la instalación de un plugin adicional para adquirir las herramientas de Eclipse Mobile denominado EclipseME en su versión 1.6.8 sin el cual no podríamos programar aplicaciones MIDlet. El problema consistía en la incompatibilidad de versiones dado que el plugin estaba preparado para funcionar en la versión 3.2.2 de Eclipse. La solución a este problema fue la reinstalación de Eclipse en la versión requerida. - De igual modo ocurría con la versión del JDK por lo que se reinstaló el paquete completo de Java. - Al cambiar el JDK la máquina virtual de había dejado de funcionar lo que impedía el arranque de eclipse generando un error del tipo “An error ocurred. See the log file C:\Users\Usuario\.eclipse\configuration\XXXXXXXXXX.log file”. Esto era debido a que no se modificó automáticamente el valor del directorio del JDK en la variable JAVA_HOME, que fue la solución al problema. - Por último, utilizando la librería proporcionada por este SDK anterior y de nuevo propiciado por una incompatibilidad de versiones no se detectaban en tiempo de ejecución clases que sí existían en tiempo de compilación (no solo eran importadas sino que Eclipse compilaba el código sin problema). En este caso no era posible solucionar el error sin el SDK de la nueva versión proporcionado por el fabricante ya que, justo en la versión 2.004 que contenía el firmware del módem se produjo una modificación del nombre de la estructura de directorios, en la cual Cinterion decidió cambiar la nomenclatura de los mismos de com.siemens.* a com.cinterion.*. [60] A pesar de que las clases no cambiaban en esta nueva librería, el cambio de nombre propiciaba que al compilar no apareciesen errores pero al ejecutar con una versión de firmware con la nueva estructura se produjera el error NoClassDefFoundError. La solución pasa por utilizar el SDK de Cinterion en la última versión disponible. 5.1.4 Instalación de Putty [51] Como indicamos en el apartado de Software a instalar si estamos utilizando el sistema operativo Windows 7 necesitamos un software que nos permita establecer conexiones (en nuestro caso serial) ya que en esta versión del SO no disponemos de HyperTerminal. Para poder utilizar putty solo necesitamos descargarlo de la página oficial que se encuentra aquí [51]. 5.1.5 Instalación de Minicom [52] La instalación del paquete de Minicom se puede hacer en Ubuntu desde los repositorios ejecutando el siguiente comando: sudo apt-get install minicom 5.2 Primeros pasos con el módem MTX65i Vamos a describir el procedimiento para arrancar por primera vez el módem y establecer la configuración que nos interesa tanto en el módem como en el ordenador al que lo conectemos. 5.2.1 Conexión y arranque Para comenzar, introduciremos la SIM en el módem en el lugar indicado a tal efecto. Aunque no es imprescindible para una primera configuración del mismo, esto nos evitará tener que reiniciar el módem cuando nos dispongamos a fijar los parámetros de acceso a la red.
42 A continuación es necesario alimentar el módem con el cable proporcionado por el proveedor. En este momento el módem durante unos segundos estará en fase de arranque en la cual no podemos realizar ninguna acción sobre el mismo. Una vez alimentado se inicia de manera automática y puesto que no dispone de un botón de reset, la manera de reiniciar es desconectarlo de la corriente. Una vez ha arrancado podemos conectarnos al módem de tres maneras. 5.2.1.1 Vía Micro USB/USB para acceder a la memoria Este mecanismo será el adecuado cuando queramos introducir las aplicaciones MIDlet que hayamos programado en la memoria del módem para que se ejecuten cuando lancemos los comandos adecuados. Si es la primera vez que nos conectamos por USB al módem será necesario configurar el Module Exchange Suite anteriormente instalado para tener acceso a la memoria del dispositivo desde el explorador de Windows. Debemos tener en cuenta que para que esto ocurra el módem debe estar conectado y cada vez que accedamos mediante el MES los parámetros de configuración relativos al Baud rate se fijarán a la tasa que necesita esta herramienta que es una de las disponibles para el módem [61] como por ejemplo 115200. Tampoco debemos olvidar que el número máximo de objetos que podemos poner en dicha memoria es de 200 incluyendo archivos y subdirectorios. Dicho ellos para configurar el acceso debemos ir a “Equipo”. Debe aparecernos un icono como el de la siguiente imagen tras la instalación del CMTK: Ilustración 5-14. Captura de pantalla de la ventana “Equipo” Hacemos click derecho en “Module” y escogemos “Propiedades”. Debe aparecernos una ventana como esta:
Ilustración 5-15. Captura de pantalla de “Propiedades” de “Module” Vamos a la pestaña “Port” para escoger el puerto a través del cual queremos acceder a la memoria con lo que aparecerá: Ilustración 5-16. Captura de pantalla de la Selección de puerto
44 Seleccionamos el puerto que aparece, clicamos en “Aplicar”, posteriormente a “Aceptar”. Si hacemos doble clic en Module tendremos acceso a “Module Disk (A:) para poder incluir los ficheros de aplicación que desarrollaremos más adelante. 5.2.1.2 Vía Micro USB/USB para establecer una comunicación serie Otra de las posibilidades es conectar igualmente el USB como en el caso anterior pero en lugar de acceder a la memoria del dispositivo será establecer una conexión gracias al cliente Putty instalado en el apartado Instalación de Putty . Haciendo doble clic sobre el archivo descargado durante la instalación nos aparecerá una ventana como la de la siguiente ilustración en la que podremos indicar los parámetros de la conexión que queremos establecer: Ilustración 5-17. Captura de pantalla de la interfaz de Putty Habrá que elegir el “COM” que se ajuste a nuestra conexión (lo podemos ver en las propiedades de Module) el baud rate en speed teniendo en cuenta que se trate de una de las permitidas por el fabricante [61]. Por último tampoco podemos olvidar elegir la opción “Serial” que es el tipo de comunicación que queremos establecer. Con esto podemos iniciar la conexión clicando “Open”. El aspecto de la interfaz así como algunos comandos de prueba aparecen en la siguiente imagen.
Ilustración 5-18. Captura de la interfaz de Putty con comunicación serie abierta con el módem 5.2.1.3 Vía puerto serie con un conector DB9 para establecer una comunicación serie Si queremos utilizar un puerto serie real y no emulado como en el caso anterior debemos utilizar un equipo que cuente con este conector (DB9). En nuestro caso se trata de un ordenador de sobremesa que tiene instalado Ubuntu 14.04. Para poder enviar datos en una comunicación serie necesitamos instalar en Ubuntu el paquete de Minicom como se indica en el apartado Instalación de Minicom . Al conectar el módem mediante el cable DB9 correspondiente al ordenador tenemos que abrir una terminal y ejecutar el siguiente comando: dmesg | grep tty Así obtenemos la lista de mensajes del búfer del kernel [62] que es donde se genera la información relativa a la conexión del puerto serie como el nombre que se le asigna para poder utilizarlo. La salida de este comando nos aportará el nombre asignado a nuestro puerto, en nuestro caso “/dev/ttyS0”. Solo falta ejecutar minicom y ajustar los parámetros de la conexión según nos indica el propio Minicom, por ejemplo 8n1 (8 bits de datos, ningún bit de paridad y 1 bit de parada), el baud rate 4800 y el nombre del puerto /dev/ttyS0. Con esta información ya podemos ejecutar: sudo minicom –D /dev/ttyS0 Ahora lo que tecleemos en el terminal será enviado al módem y las respuestas del módem a los comandos insertados se mostrarán por pantalla (con el eco activado si hemos ejecutado el comando ATE1), quedando lo que se muestra en la siguiente figura:
46 Ilustración 5-19. Captura de pantalla de la sesión establecida en la interfaz de Minicom Puede ocurrir que en la configuración del módem no se encuentre especificado que queremos que la salida estándar sea por el ASC0. Un indicador de que esto ocurre es que vemos los comandos que mandamos al módem pero no vemos el OK en respuesta o similar. Para solucionarlo tenemos que ejecutar el comando: AT^SCFG=”Userware/Stdout”,”ASC0” (o ASC1 si estamos conectados al segundo puerto del módem). Si cambiamos a utilizar el USB desde Windows como en el apartado anterior solo tenemos que sustituir en el comando “ASC0” por “USB”. 5.2.2 Configuración de la conectividad GPRS del módem Uno de los pilares fundamentales para lograr el objetivo de la comunicación de datos es configurar el acceso a la red de datos del operador que hayamos elegido. Para este punto no olvidemos que la SIM tiene que estar insertada en el dispositivo. El módem dispone de una serie de comandos que nos permiten realizar esta configuración si nos encontramos en el modo de comandos y no de datos. Pero si necesitamos configurar estos parámetros del perfil de conexión para que nuestra aplicación se conecte a un APN concreto podemos indicar la configuración de dicho perfil mediante el código de la aplicación, como veremos en el apartado de desarrollo de la misma Comunicación Módem – Servidor Central. Centrándonos en el modo comandos los pasos a realizar son los siguientes. Si comenzamos a utilizar comandos AT es una buena práctica activar la salida de códigos de error en formato alfanumérico para obtener toda la información posible de la siguiente manera: AT+CMEE=2 Con esto quedará activado para que nos muestre por la salida estándar que tengamos establecida en AT^SCFG=”Userware/Stdout” (comando de configuración extendida) los mensajes de error completos. En primer lugar es necesario conocer los datos de nuestro punto de acceso (nombre del APN, usuario y contraseña). En caso de que tengamos intención de conectarlos a través del APN de la compañía operadora estos datos estarán disponibles en Internet. En nuestro caso al tratarse de un APN perteneciente a una empresa se sustituirán los mismos por los del operador de Movistar, a modo de ejemplo. Comprobamos que nuestra tarjeta no tiene código PIN mediante el comando en modo consulta: AT+CPIN? Si no está protegida la respuesta a este comando será: +CPIN: READY En caso contrario podemos obtener:+CPIN: SIM PIN
Lo que significará que se encuentra a la espera de que se le introduzca el PIN, por lo que tendremos que ejecutar el comando en modo escritura: AT+CPIN = 1234 Donde 1234 debe ser sustituido por el código PIN correspondiente. Cuando introduzcamos el código correcto debe aparecer +CPIN: READY Ahora comprobamos que el módem se encuentra en el modo de funcionamiento completo (puede encontrarse en algún modo “sleep” en cuyo caso no podríamos realizar la conexión). Para ello ejecutamos: AT+CFUN Debe devolvernos 1. Si no es así lo activaremos nosotros mismos ejecutando el comando en modo escritura: AT+CFUN=1 Si ejecutamos el comando AT+COPS en modo consulta y lectura veremos los operadores disponibles y si actualmente está ligado a algún operador respectivamente. En nuestro caso: Ilustración 5-20. Captura de la ejecución del comando AT+COPS en modo consulta y lectura Vemos la lista de operadores disponibles (incluido el operador actual marcado con un 2). Además si lo ejecutamos en modo lectura vemos que la selección de operador está en modo automático (primer parámetro devuelve 0). También vemos que se está usando el formato alfanumérico para mostrarnos el operador (segundo parámetro a 0), y finalmente nos muestra el operador actual (“Vodafone ES”). Si automáticamente no se conecta al APN de ningún operador podemos ejecutar el comando AT+COPN en modo ejecución para ver los operadores disponibles: Ilustración 5-21. Captura de la ejecución del comando AT+COPN
54 Ilustración 6-3. Estados y métodos de cambio de estado básicos en aplicaciones MIDlet Además de éstos que es necesario incluir de manera obligatoria, adicionalmente podemos incluir la definición de los siguientes métodos heredados de la clase MIDlet: - notifyDestroyed (): Notifica al software de gestión de aplicaciones que se va a proceder a la destrucción de la aplicación. Es la única manera de poner fin a un MIDlet y se utiliza dentro del método destroyApp (). No debe ser llamado antes. - notifyPaused () – El MIDlet notifica al software que da soporte a la gestión de aplicaciones que se ha detenido la aplicación. Se implementa en el método pauseApp (). - resumeRequest (): El MIDlet notifica al software de gestión de aplicación que se reinicie. A pesar de que no los implementemos en nuestra aplicación explícitamente podemos hacer uso de ellos. Las acciones que queremos que nuestra aplicación ejecute tendremos que incluirlas principalmente en el método startApp () o que se llame a los métodos que ejecutan dichas acciones desde este método. Para crear un proyecto que implemente la clase MIDlet en Eclipse podemos utilizar el wizard que gracias a la instalación del SDK se encuentra en “File” “Project” “New Project” y nos aparecerá la siguiente ventana:
Ilustración 6-4. Captura de selección del wizard para crear un nuevo Proyecto Después de escoger el Wizard aparecerá la ventana de opciones que se muestra a continuación en la cual debemos dar un nombre a nuestro proyecto MIDlet. Es muy importante asegurarnos de que “IMP_NG_ABC2” se encuentra seleccionado. Ilustración 6-5. Ventana de Propiedades del MIDlet creado
56 Si pulsamos “Next” veremos la siguiente ventana, en la cual es muy importante comprobar que las opciones en “Microedition Configuration” son “Connected Limited Device Configuration (1.1)” y en “Microedition Profile” está seleccionado “Information Module Profile (NG). Esto es crucial ya que si no está la opción correcta seleccionada al ejecutar la aplicación en nuestro dispositivo obtendremos el error “MIDlet Profile Invalid”. Ilustración 6-6. Captura de la ventana 2 de Propiedades del MIDlet Clicando “Finish” tendremos un proyecto MIDlet creado en el workspace. Para finalizar tenemos que cambiar la versión del compilador que se ejecutará en esta aplicación, como se muestra en la siguiente ilustración:
Ilustración 6-7. Propiedades del compilador de Java para cualquier proyecto Wireless ToolKit incluye un directorio con proyectos MIDlet de ejemplo que podemos importar a nuestro workspace seleccionando “Import” y escogiendo “Existing Projects into Workspace”. En la ventana que aparece tenemos que poner la ruta al directorio del SDK donde se encuentran los ejemplos y seleccionar la opción “Copy projects into workspace”, como podemos ver en la siguiente imagen: Ilustración 6-8. Captura de la ventana para Importar proyectos existentes
58 6.2.1 Hello World El ejemplo más sencillo para mostrar todos los elementos anteriormente descritos en acción es el clásico “Hello World”. Para crear este proyecto desde 0 si no lo hemos importado, podemos utilizar el Wizard disponible como se vio en el apartado anterior (Ilustración 6-4. Captura de selección del wizard para crear un nuevo ProyectoIlustración 6-4 e Ilustración 6-5). En el fichero HelloWorld.java podemos encontrar la clase main que hereda las características de la clase MIDlet cuyos métodos principales son startApp (), destroyApp () y pauseApp () y deben estar definidos aunque su cuerpo se encuentre vacío, ya que de lo contrario se generará un error ya que estamos heredando de una clase sin implementar sus métodos obligatorios. Para implementar una aplicación MIDlet que imprima en la salida estándar un mensaje “Hello World!” basta con definir en la clase principal la cadena a imprimir y los métodos citados anteriormente dejando el constructor de la clase vacío. En el método startApp () (que se ejecutará automáticamente sin necesidad de llamarlo nada más arrancar la aplicación en caso de que no llamemos a cualquiera de los otros dos métodos) incluimos la línea de impresión por la salida estándar. De no incluir nada más la aplicación cumplirá el objetivo e imprimirá “Hello World!”, pero si lo ejecutamos veremos que hasta que no reiniciamos el módem no salimos de la aplicación al modo comandos. Esto se debe a que al finalizar la impresión del mensaje no hemos incluido la llamada al método destroyApp () lo que implica que la aplicación no podrá cambiar de estado y se quedará permanentemente sin destruirse. Para solventar esta situación tenemos que añadir al código la línea de llamada al método destroyApp () como se ve en el Anexo. La codificación ya ha concluido pero es importante antes de compilar comprobar que las propiedades de los perfiles MIDlet están bien ajustadas (Captura de la ventana 2 de Propiedades del MIDlet) y la versión del compilador es correcta (Propiedades del compilador de Java para cualquier proyecto). Para obtener los archivos necesarios (.jar con la aplicación y .jad con la descripción del perfil que define la aplicación) compilamos el proyecto completo mediante “Project” “Build project” y creamos el paquete haciendo click derecho sobre el proyecto elegimos “JME” “Create package”. Los ficheros .jar y .jad necesarios aparecerán en el directorio “deployed” en el interior del proyecto. Ahora incluimos estos dos ficheros en la memoria interna del módem accediendo como se indica en el apartado Vía Micro USB/USB para acceder a la memoria. Para ejecutarlo debemos iniciar una comunicación serie con el módem (Vía Micro USB/USB para establecer una comunicación serie o Vía puerto serie con un conector DB9 para establecer una comunicación serie) y una vez establecida insertamos el comando para ejecución de aplicaciones indicando la ruta en la que se encuentra el fichero .jar de la aplicación.: AT^SJRA=”A:/HelloWorld.jar” Si tenemos la salida estándar configurada adecuadamente (ASC0 si nos conectamos por puerto serie o USB si nos utilizamos ese conector) aparecerá por pantalla el mensaje “Hello World!”. 6.2.2 Thread En este caso y con los mismos pasos y características que en la creación de la aplicación Hello World, vamos a crear una que sirva de ejemplo de funcionamiento de los hilos. Para ello creamos igualmente mediante el Wizard un proyecto MIDlet denominado “Thread” que lo que hará será crear una clase “ThreadExample” que hereda de la clase MIDlet y tendrá en su interior definida otra clase que implementará la clase Thread. Thread permitirá un hilo de ejecución independiente dentro de un programa gracias a que implementa la interfaz Runnable (para ejecutar código mientras otra parte del programa sigue ejecutándose). Tenemos dos formas de implementar un hilo. La primera consiste en declarar nuestra propia clase “MyThread” que herede de la clase Thread pero sobreescribiendo el método “run” que será el que contenga el código que
queremos que se ejecute. La segunda es crear una clase cualquiera que implemente la interfaz Runnable que es la que aporta la capacidad de ejecución simultánea. Nosotros en este ejemplo vamos a crear una clase que herede de la clase Thread como se ve en el código del anexo. Así nuestra clase main del proyecto contendrá las variables necesarias para su ejecución (un tipo boolean para indicar si seguimos ejecutando el hilo o lo paramos y un objeto de la clase ThreadExample), el constructor de la clase y la clase implementada ThreadExample. Ésta contendrá igualmente tanto las variables que se necesiten como el constructor de la clase, además del método run que será el código que conformará la acción de la aplicación. En nuestro caso se tratará de un contador que al llegar a cierta cantidad (bucle for) interrumpirá el hilo poniendo la variable runThread a false como se puede ver en el anexo. La ejecución de esta aplicación tras ser compilada, empaquetada y puesta en la memoria del módem será: 6.2.3 Timer La clase Timer en realidad se trata de un hilo ejecutado en segundo plano que pasado cierto tiempo indica que ha expirado el timeout establecido. Se utiliza por ejemplo para ejecutar tareas en un instante de tiempo determinado o para repetir tareas cada cierto tiempo. En este ejemplo se implementa un contador que imprime cada segundo los segundos que lleva contando el timer. Para ello en primer lugar es necesario implementar una clase que herede de la clase TimerTask (que es la que se encarga de definir un método run propio que se ejecutará cuando el temporizador expire). En esta clase llamada Monitor en nuestro caso heredamos de la clase TimerTask y en el método run incluimos una impresión del valor actual de un contador que previamente se ha incrementado en 1 unidad. Ahora en el método startApp () de la clase principal “main” creamos un objeto de tipo Monitor y otro de tipo Timer. Con la siguiente línea iniciamos el TimerTask de manera que en el intervalo de tiempo indicado como tercer parámetro se ejecutará el método run () del objeto “mon”: timer.schedule(mon,0,1000); Así se imprimirá por pantalla el valor de un contador incrementado cada segundo.
60 7 DESARROLLO DE LA SOLUCIÓN Tras lo aprendido con los breves ejemplos anteriores nos proponemos comenzar a implementar la aplicación final objeto de este proyecto. El enfoque del desarrollo ha sido la construcción de pequeños módulos de código independientes que realizarán las tareas más simples en que se puede dividir la aplicación (como por ejemplo el envío de mensajes HTTP) de manera que al ser ejecutadas con ciertos parámetros de entrada proporcionasen la salida requerida. Con este modelo de caja negra a la hora de unir las partes diseñadas nos aseguramos una acotación de los errores a la hora de su depuración total así como una ejecución más comprensible y secuencial. La división de estos módulos se ha realizado en primer lugar en base al segmento de comunicación en el que se encuentre la aplicación (comunicación serie entre módem y contador, comunicación entre el módem y el servidor central) o si se encuentra en tareas de procesado interno (ejecución del Timertask) 7.1 Comunicación Módem – Red 7.1.1 Time Sync Module La aplicación en primer lugar debe sincronizar su hora actualizándola con el valor que se le proporcione cuando se una a la red. Esto se consigue con la posibilidad de ejecutar comandos AT desde dentro del código en Java de manera que con un comando denominado AT^SIND consigamos los datos de la hora actual en el meridiano de Greenwich (GMT) junto con el desfase del huso horario en el que se encuentre el módem medido en cuartos de hora, así como un indicador de si se encuentra activo el horario de verano en la localización actual. De esta manera obtenemos la hora pero es necesario fijarla como la hora del módem gracias al comando AT+CCLK que se utiliza para este fin. El único problema que se encuentra en esta fase es que la información devuelta por el primer comando no es compatible para ser directamente introducida como cadena al segundo comando, por lo que la información horaria debe ser procesada para poder introducir el formato adecuado en el comando AT+CCLK. Esto se consigue con la ejecución de un bucle que recorre la cadena recibida de la red en busca de la fecha y hora que se va a introducir, guardándola en otra cadena que será el parámetro de entrada al segundo comando. 7.2 Comunicación Módem – Contador 7.2.1 Serial Port Module Ahora nos encontramos en la fase de interacción que se dará entre el módem y el contador vía comunicación serie. En este caso lo primero que debemos comprobar es qué nombre podemos asignar al puerto serie correspondiente al contador. Se trata de un dato fundamental para establecer la comunicación entre el módem y el contador ya que todos los flujos abiertos (de entrada, salida de datos) deben conocer el nombre del puerto al que se encuentran ligados. Para ello basta ejecutar el método: String ports = System.getProperty("microedition.commports");
Que nos devolverá una lista de cadenas separadas por comas que contiene un listado predefinido por el módem de los nombres disponibles para asignar a los puertos conectados (COM0 y COM1 dado que el módem solo tiene dos interfaces puerto serie ASC0 y ASC1). Escogiendo uno de los valores devueltos tendremos ya listo un nombre que asignar al puerto serie que se encuentre conectado al contador. El siguiente paso es abrir los flujos de entrada y salida de información que son punteros a las zonas de memoria donde vamos a insertar los datos al escribir en el flujo o de donde vamos a leer en el caso contrario. Todos los tipos de flujos que se pueden utilizar en Java ME (StreamConnection, HttpConnection, ServerSocketConnection, etc.) necesitan ser instanciados con el mismo procedimiento que detallaremos a continuación. Lo primero es crear un objeto de la clase del flujo que nos dispongamos a abrir en nuestro caso StreamConnection (debido a problemas con la utilización de CommConnection que se detallarán posteriormente). StreamConnection streamConn = null; streamConn = (StreamConnection)Connector.open("comm:"+ portAvailable+";baudrate=115200;blocking=off"); Con la segunda línea lo que hacemos es utilizar la clase Connector que crea objetos de tipo Connection y cuyo método open abre la posibilidad de comunicación entre los dispositivos. En este método el único parámetro de entrada serán los valores de configuración necesarios para la comunicación establecida (baud rate, nombre del puerto, etc.) Pero para que haya comunicación es necesario que se habran flujos tanto de lectura como de escritura que se encuentren vinculados al flujo de comunicación principal. Esto se consigue haciendo: InputStream in_stream_serial = streamConn.openInputStream(); OutputStream out_stream_serial = streamConn.openOutputStream(); De manera que si ahora queremos leer o escribir solo tenemos que llamar a los objetos correspondientes de tipo InputStream u OutputStream con los métodos disponibles en cada uno a tal efecto, como se puede ver en la siguiente línea: int currentCharacter = in_stream_serial.read(); bufferOut = ":01MRSendMeMeasurementData/n"; out_stream_serial.write(bufferOut.getBytes()); Y con una secuencia organizada de lectura y escritura del flujo de conexión quedaría definida la comunicación serie. 7.3 Comunicación Módem – Servidor Central La comunicación con la central la podemos realizar de tres maneras diferentes: vía socket TCP si queremos que la comunicación sea a nivel de la capa de transporte o HTTP vía GET/POST si queremos llegar hasta la capa de aplicación. 7.3.1 Socket TCP Module Uno de los objetivos consiste en que sea posible requerir desde el servidor una medida asíncrona en cualquier momento. Esto solo es posible si, a la vez que el módem ejecuta el hilo principal del programa con el TimerTask funcionando, en otro hilo independiente tenemos un servidor de cualquier tipo esperando permanentemente esa conexión entrante. Como ya se ha comentado el número de clases incluidas en la librería JME es reducido dado
62 que se trata de una versión de Java destinada a dispositivos móviles con pocos recursos. Es por este motivo que la única clase servidor que se adapta a nuestras necesidades es la denominada ServerSocketConnection cuyo cometido es iniciar un socket de escucha que detecte un posible inicio de sesión desde el servidor. Análogamente al caso de la comunicación serie es necesario crear un objeto de tipo Stream que abra un socket de escucha en el puerto elegido. Para ello incluimos en el método startApp () las siguientes líneas tras la sincronización de fecha y hora con la red: serverSocketConn = (ServerSocketConnection) Connector.open("socket://:23"+connProfile); socketConn = (SocketConnection) serverSocketConn.acceptAndOpen(); Con esto abrimos el flujo de la posible conexión en el puerto indicado y bloqueamos el proceso hasta que se establezca alguna conexión con el socket de escucha. Es muy importante que en la ejecución del programa final incluyamos un hilo independiente del principal con esta característica porque en caso contrario la aplicación no saldría de este punto y no ejecutaría la petición de medidas periódicas. Además de indicar que se trata de una conexión de tipo socket y el puerto el método open necesita que incluyamos en la cadena la información del APN que vamos a utilizar para la conexión con el exterior vía GPRS. Por tanto en la cadena connProfile incluiremos los siguientes valores de configuración: private String connProfile = ";bearer_type=gprs;access_point=wlgdsp.com;" + "username=well;password=well;timeout=-1;"; Tal y como se comentó en el caso serie es necesario abrir también los correspondientes flujos de entrada y salida para lectura y escritura. 7.3.2 HTTP vía GET Module Los mensajes HTTP también utilizan una clase de tipo Connection para establecer un flujo que soporte el intercambio de mensajes de petición y respuesta entre el módem y el servidor: HttpConnection httpConn = (HttpConnection)Connector.open(url + connProfile); Que abre un flujo de tipo Connection en el que utilizamos como en los casos anteriores el método open y cuyo parámetro incluye igualemente el perfil de la conexión GPRS con las propiedades del APN anteriormente descritas. Como se explicó en el apartado sobre HTTP podemos utilizar dos métodos en este protocolo según donde viaje la información (cabecera en el caso GET por lo que quedaría visible en la URL o en el cuerpo si usamos POST). Esta elección con la siguiente línea: httpConn.setRequestMethod(HttpConnection.GET); A partir de aquí como ocurre en todas las conexiones tendremos que añadir el código que habilita el uso de streams tanto de entrada como de salida para la lectura y la escritura de datos con las características del protocolo que utilicemos. Una vez hayamos escrito con el método write en el flujo de salida la línea que envía el mensaje de petición es: int respCode = httpConn.getResponseCode(); Este método nos devuelve el código que nos envíe en respuesta el servidor HTTP (200 OK si todo va bien y otro en caso contrario).
7.3.3 HTTP vía POST Module En este caso el código es idéntico al caso HTTP GET salvo al fijar el método que tenemos que indicar que en este caso es POST: httpConn.setRequestMethod(HttpConnection.POST); Además aquí podemos fijar algún parámetro adicional como el Content-type: httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); En nuestra aplicación tal y como explicaremos más adelante, utilizaremos una combinación del módulo HTTP vía POST en el caso del envío de información desde el módem al servidor ya sea de manera síncrona o asíncrona porque así evitamos que los datos viajen en la cabecera apareciendo en la URL. En caso de que el que inicie la conexión sea el servidor para solicitar una medida instántanea utilizaremos el socket TCP mencionado anteriormente de manera que no haya que esperar a que expire el temporizador para obtener los datos. 7.4 TimerTask Module Este módulo es el alma de la aplicación ya que es el encargado de que se ejecute periódicamente de manera sencilla. Tal y como hicimos en el ejemplo Timer creamos una clase que herede de TimerTask cuyo método run va a estar compuesto por las llamadas a los módulos de lectura del contador vía puerto serie y envío de medidas por HTTP. TimertaskClass timertaskObj = new TimertaskClass(); timer = new Timer(); timer.scheduleAtFixedRate(timertaskObj, 0, measureIntervalTimeout); Desde el momento en el que se ejecuta el método scheduleAtFixedRate el timerTask está en funcionamiento dado que el segundo parámetro que es el retardo en el inicio del temporizador está a 0. Además si el servidor devuelve algún código de respuesta de error o el eco recibido de los datos enviados es incorrecto, guardaremos en un fichero los datos enviados para su posterior recuperación, utilizando un método de escritura en un stream de fichero que se definirá a continuación. 7.5 File Backup Module Este es un módulo adicional en el módem se encarga de guardar los datos de las medidas en un fichero de respaldo en caso de no recibirse correctamente en el servidor. El módulo utiliza la apertura de un flujo en un fichero que de no existir se crea y en caso contrario se escribe al final del mismo. Las líneas principales de este módulo son: FileConnection fileConn = (FileConnection) Connector.open("file:///a:/backup.txt"); OutputStream out_stream_file = fileConn.openOutputStream(sizeFile); out_stream_file.write(data.getBytes()); En la apertura del flujo de escritura el parámetro de entrada del método es el tamaño del fichero. Con esto conseguimos que el descriptor de fichero se localice al final del contenido del mismo evitando la sobreescritura.
70 10.2 Propuestas de mejora En esta primera versión de la aplicación encontramos que a pesar de que cumple con el objetivo principal de transmisión y recepción de datos podemos incluir ciertas mejoras que contribuirían a la eficiencia de la misma, las cuales se detallarán a continuación. En el binomio módem-contador podemos incluir que el maestro (en este caso el módem) controle más de un esclavo o contador gracias a que en Modbus se puede gestionar la comunicación de varios elementos de tipo esclavo, habilidad muy útil por ejemplo en el caso de incluir un módem con función de concentrador en un edificio en el que haya diversos suministros de electricidad cuyas medidas sea necesario enviar. Para incluir esta funcionalidad sería preciso además disponer que un bus dado que el módem solo cuenta con 2 puertos serie o limitarnos simplemente a dos contadores. Referente a la comunicación mediante mensajes HTTP podemos incluir varias mejoras como pueden ser, en primer lugar, enviar en los mensajes HTTP los datos incluidos en un objeto JSON que es más fácilmente parseable. También y en torno a la seguridad podemos modificar la conexión HTTP por una HTTPS cuya clase está definida para JME también. De esta manera quedarían los datos del cuerpo del mensaje encriptados permitiendo un mayor grado de seguridad en la transferencia vía GPRS. Para llevar a cabo esta mejora sería necesario incluir certificados para la autenticación entre el cliente (módem) y el servidor. En cuanto a la función de backup disponible en la versión del software actual también podemos añadir ciertas características que aporten mayor eficiencia a la aplicación, como pueden ser la comprobación del tamaño del fichero para que cuando este supere cierta cantidad de datos se avise al servidor de que las medidas almacenadas en el fichero deben ser recuperadas, o que periódicamente este fichero pueda ser enviado a través de FTP. Otra forma podría ser utilizar el método readFile para leer los datos del fichero y mandarlos vía HTTP sin necesidad de utilizar la transferencia del fichero. Para la mejora del servidor socket TCP que se encuentra a la escucha, su funcionamiento actual solo implica que al recibir un inicio de conexión, se envíe un OK en respuesta y se envíen en cuanto sea posible los datos. Si habilitamos la recepción en ese flujo de cierto tipo de mensajes podemos añadir funcionalidades extra tanto al programa como a la interacción en general. Por ejemplo podríamos recibir tres tipos de mensajes en los que el servidor central pueda pedir al módem una medida asíncrona, o en su defecto enviar en ese momento el fichero de backup vía FTP o por el contrario que se cambie el valor del timeout que utiliza el Timertask para que en lugar de 15 minutos que es el valor actual que implica que se haga la lectura periódica cada 15 minutos, ésta se realice cada hora por ejemplo. Para ello bastaría con recibir como información el nuevo valor de la variable measureIntervalTimeout que se fijaría en la ejecución del código de recibirse. Solo faltaría reiniciar el programa para que se genere el nuevo objeto Timertask con los nuevos valores. Por último y en relación a la depuración de posibles fallos durante la ejecución del programa podemos incluir la escritura en un fichero de logs que se almacene en la memoria los distintos mensajes que actualmente contiene la aplicación y que durante la ejecución se muestran por la salida estándar. Y aún más útil si se imprimen en el fichero los valores devueltos en la captura de una excepción por el método “printStackTrace ()”. De esta manera si durante la ejecución se captura alguna de las excepciones manejadas podremos conocer los detalles sin necesidad de depurar la aplicación en un dispositivo con pantalla que nos muestre la salida estándar, bastaría con recuperar el fichero de log vía FTP con la memoria. Así no solo descubriríamos la excepción que se está produciendo sino que además podríamos intentar solventar el problema que se está produciendo en una nueva versión de la aplicación que desplegaríamos vía OTAP.
ANEXOS I. Códigos de ejemplo HelloWorld.java package src; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class main extends MIDlet { // Constructor public main() { } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { notifyDestroyed(); } protected void pauseApp() { } protected void startApp() throws MIDletStateChangeException { // Printing the message in stdout System.out.println("Hello World"); destroyApp(true); } }
72 Thread.java package src; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class main extends MIDlet { boolean runThreads = true; ThreadExample threadExampleObj; // Constructor public main() { } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { try { // Join method waits for this thread to die threadExampleObj.join(); } catch (Exception e) { } System.out.println("App Destroyed"); notifyDestroyed(); } protected void pauseApp() {} protected void startApp() throws MIDletStateChangeException { try { // Instantiate a new Thread Example Object threadExampleObj = new ThreadExample(); threadExampleObj.start(); } catch(Exception e) { e.printStackTrace(); } destroyApp(true); } //Class that extends class Thread private class ThreadExample extends Thread { // Constructor public ThreadExample() {} public void run() { //Printing current index for (int i = 1; i <= 5; i++) { System.out.println("Current index is " + i);
// Waits for a second try { Thread.sleep(100); } catch(InterruptedException e) { e.printStackTrace(); } } System.out.println("Thread End"); } } } Timer.java package src; import java.util.Timer; import java.util.TimerTask; import javax.microedition.midlet.*; public class main extends MIDlet { int counter=0; protected void startApp() throws MIDletStateChangeException { // Creating a Timer Object Timer timerMon = new Timer(); // Creating a Monitor Object (extends timertask) Monitor mon = new Monitor(); // Setting timertask parameters timerMon.schedule(mon,0,5000); destroyApp(true); } // Class Monitor which run method will be execute // when a new Monitor object is created and scheduled private class Monitor extends TimerTask { // When timeout occurs this code will be execute public void run() { counter++; System.out.println(counter); } } protected void pauseApp() {} protected void destroyApp(boolean arg0) throws MIDletStateChangeException { notifyDestroyed(); } }
74 II. Código implementado /* * App Module Version 12 * * COMPLETE VERSION APPLICATION * */ package src; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.util.Timer; import java.util.TimerTask; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; import javax.microedition.io.ServerSocketConnection; import javax.microedition.io.SocketConnection; import javax.microedition.io.StreamConnection; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import com.cinterion.io.ATCommand; import com.cinterion.io.ATCommandListener; import com.cinterion.io.ATCommandFailedException; import com.cinterion.io.file.FileConnection; /* * CLASS MAIN * * It contains all classes an methods which are * use for the application * */ public class main extends MIDlet { // Value of the time in which the timeout occurs // 1 second = 1000 private int measureIntervalTimeout = 900000; // This variable turns into true value when an asynchronous // request arrives from server private boolean pendingServerRequest = false; // This variable turns into true value when we can manage // the request from server private boolean canHandleServerRequest = false; // This variable represents the name of the available port // for the serial communication private String portAvailable = "";
// This is the URL of the HTTP server where we send the // HTTP request private String url = "http://52.4.102.93/"; // This string store the incoming data from serial port private String stringReceivedDataFromSerialPort = ""; // It contains the parameters for the GPRS connection private String connProfile = ";bearer_type=gprs;access_point=wlgdsp.com;" + "username=well;password=well;timeout=-1;"; // Stream Connection for the server socket private ServerSocketConnection serverSocketConn = null; private SocketThreadClass listenSocketThread = new SocketThreadClass(); private CheckOpenListenSocketClass isOpenSocketListenThread = new CheckOpenListenSocketClass(); Timer timer= null; // Method startApp from MIDlet class // When the app starts this method is called automatically protected void startApp() throws MIDletStateChangeException { try { System.out.println("\nSync time...\n"); //Waiting for 3 seconds try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } // Calling the syncTime method to get the current time syncTime(); System.out.println("\nClock Uptated\n"); } catch(Exception e) { e.printStackTrace(); } try { System.out.println("\nChecking available ports...\n"); // Calling the testAvailablePorts to get the available // ports names portAvailable = testAvailablePorts(); } catch(Exception e) { e.printStackTrace(); } try
76 { System.out.println("\nOpenning Server Socket...\n"); // Openning the server socket connection serverSocketConn = (ServerSocketConnection) Connector.open("socket://:23"+connProfile); } catch (IOException e) { e.printStackTrace(); } try { System.out.println("\nSetting Timertask...\n"); TimertaskClass timertaskObj = new TimertaskClass(); timer = new Timer(); // Setting the timertask timer.scheduleAtFixedRate(timertaskObj, 0, measureIntervalTimeout); } catch (Exception e) { e.printStackTrace(); destroyApp(true); } } // Method destroyApp from MIDlet class // When it is called this method destroy the app protected void destroyApp(boolean unconditional) throws MIDletStateChangeException { try { listenSocketThread.join(); if (serverSocketConn != null) serverSocketConn.close(); } catch (Exception e) { e.printStackTrace(); } System.out.println("\nServer Socket closed. App destroyed.\n"); notifyDestroyed(); } // Method pauseApp from MIDlet class // When it is called pause the app protected void pauseApp() {} // Method syncTime created to get the current time // from network and set it in the MTX65i protected void syncTime () { int quotes = 0; try {
String dateString = ""; // Required variables to listen and execute // AT Commands ATCommandListener LIS = new ATListener(); ATCommand ATC = new ATCommand(false); ATC.addListener(LIS); // Sending AT^SIND Command to get the current time String resultSindCommand = ATC.send("AT^SIND=NITZ,1\r"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("\nAT^SIND execution returns:" +resultSindCommand+"\n"); // Getting the date string for (int i = 0; i < resultSindCommand.length(); i++) { char character = resultSindCommand.charAt(i); if(character == '\"') { if(quotes == 1) { quotes = 0; dateString = dateString+character; } else quotes = 1; } if(quotes == 1) { dateString = dateString+character; } } // Sending AT^CCLK Command to set the current time String resultClockCommand = ATC.send("AT+CCLK="+dateString+"\r"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("\nAT+CCLK execution returns: " +resultClockCommand+"\n"); } catch (IllegalStateException e) { e.printStackTrace(); } catch (ATCommandFailedException e) { e.printStackTrace();
78 } } // Method testAvailablePorts created to call // getProperty method and read the available // ports names to use in serial communication protected String testAvailablePorts () { String portResult =""; try { // This method returns a string which // contains all available ports names String ports = System.getProperty("microedition.commports"); int comma = ports.indexOf(','); if (comma > 0) portResult = ports.substring(0, comma); else portResult = ports; System.out.println("\nPort available is: "+portResult+"\n"); } catch(Exception e) { e.printStackTrace(); } return portResult; } // Method serialPortProtocol created to get // the measures from the serial communication protected String serialPortProtocol () { System.out.println("\nReading from Serial Port...\n"); String stringReadingFromSerialPort = ""; String bufferOut = ""; // Streams for input and output data InputStream in_stream_serial = null; OutputStream out_stream_serial = null; StreamConnection streamConn = null; bufferOut = ":01MRSendMeMeasurementData/n"; try { if(streamConn != null) streamConn.close(); streamConn = (StreamConnection)Connector.open("comm:"+ portAvailable+";baudrate=115200;blocking=off"); } catch(IOException e) { e.printStackTrace(); }
try { System.out.println("\nOpenning streams for serial communication\n"); if (in_stream_serial == null) in_stream_serial = streamConn.openInputStream(); if (out_stream_serial == null) out_stream_serial = streamConn.openOutputStream(); out_stream_serial.write(bufferOut.getBytes()); int currentCharacter = -1; while(currentCharacter != 13) { currentCharacter = in_stream_serial.read(); if (currentCharacter != -1) System.out.print((char)currentCharacter); if((currentCharacter != -1) && (currentCharacter != 13)) stringReadingFromSerialPort = stringReadingFromSerialPort + (char)currentCharacter; } System.out.println("\nModbus data read from serial port is: " +stringReadingFromSerialPort+"\n"); if(in_stream_serial != null) in_stream_serial.close(); if(out_stream_serial != null) out_stream_serial.close(); } catch (IOException e) { e.printStackTrace(); } // In any case streams are closed finally { try { if(in_stream_serial != null) in_stream_serial.close(); if(out_stream_serial != null) out_stream_serial.close(); if( streamConn != null) streamConn.close(); } catch(IOException e) { e.printStackTrace(); } } // This method returns the read data from // serial port return stringReadingFromSerialPort; } // Method HTTPRequest created send HTTP request // message with the measuring data protected void HTTPRequest (String httpToSendString) { System.out.println("\nInit HTTP Request to send data...\n");
86 /* * CLASS TIMERTASKCLASS * * Its run method do the synchronous measuring * request to the smart meter * */ private class TimertaskClass extends TimerTask { public TimertaskClass() {} public void run() { // Checking if there is a pending server // asyncrhonous request to wait until this // request is attended if (pendingServerRequest) { try { canHandleServerRequest = true; while (pendingServerRequest) { try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } canHandleServerRequest = false; stringReceivedDataFromSerialPort = serialPortProtocol(); HTTPRequest(stringReceivedDataFromSerialPort); } catch (Exception e) { e.printStackTrace(); } } // If there is no pending server request // we could get the measuring data without // wait else { try { canHandleServerRequest = false; stringReceivedDataFromSerialPort = serialPortProtocol(); HTTPRequest(stringReceivedDataFromSerialPort); try { if (!listenSocketThread.isAlive()) { try { Thread.sleep(1000); } catch (Exception e) {
e.printStackTrace(); } listenSocketThread = new SocketThreadClass(); listenSocketThread.start(); } } catch(Exception e) { System.out.println(e); } } catch (Exception e) { e.printStackTrace(); } } // When the synchronous measuring is done // we set canHandletServerRequest to true // for enable the asynchronous manage until // the timeout occurs canHandleServerRequest = true; try { // Checking if the open socket test is alive if (!isOpenSocketListenThread.isAlive()){ try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } isOpenSocketListenThread = new CheckOpenListenSocketClass(); isOpenSocketListenThread.start(); } } catch(Exception e) { System.out.println(e); } } } }
88 III. Relación de Comandos AT relevantes [69] 2.1 AT&F Reset AT Command Settings to Factory Default Values AT &F resets A T command settin gs to their factory default values. Every ongoing or incoming ca ll will be terminated. A ll defined GPRS contexts which are no t ac tivated or n ot on line wi ll be undefined if the non volatile storage of AT + CG D CO NT se tt ings is not activated by AT ASCFG parameter " GP RS/PersistentContexts". F or a list of affected parameters refer to Section 23.6, Fa ctory De f a ult Settings Rest o rab l e wi th AT &F. Syntax Exec Command AT & F[ <v al u e >) Response( S) OK PIN ASCO ASC1 USB MUX1 MUX2 MUX3 Charge + last + + + + + + + Pa ra meter Description Reference(s) V.250 [O) Reset parameters in Section 23.6, Fa cto ry Defa u l t Se t tings R est or - ab l e wi t h AT &F to their factory de fault values. 2.2 AT&V Display current configuration AT &V retu rn s the curren! parameter setting The configuration var i es depending on whether or n ot PIN authentication has been do ne. Syntax Exec Command AT &V[ <v al u e >) Response( S) ACT I VE PRO iF I LE : ... (see Sect io n 2.2.1, AT&V responses) OK PIN ASCO ASC1 USB MUX1 MUX2 MUX3 Charge + last + ± + + ± ± + Pa ra meter Description [O) Profile number Not es Reference(s) V.250 The value of \0 (flow con tr ol) is al so determin ed by the AT +I FC command. In case the value set by AT +I FC cann ot be r ep resented by a \0 equivalen!, \ 0255 wi ll be di sp layed. The par ame ters of AT ASMGO can only be displayed after the SMS d at a fr om the SIM have been read successfully for the first time. Reading starts after successful SIM authentication has been performed, and may take up to 30 secon ds depending on the SIM u sed. Wh ile the read process is in progress, an attempt to read the parameter wi ll result in empty values. The para me ter of AT +CSDH will on ly be displayed in SMS PDU mode, see AT + CM GF.
2.2.1 AT&V respons es The following tables show tour di ff erent kinds of responses depending on wheth er or not the PIN is entered and whether or not the Multiplex mode is enabled (see AT+ CMUX ). T ab le 2.1: Cur ren! configurati on on ASCO 1 MUX channe l 1/ US B (ex am pl e) PIN authentication do ne AC TIVE PR OF ILE E1 QO V1 X4 &C1 &02 &SO \QO \V1 SO 000 S3:013 S4:01 O S5:008 S6 000 S7 060 S8:000 S10:002 S18:000 +CBST 7,0 ,1 +CRLP: 61,61,78,6 +CR: O +FCLASS: O +CRC: O +CMGF 1 +CSOH: O +CNMI 0,0,0,0 ,1 +ICF: 3 +IFC: 0,0 +ILRR O +IPR: 115200 +CMEE: 2 "SMGO 0,0 +CSMS: 0 ,1 ,1,1 "SACM: 0,"000000","000000" "SLCC O "SCKS 0, 1 "SS ET: O +CREG: 0 ,1 +CLIP 0,2 +CAOC: O +COPS: O,O,"operator" +CGSMS: 3 OK No PIN authentication ACTIVE PROFILE: E1 QO V1 X4 &C1 &02 &SO \ QO \V1 SO:OOO S3:013 S4:010 S5 008 S6:000 S7:060 S8:000 S1 0002 S1 8000 I +CBST: 7,0,1 +CRLP: 61,61,78,6 +CR: O +FCL ASSO + IC F: 3 +IFC: 0,0 +ILRR: O +IPR: 115200 +CMEE 2 "SCKS: 0 ,1 " SS ET O OK 2.3 AT&W Store AT Command Settings to User Defined Profile AT &W stores the curren! A T command se tt ings to a user defined profile in non-vol at ile memory of T C65 i. The AT command se tt ings wi ll automatically be restored fr om the user defin ed profile during power-up or if ATZ is used. AT &F restor es AT command factory de fault settin gs . Hence, until first use of AT &W , ATZ wor ks as AT &F. A list of parameters stored to the u ser profile can be found al Section 23 .5, AT Comma nd S ett i ngs s to ra bl e wi th A T&W . Sy ntax Exec Comma nd AT&W[ <v al ue>) Response( S) OK ERROR +CM E E RRO R: < err > PIN ASCO ASC1 USB MUX1 MUX2 MUX3 Charge + last + + + + + + + Para meter De sc r iption <Val ue ) num ) [O) U se r Pr ofile Number Reference(s) V.250
90 2.8 ATZ Restore AT Command Settings from User Defined Profile First AT Z resets the A T command se tt in gs to their factory default valu es , similar to AT& F. Afterwar ds the AT comma nd se tt ings are restored fr om a u ser de fined profile in non-volatile memory of TC65i, if one was stored with AT &W befare. Any additional AT command on the same command line may be igno:red. A del ay of 300 ms is require<l befare next AT command is se n t. lf a connection is in progress, it will be terminated. A ll defined GPRS contexts which are no t ac ti va ted or n ot on line wi ll be undefined if th e non volatile storage of CGOCONT settin gs is no t activated by the ATASCFG para meter "GPRS!PersistentContexts" (see AT+ CG DCONT}. Syntax Exec Command ATZ[ <v al ue>) Response( S) OK PIN ASCO ASC1 USB MUX1 MUX2 MUX3 Charge 7 last Reference(s) + + + + + + + V.250 Para meter Des cr iption <Val ue ) num) [O) User Profile Number 2.9 AT+CFUN Functionality Lev el AT+CF UN controls the TC65i's funct io nality leve!. lt can be used to r eset the ME, to choose one of the power save (SLEEP) modes orto retum to fu ll functionality. lntended for powe r saving, SLEEP mode usage r ed uces the fun ct ionality of the ME to a minimum and thus minimizes the curren! consumption. Fu rt her information, particula rl y power supply ratings during the various operating modes an dl the timing of UART signals in SLEEP mode can be found in the "TC65i Ha rd ware Interface Oescription, Version 02.004". The sel ec ted <f un> para meter is global for a ll instan ces and needs to be set only on one instance. Nevertheless, power save ma nagement differs significantly for the t wo interface types UART and USB: F or UART-only operation it is sufficient to se lect one of the <f u n> le veis and to activate hardware flow con tr ol bo th on the ME (AT\ Q3) and on each application conn ec ted to the UART ( ASCO and/or ASC1 ). lf the USB interface is involved select one of the <fu n> levels (unl es.s do ne so on another instance) and either disconnect the U SB inte rf ace or set the USB interface into Suspend mode. Oth erw i se , if yo u change only the AT+CF UN pa rameters, the selected <f u n> leve! will be accepted but the ac tive USB keeps the module alive and thus prevents power saving until USB is disconnected. Vice versa, if the module is in SLEEP mode r es tarting the USB will cause the module to st op power saving alt hio ugh the sel ec ted <f un> leve! does no t chan ge . Power save ma nagement is handled independently on bo th interface types. CTS state transitions desc ri bed be low for the UART are not effective f or USB. On the USB interf ace the power saving process is determin ed by U SB Su spe nd state and USB Remete Wakeup mechanisms specified in the Universal Serial Bus R ev ision 2.0 Specification [47). See al so "Application Note 32 lntegrating U SB into GSM Ap plicati ons ". To check whether or no t power saving is effective you may mo ni to:r the CTS line of the U ART or the Status L EO conn ec ted to the SY NC pi n. In the case of USB the power saving status is indicat ed only by the Status LEO. See A'T ASSYNC for more information regarding the L EO . See al so no te be low . A wakeup eve nt signalled only on the UART (e.g. URCs) wi ll not wake up the U SB instan ce, and vice versa, a wake up eve nt signalled on ly on the US B interface will n ot wake up the UART instan ces. Therefore, keep in mind th at most of the URCs can be activated separately for eac h A.T command instan ce. Power save (SLEEP) modes fati in two catego ri es : NON-CYCLIC SLEEP mode selectable with <fu n>=O (not recommended on U SB interface) • and CYCLIC SLEEP modes selectable with <f u n> = 7 or 9. NON-CYCLIC SLEEP mode lf se t on the UART ( ASCO and/or ASC1) the AT command interfaces wi ll be permanently blocked. lf the U SB interface is connected and in Suspend sta te NON-CYCLIC SLEEP mode is not recommended becau se some wakeup events on the USB interface would cau se the ME to ex it SLEEP mode eve n though USB h as been set to Suspend state.
CYCLIC SLEEP mode On the UART, the benefit of CYCLIC SLEEP mode is th at the AT interface remains accessible and that, in intermittent wa keup periods, characters can be se nt or received without termi na ting the se lected mode. This allows the ME to wa ke up for the dur at ion of an event and, afterwar ds , to r es ume power sa ving. By setting/ resetting the CTS signa! the ME indicates to the application wh et her or n ot the UA RT is act iv e. A summary of all SL EEP modes and the different ways of wak i ng up the module on the UART can be found in Section 2.9.1, Wake up the ME fr om SLEEP mode (for UART only). On the U SB interface, characters can be se nt or received any time. The power saving process is handled by the SUispe nd state mechanisms. lf a wakeup eve nt occurs (e.g. URC, RING, data) the USB Re mote Wake up mechanism can be u se d as specified in the Universal Se rial Bus Revision 2.0 Specificati o:n [47]. In a ll CYCLIC SLEEP modes, you can enter <f un>=1 to permanently wake up TC65i and ta ke it back to fu ll functionality. SLEEP rrno de management if Ja va is started: The Java Virtual Machine remains ac tive, but al so enters the SLEEP mode. AT commands can be se nt fr om the Java a pp ~ l i cat i o n to the se rial interface, no matter which SLEEP mode was se lected. This allows you to control the ME even if it is in NON-CYC LI C SLEEP mode. AT+C FUN test command retums the valu es of the supported parameters. AT+C FUN read command returns the cu rr ent functionality value. AT+C FUN write cornmand can be us ed to reset the ME, to choose one of the SIL EEP modes o rt o return to fu ll fun ctionality. Syntax Test Command AT +CF UN =? Response( S) + CFUN: (list of supported <f un>S) , (li st of supported <r st >S) OK Read Command AT +CF UN? Response( S) + CFUN: < f un> OK Write Command AT +CF UN =( <f u n> (. <rs t> )) Response( S) OK ERROR + CM E E RRO R: <e rr > PIN ASCO ASC1 USB MUX1 MUX2 MUX3 Charge + last + + + ± ± Unsolicit ed Re sutt Codes URC 1 ASYSSTAR T ± + Reference(s) 3GPP TS 27.007 (42) lndicat es that the ME h as been started and is r eady to operat e. lf autobaudi ng is ac tive (AT+I PR= O) the URC is n ot ge nera te d. lf the ME is configured to enter the Airplane mode after restart or reset the following URC is received on bo ot - up : OOA SY SS TA RT AI RP LANE MODE". In this mode, only the AT comman ds listed in Section 23 .4, Ava il - ab il i ty of AT Comma nd s Depe nd i ng on O pe r a ting Mo de of ME can be u se d. Fo r details please refer to the ATASCFG command, par ame ter <m ap os>.
92 2.12 AT+CMEE Error Message Format AT+ CM EE controls the format of e rr or resu lt cedes th at indicates errors related to TC65i fu nc tionality. Format can be selected between plain "ERROR" ou tput, error numbers or verbose "+CME ERRO R: <err>" and "+CMS ERROR: <err>" messages. Possible error result cedes are listed in Table 2.4, Ge neral "CME ERROR" Cedes (3GPP TS 27 .007), Table 2.5, Ge neral "CME ERROR" Cedes (proprietary), Table 2.6, GPRS related "CME ERROR" Cedes (3GPP TS 27 .007), Table 2.9, Java related " CME ERROR" Cedes (proprietary) and Table 2.8, SMS related "CMS ERROR" Cedes (3GPP TS 27.005) In multipl ex mode (refer AT +C MU X) the setting appli es on ly to the l og ical channel where se lected. The setting on the other channels may differ. Syntax Test Command AT+ CM EE=? Response ( S) +CMEE: (list of supported< err Mode>S) OK Read Command AT+ CM EE? Response( S) +CMEE: < err Mode> OK Write Command AT+ CM EE=< errM o de > Response( S) OK ERROR +CME E RRO R: < err > Para meter Description < errMo de >(num)( & W)( & V) O( &F )(D) 1 2 E xam ple Di sa ble result code, i. e. only "ERROR" wi ll be displayed. Enable error result code with nume ri c values. Enable error result code with verbose (string) values. To obtain enhanced error messages it is recommended to choose < err Mo de>=2. A T +C~~ E E = 2 OK
2.14 ATASCFG Extended Configuration Settings AThSCFG ca n be used to query and con fi gure va ri ous settings of the TC65i. AThSCFG read command retums a list of a ll supported parameters and their cu rr en! va lues. AThSCFG w ri te command que ri es a co nfiguration parameter (if no value is entered) or sets it s value(s). In put of parameter na mes is always ceded in GSM character set, parameter values are expected to be gi ve n as speci fi ed via AT+ CSCS . Syntax Test Command AT hSC FG=? Respo n se( S) hSC FG: "AutoExec" , (lis! of supported <Aut oE xec Cmd> ), (lis! of supported <Au toExecType > ), (lis! of supported <A ut oE xeci nd ex > ), (list of supported <A ut oE xec Mode> ), (max. st ri ng length of <Au toExecAT C> ), (time ran ge of <A ut oE xecPer i od>) hSC FG: "Caii/E ca ii/T3242", (list of supported s) hSC FG: "Caii/E ca ii/T3243", (list of supported s) hSC FG: "Caii/ECC", (list of supported <eCC> S) hSC FG: "GPRS/AT SO /withA tt ach", (list of supported < gs O aa > S) hSC FG: "GPRS/AutoA tt ach", (lis! of suppo rt ed < gaa > S) hSC FG: "GPRS/PersistentContexts", (list of supported <gpc >S) hSC FG: "GPRS/RingOnlncomingData", (list of supported <gr oi d>S) hSC FG: "MEopMode/Airplane", (lis! of supported < ma p> S) hSC FG: "MEopMode/Airplane!OnStart", (li st of supported < ma po s>S) hSC FG: "MEopMode/Cr eg Roam", (lis! of supported <m r s> S) hSC FG: "MEShutdown/Onlgnition", (list of supported <m si> s) hSC FG: "PowerSave r/ Mode9 ffi meout", (list of supported <psm9 to > S) hSC FG: "Radio/ Ba nd", (list of supported < rbp >S ), (list of supported <rba > S) hSC FG: "Radio/CNS", (list of supported <C :n s> S) hSC FG: "Radio/OutputPowerReduction", (list of supported <r o pr > S) hSC FG: "SAT/GTP ", (lis! of supported <gt p> S) hSC FG: "Se ri alllf c" , (list of supported <i f cMode> S) hSC FG: "Se ri ai!USB/DDD" , (list of supported <d evi c eDescr> s) , (list of supported < descr in dex > S) , (max. string length of <la n gld > ), (max. string length of < ve nd orl d> ), (max. string length of < pr o duct l d> ), (max. string length of <manu fac t u rer > ), (max. string len gt h of <p ro d uc t > ), (max. st ri ng length of < Ser i al No>) hSC FG: "Tcp/BufSize ", (list of supported <t cp Bu f Si ze >) hSC FG: "Tcp/IRT", (list of supported <tc pi r t >) hSC FG: "Tcp/MR", (list of supported <tc pMr >) hSC FG: "Tcp/OT", (list of supported <tc pOt> ) hSC FG: "Tcp/SAck", (list of supported < tcpSack> ) hSC FG: "Tcp/TTcp", (list of supported <tc pT tc p>) hSC FG: "Tcp/WithURCs", (list of supported <tc pW ith Urc >) hSC FG: "T race/ Sys log/OTAP", (lis! of supported <o ta p Tracer> ) hSC FG: "URC /C aiiStatus/CIEV", (list of supported < SUCC > S) hSC FG: "URC /C aiiStatus/SLCC", (list of supported <S UCS > S) hSC FG: "URC/Datamode/Ringline", (lis! of supported < udr i > S) hSC FG: "URC/Ringline", (list of supported <ur i> s) hSC FG: "URC/Ringline/ActiveTime", (list of supported <u rat > S) hSC FG: "Userware!Autostart", (list of supported <Ua> S) hSC FG: "Userware/Autostart/AppName ", (max. string lengths of <Uaa>) hSC FG: "Userware!Autostart/Delay ", (list of supported <U ad >S) hSC FG: "Userware/Passwd", (max. st ri ng len gt h of <upwd>) hSC FG: "Userware/Debu gl nterface", (<u db gi f l> ), (<u db gi f2 > ), (<u db gi f3 >) hSC FG: "Userware/Mode ", (list of supported <umode> ), (length of <uur l> ), (range of supported <U po r t > Va lues) Test Command AT hSC FG=? Respo n se( S) (Continued) hSC FG: "U:serware/Stdout", (list of supported <i f> ), (list of supported <i nt va l ue> ), ( <file na me > ), (list of supported <l o gm od e>) hSC FG: "Userware/Watchdog ", (list of supported < Wd >) OK
94 Read Command ATASCF G? Response( S) ASCFG: "Auto E xec", < Au to E xec Cmd>, <Aut o ExecType >, < Aut o Exe ci n dex >, < Au to E xe cMode>, < AutoExecAT C>[, <Au t o ExecPer iod> , <Au t o ExecPer iod Ti m eLe f t >] ASC FG: "Caii / ECC ", <e cc> ASC FG: "GP RS/AT SO /withA tt ach", < gs O aa > ASC FG: "GP RS/Aut oA tt ach", < gaa > ASC FG: "GP RS/P ers istent Co ntexts", <gpc> ASC FG: "GP RS/Rin gO nlncomingData", <g r oi d > ASC FG: "MEopMode /Airplane", < ma p> ASC FG: "MEopMode /Airplane/OnStart", < ma po s > ASC FG: "MEopMode/C r eg R oam" , <m rs > ASC FG: "MESh ut down /Onl gn iti on" , <msi > ASC FG: "P owerSaver / Mo d e9ffimeout ", < ps m9 t o> ASC FG: "R ad io/Band", < rb c> , <r ba> ASC FG: "R ad io/CN S" , <cns> ASC FG: "R ad io/ Ou t put P ower R educ tion", <ropr > ASC FG: "SAT /GTP", < gtp > ASC FG: "Se ri all lfc", < if cMode> ASC FG: " Se ri ai/US B/ 000 ", <d ev ic eDes cr >, < descrindex >, <l ang l d>, <Vendo rld >, <p ro d uc tld >, < manufact u rer >, < pr o du ct >, < Ser i a lNo> ASC FG: "Tcp /B ufS i ze ", <tcpBu f Si ze > ASC FG: "Tcp /IR T" , <tcplrt> ASC FG: "Tcp / MR ", < tcp Mr > ASC FG: "Tcp /OT", <tc pOt > ASC FG: "Tcp J SAck ", < tcpSack > ASC FG: "TcpJTT cp ", <tc pTt cp > ASC FG: "TcpJWithURCs", <tcpWithUrc> ASC FG: "Tra ce/ Sys l og /OTAP", <o ta pT racen ASC FG: "URC/CaiiSt at us/CIEV", <s u cc> ASC FG: "URC/CaiiStatus/SL CC" , < sucs > ASC FG: "URC/Oatamode/Ringline", < udr i > ASC FG: "URC/Ringline", <u ri> ASC FG: "URC/Ringline/ Ac tiveTime", <u ra t> ASC FG: "U serwa re/Aut os tart", <Ua> ASC FG: "U serwa re/Autostart/AppName", <U aa > ASC FG: "U serwa re/Aut os tart/Oel ay ", <U ad > ASC FG: "U serwa re/Oebu gl nterface", < ud bg if l> , <u db g if 2>, < ud bg if 3> ASC FG: "U serwa re/ Mode " ASC FG: "U serwa re/St dou t", <if> [, <in t val ue >[, <f il ename>[, <logmode> JJJ ASC FG: "U serwa reJWatch dog ", <W d > OK WriteCommand Co nfi gure Audio Loop : ATASCFG="Audio/Loop"[, <al >] Response ( S) ASC FG: "Aud io /l oop", <al > OK ERROR +CM E E RRO R: < err > WriteCommand Au tomat ic AT command execution ATASCFG=" Auto E xec", < Auto E xe cCmd>, <Au toExecType >, <Au toExec i ndex >[, <Au toExecMode >, <Au toExecATC >[, <Au toExecPeriod >]] Response ( S) ASC FG: "Auto E xec", <A uto E xec Cmd>, <Aut o ExecType >, < Aut o Exe ci n dex >, < Au to E xe cMode>, <Au toExecAT C> [, <Au t o ExecPer iod> , <Au t o ExecPer iod Ti m eLe f t >] OK ERROR +CM E E RRO R: < err >
Write Command Query/ Co nfigure Emergency numbers for SIM without ECC field AT ASC FG=" Ca ii/ ECC "[, < ecc >] Response( S) ASC FG: "Ca ii/ ECC ", <e cc> OK ERROR + CM E E RRO R: < err > Write Command GPRS ATSO with automatic attach AT ASC FG=" GPRS /ATSO/withAttach"[, <g sOaa >] Response ( S) ASC FG: "GPRS/AT SO /w ithAttach", < gs o aa > OK ERROR + CM E E RRO R: < err > Write Command Au tomat ic GPRS attach ATASC FG=" GPRS /AutoAttach"[, <g aa >] Response ( S) ASC FG: "GPRS/Aut oA tt ach", < gaa > OK ERROR + CM E E RRO R: < err > Write Command Persisten! G PRS co ntexts ATASC FG= " GPRS /PersistentContexts" [, <gpc >] Response ( S) ASC FG: "GPRS/Persistent Co ntexts", <9P C> OK WriteCommand Persisten! G PRS co ntexts ATASC FG= " GPRS /PersistentContexts" [, <gpc >] Response( S) ERROR + CM E E RRO R: < err > WriteCommand Ring on incoming GPRS IP data packets ATASC FG=" GPRS /RingOnlncomingData" [, <gr oid >] Response( S) ASC FG: "GPRS/Rin gO nlncomi ng Data", <g r o id > OK ERROR + CM E E RRO R: < err > Write Command Enable/di sa ble Ai rplane mode duri ng oper at ion ATASC FG="MEopMode/Ai rp lane" [, <map >] Response( S) ASC FG: "MEopMode/Ai rp lane", <ma p> OK ERROR + CM E E RRO R: < err > (Continued)
102 WriteCommand ATA SIND =< ind D es cr >, <mode> Response( S) In case of: <i ndD es cr >="ni tz " and <mo de >=2 "S INO: "n itz"1 <mode >, <n i tz UT> , <ni tzTZ >1 <n it z DS T> In case of: <i ndD es cr >="is_cert" an d <mo de >=2 AS I N D: "is _cert", <mo de> OK ERROR + CM E E RRO R: <e rr > Write Command ATA SIND = "I sta ", <mode>[, ds t aLevel >) Response( S) AS I N D: "Isla", <mo de > [. <l s t aLevel >) OK ERROR + CM E E RRO R: <e rr > PIN ASCO ASC1 USB MUX1 MUX2 MUX3 Charge + Last + + + + + + + 4.1 ATE AT Command Echo AT E co ntrols if the TC 65i ec h oes char ac ters recei ve d fr om TE du ri ng AT command st ate . Syntax Exec Command ATE[ <Val u e >) Response( S) OK PIN ASCO ASC1 USB MUX1 MUX2 MUX3 Charge + Last + + + + Para meter Description <V a 1 u e> (num)(& W)( & V) [ O) 1(&F) + + + Ec ho mo de off Echo mo de on Reference(s) V.250 (Continued)
4.9 AT+IPR Bit Rate AT+I PR allows to query and sett he bit rate of the TC65i's asynchronous serial interfaces (UART ). The test command retums the values of supported automatica ll y detectable bit rates and the values of the supp orte d fi xed bit rates . The read command retums the the currently set <r ate > value. The w ri te command speci fi es the bit rate to be used fo r the interface. Delivery bit rate value (< rate >) is 115200bps on ASCO and 115200bps on ASC1. This setting will not be restored with AT&F. lf using a fixed bit rate, make su re that b ot h T C6 5i and TE are con fi gured to the same rat e. A selected fi xed bit rate takes effect after the write command returns OK and is stored in non-volatile memory. lt is not recommended to set bit rates lower than 9600 bps in order to avoid timing problems (see Section 1.6, Communi ca tion between Customer Application and TC65i for de tails about timing). In case of Autobaud mode ( AT +I PR=O) the de tected TE bit rate will not be saved and, therefore, n ee ds to be resynchronized after any restart of the ME (for details refer Section 4. 9.1 , Autobauding). lf Autobaud mo de is activat ed , the ME wi ll automati ca lly recognize bit rate, character fr aming and parity fo r mal (refer AT +I CF) currently used by the TE. In Multiplex mo de the write command wi ll not chan ge the bit r at e currently used, but the new bit rate wi ll be st or ed and becomes active, when the ME is restarted. lf Java is running, the firmware wi ll ignore any se tt ings made with AT +I PR. Responses to the read, w ri te or test command wi ll be invalid or deliver "ERROR ". Also refer "TC65i Java Use r' s Guide" [3 ]. Sec tion "Con fi guring se ri al interfa ce ". The cu rr en! se tt ing of A T+ IPR will be preserved when you download fi rmware (i.e. a fi rmware update does not restore the factory setting) or in the event of power failure. Syntax Test Command AT +I PR=? Response( S) +I PR: (list of supported auto-detectable <r at e>S ), (list of supported fi xed-only <r ate >S) OK Read Command AT +I PR? Response( S) +I PR: < rate > OK Write Command AT +I PR=< ra t e> Response( S) OK ERROR +CME E RRO R: <e rr > PIN ASCO ASC1 USB MUX1 MUX2 MUX3 Charge + Last Reference(s) V.250 + ± ± Para meter De sc r iption <r a te >( num )( & V) bit rate per second (bps) o 300 600 1200 2400 4800 9600 14400 19200 28800 38400 ± ± + Activates Autobaud mode. Not supported on ASC1. Not usable with Java. See Section 4. 9.1 , Autobauding for fu rt her details.
104 57600 115200 230400 460800 921600 Not e Ge nerally, AT+I PR should be used as a standalone command as specified in Section 1.5.2, Concatenating AT Comman ds . lf nevertheless combinations with other comman ds on the same command line cannot be avo ided, there are severa! cons tr aints to be consi de red: -Avoid c om binations with the AT comman ds listed in Section 1.5.2, Concatenating AT Commands. -Keep in mind that there shall be a minimum pause between two AT comman ds as specified in Section 1.6, Communicat io n between Customer Application and TC65i. - lf lo cal ec ho is act iv e (A TE 1) and AT +I PR=x is entered with other comman ds you may encounter the following pr ob lem: lf switching to the new bit rate takes effect while a response is being transmitted, the l as t by tes may be se nt with the new bit rate and thu s, no t prope rl y transmitted. The following comman ds wi ll be corr ect ly sent at the new bit rat e. 5 .1 AT+CPIN PIN Authentication The AT +C PI N write command can be used to enter one of the passwords listed below. The read command can be u sed to check wh et her or no t the ME is waiting for a password, or which type of password is required. This may be for example the SIM PIN1 to regi .s ter to the GSM network, or the SIM PUK1 to replace a di sa bled SIM PIN1 with a new one, or the PH-SIM PIN if the client has taken precautions for preventing damage in the event of loss or theft etc. lf requested by the ME AT +C PI N may al so be used for the SIM PIN2 or SIM PUK2. lf no P IN 1 request is pending (for example if PIN1 authentication h as been done and the same PIN1 is entered again) TC65i respon ds "+CME ERROR: oper at ion not allowed"; no fu rt her act io n is r eq uired. E ac h ti me a password is enter ed with AT+C PIN the module starts reading data from the SIM. The du ration of reading va ri es with the SIM card. This may cause a del ay of severa! secon ds before all comman ds wh ich need access to SIM da ta are effective. See Section 23.1, Restricted access to SIM da ta after SIM PIN authentication f or fu rt her detai l. Syntax Test Command AT +C PIN =? Response(s) OK Read Oommand AT +C PIN? Response(s) +C PI N: < CO de> OK ERROR +CM E E RRO R: < err > Write Command AT +C PIN = <pi n> [. <new p in> ] Response(s) OK ERROR +CM E E RRO R: < err > PIN ASCO ASC1 USB MUX1 MUX2 MUX3 Charge 7 last + + + + + + + Reference(s) 3GPP TS 27.007 [42]
Para m ete r De scr i ption <p i n ) st r) Pass wo rd ( st ri ng type), usually SIM PIN1. lf the requ es te d password was a PU K, such as SIM PU K1 or PH-FSIM PUK or another password, then <p i n > mu st be fo llowed by <new p in >. < new p i n) str ) lf the requested code was a PUK: specify a new password or restore the former disabled password. See Section 5.1.1, Wh at to do if PI N or password authenticati on fails? f or more information about when you may need to en te r the PUK. SIM PIN authentication RE ADY SIM PIN SIM PUK SIM PI N2 SIM PUK2 PIN has already been en te red. No further entry needed. ME is waiting for SIM PIN1. ME is waiting for SIM PUK1 if PIN1 was di sa bled after three failed a tt empts to en te r PIN1. ME is waiting f or PIN2. This is only ap plicable when an attempt to ac cess a PIN2 related feature was ackn ow ledged with +CME ERROR: 17 ("SIM PIN2 required"), for examp le when the client a tt empts to ed it the FD phoneb oo k). In this case the read command AT +C PI N? al so prompts f or SIM PIN2. No rmally, the AT +C PI N2 command is intended for SIM PIN2. ME is waiting for PUK2 to un block a disabled PIN2. As above, this is only n ec - essary when the preceding command was ac kn ow ledged with +CME ER ROR: 18 ("SIM PUK2 required") and only if the read command AT +C PI N? al so prompts f or SIM PUK2. Normally, the AT +C P IN 2 command is in te nded for SIM PUK2. Phone secu ri ty locks set by client or factory PH-SIM PIN ME is waiting for phone-to-SIM card password if "PS" lock is active and the client inserts other SIM card than the one used for the l oc k. ("PS" l oc k is al so referred to as phone or antitheft lock). PH-SIM PUK PH-FSIM PIN PH-FSIM PUK PH-NET PUK PH-NS PIN PH-NS PUK PHSP P IN PH-SP PUK PH-C PIN PH-C PUK N ot es ME is waiting for Master Phone Code, if the above "PS" lock password was incorrectly en te red three times. ME is waiting for phone-to-very-first-SIM card. Necessary when "PF" lock was set When powered up the first time, ME locks itself to the first SIM card put into the card holde r. As a result, operation of the mob ile is rest ri cted to this one SIM card (unless the PH - FS IM PUK is used as desc ri bed below). ME is waiting f or phone-to-very-first-SIM card unbl oc king password to be given. Necessary when "PF" lock is ac tive and ot her than first SIM ca rd is inserted. ME is waiting for network per so nalisation unbl oc king password ME is waiting for network subset per so nalisation password ME is waiting for network subset unblocking password ME is waiting for service pr ov i de r per so nalisation password ME is waiting for service provider per so nalisation unblocking password M E is waiting for corporal e person al isation password ME is waiting for corprorate personalisation un-blocking password Successful PIN authentication only confirms that the entered PIN was recognized and corree!. The output of the result code OK does not necessarily i mp ly that the mobile is registered to the des ir ed network. Typical exampl e: PI N was entered and accepted with OK, but the ME fails to register to th e network. This may be due to missing network coverage, de nied network access with currently used SIM card, no va lid roaming agr ee ment between home network and currently available operators etc. TC65i offers va ri ous options to ve ri fy the present status of network r eg i st ration: For example, the AT +C OPS command indicates the currently used network. With AT +CR EG you can al so check the curren! status and ac tivate an unsolici te d result code which appears whenever the status of the net wo rk regi st r at ion changes (e.g. when the ME is powe r ed up, or when the network cell changes). <p i n> and <new p in > can also be entered in quotation marks (e.g. "1234" ). To check the number of remaining attempts to enter the passwords use the A TAS PI C command. See AT +C PW D and AT AS PW D for information on passwor ds . See AT +C L CK and AT AS L CK for information on lock types.
106 5.1.1 What to do if PIN or password authentication fails? PIN 1/ PUK1: After three failu res to enter PIN 1, the SIM card is blocked (except f or emergen cy ca lis). + CM E ERROR: 12 wi ll prompt the client to unblock the SIM card by entering the associated P UK (= PIN Unblocking Key 1 Per so nal U nblo cking Key ). A ft er te n failed attemp ts to enter the PUK, the SIM card wi ll be invalidated and no longer oper - able (the de vi ce will r espo nd with: +CME ERROR 770 , which stan ds fo r: SIM invalid - netwo rk reject). In such a case, the ca rd needs to be r ep laced. PIN1 consists of 4 to 8 digits, PUK1 is an 8-digit code on ly . To unblock a di sab led PIN1 you have t wo options: • Yo u can en te r AT+C PI N=P UK 1,n ew PIN1. • Yo u can use th e ATD command followed by the GSM code .. 05' PUK' n ewPIN' newPIN#;. P IN2 / PUK2: P IN2 preven ts unauthorized access to the featur es list ed in AT+CPIN2. The handling of PIN2 va ri es with the provider. PIN2 may either be a specific code supplied along with an associated PU K2 , ora default code such as 0000 . In either case, the client is adv ised to replace it with an individual code. lncorrect input of P UK 2 will per - manently bl ock the additional featur es subject to PIN2 au thentification, but usua ll y has no e ff ect on PIN1. P IN2 co nsists of 4 digits, PU K2 is an 8-digit code on ly . To unblock a disabled PIN2 you have t wo options: Yo u can en te r AT+C PI N2 =P UK 2,n ew PIN2. • Yo u can use the ATD command followed by the GSM code .. 052 'P U K2' newPIN2' n ew P IN2# ;. Phone lock: lf the mob ile was lo cked to a specific SIM card (= "PS" l ock or phone l ock) , the PUK that came with the SIM card ca nn ot be used to remove the lock. After three fail ed attempts to enter the co rrect passwo rd, ME r et u rn s +CPIN: PH-SIM P UK (= respon se to read cornmand AT+ CPI N?), i. e. it is now waiting for the Master Phone Code. This is an 8-digit device code associated to the IMEI nu mbe r of the mob ile which can on ly by ob tained from the manuf acturer or provider. When needed, co ntact Cinte ri on Wireless Modules GmbH and r eq uest the Master Phone Code of the specific module. There are two ways to en te r the Mas ter P hon e code: • Yo u can en te r AT+C PI N=Master Phone Code • Yo u can use the ATD command followed by the GSM code ' #0003'Mas te r Phone Code# ;. Usually, the Master Phone Code wi ll be supplied by ma il or e-mai l. lf the received number is enclosed in the '# cedes typically used for the ATD option, it is importan! to crop the preceding ' #0003' characters and the appended #. Example: You rn ay be given the string ' #0003' 12345678#. When prompted for the PH-SIM P UK simply en te r 12345678. lf incorr ec tly input, the Master Phone Code is governed by a speci fic timing algo ri thm: (n-1)' 256 seconds (see t ab le below). The timing s hou ld be co nsi de red by system integrators when designing an individual M M I. Number of fail ed attempts 1 st failed a tt ernpt 2nd failed attempt 3r<l failed attempt 4t h fail ed a tt empt 5th fail ed a tt empt 6th failed a tt empt and so forth SI M locks: Time to wait before next input is allowed No ti me to wai t 4 secon ds 3 • 25S seconds 4 • 251> secon ds 5 • 251> secon ds 6 • 251> secon ds and so forth Th ese are f ac tory se t locks, such as "PF", "PN", "PU", "PP ", "PC". An 8-digit unl ock ing code is r eq uired to operate the mob ile with a different SIM ca rd, or to lift the lo ck . The code can on ly be obtained fr om the provider. Failure to enter the password is subject to the same timing al go ri thm as the Master Phone Code (see Tab le above). Call barring Supported modes are " AO ", "01", "OX", " Al ", "IR", " AB ", "AG", " AC ".I fth e ca ll barring password is en te r ed in co rr ect ly three t im es, the client will need to co nt ac t the serv ice pr ovide r to obtain a n ew one. Related sect io ns: "+ CM E E RROR <err>" values are specifi ed at Sec tion 2.12.1, CME/ CMS Error Code Overv i ew . F or further in st ructions and examples see AT +C LCK, AT AS LCK, AT+ CPWD and AT ASPW D. For a complete li st of S ta r-Hash cedes please refer Sec tion 23 .2, S tar -Hash ( '# ) Netwo rk Comm and s.
8.1 AT+COPN Read operator names T he AT+ CO PN command retums t he list of operator names from the ME. Each operator code <nu mer i cn > that has an alphanumeric equivalen! <al p ha n > in the ME memory is returned. See also: AT ASP LM . Sy nt ax Test Command AT+ CO PN=? Response(s ) OK E RRO R +CM E ERROR: < err > Exec Command AT+ CO PN Response(s ) +COP N: < nu m ericn >, <al ph an > [+COP N: . .. ) OK E RRO R +CM E ERROR: < err > PIN ASCO ASCI USB MUX1 MUX2 MUX3 Charge + Las! + + + + + + + + Para m et er De sc r iptio n < nu m er i cn>(s tr ) Operator in numeric formal; GSM location area identification number. <al phan ) str l Operator in long alphanumeric formal; can contain up to 26 characters. 8.2 AT+COPS Op·erator Selection Reference(s) 3GPP TS 27 . 00 7 [42) AT+ CO PS queries the present status of the TC65 i' s ne tworK registrati on and a ll ows to determi ne whether au to - matic or manual netwo rK selection sha ll be used. Additional service is available wi th AT ASO PS . Three operator selection modes are available: Automatic TC65i searches for t he home operator automatically. lf successful the TC65i registers to the home networK. lf the home networK is not foun.d , TC65i goes on searching. lf a permitted operator is found, TC65i registers to th is operator. lf no operator is found the TC65i remai ns unr eg iste red . Manual Oes ired operator can be de termined using the AT+ CO PS write command. lf the operator is found, TC65i registers to it immediately. lf the selected operator is forbidden, t he TC65i remai ns unregistered. Manual/automatic The ME first tries to find the operator de termined via AT+COPS wr ite command. lf the ME is able to r eg ister to this operator, it enters the ma nual operator selecti on mode. lf it cannot find th is operator or fai ls to r eg ister to this operator. then it enters the automatic operator selection mode and starts to select the home operators networK or another (permitted) one. lf the ME is r eg istered and the manually selected networK is not available, the ME will remain r eg istered without further result co de notifi ca tion. T he most recently enter ed operator selection mode is sti ll val id after the ME was restarted (power-o ff lon}. T he AT+ CO PS test command conists of several paramet er sets, each representing an operator present in the networK. Each set contai ns the following information: an integer indicating the availability of the operator, -long alphanumeric formal of t he operator's name and -numeric formal representation of the operator. Any of the parameters may be unavailable and will then be an empty field {,). The li st of operators comes in the following or de r: Home netwo rK , networ Ks referenced in SIM and other networ Ks . T he operator list is followed by a list of the supported <m od e>S and <f o rma t> S. These lisis are de limited fr om the operator list by t wo commas. lf the test command is used du ri ng an ongoing GPRS tra ns fer, traffic will be interrupted f or up to one minute.
108 T he AT+CO PS read command retums t he current <mo de > and the cu rrently selected operator. lf no operator is selected, <for m at > and <opName> are omitted. T he AT+COPS write command forces an attempt to select and regist er to t he GSM networK operator (see note below). lf t he selected operator is not avai il able, no other operator will be selected (except <m o de >=4). The selected operator name <f or m at > will apply to fu rther read commands, too. Command settings are effective over a ll ser ial interfaces of the TC65i. Sy ntax Test Command AT+ CO PS =? Response(s ) + CO P S: [list of supported (< op St at us>, long alphanu me ric <o pName > ., numeric <opName> )S ], , (list of supported <m o de >S}, (list of su pported <f or m at >S} OK E RROR + CM E ERR OR: < er r > Read Command AT+ CO PS ? Response(s ) + CO P S: <mo de >[, <f or m at >[. < Op Name >]] OK E RROR + C~I E ERR OR: < err > Write Command AT+ CO PS = <m ode>[, <f ormat >[, <OpName>]] Response(s ) OK E RROR + CM E ERR OR: < er r > PIN ASCO ASCI USB MUXI MUX2 MUX3 Charge + Las! ± + + + + Pa ra m ete r Desc ri ptio n <O pStatUS >(num) Operator Status o 1 2 3 <O pName} Wli &V) Operator Name + + UnKnown Operator available Current operator Operator forbidden Reference(s) 3GPP TS 27.007 [42] lf test command: Operator na me in long alphanumeric formal and numeric formal. lf read command: Operator name as per <f or m at >. lf wri te command: Operator name in numeric formal.
<m ode>(num)(&V ) Parameter values O and 1 are stor ed non-volat il e in the TC65i. o <0> Automatic mode ; <opN am e> field is ignored. 2 3 4 < f or m at ) num)(&W)(&V) Ma nual operator selection Write command requires < op Name> in numeric fonnat, i.e. <f o rm at > sha ll be 2. Read command returns the cu rr ent <m od e> and t:he currently selected < op Name>. lf no operator is selected, <f o rm a t> and < op Name> are om itted. Ma nua ll y de r eg ister from net wor K and remain unregistered until <m od e>=O or 1 or 4 is selected. Set only <f or m at> (f or AT+ CO PS read command). Automatic 1 manual selection; if manual selection fails, automatic mo de (<mo de >=O) is enter ed (< op Name> field will be present). Parameter is global f or all instances. o <&• J 2 No tes Long alphanumeric f onnat of <opName>. Can be up to 26 characters long. Numeric f ormal of <opName>. This is the GSM Location Ar ea ldentification (LAI) number, whi ch consists of the 3-digit Mobile Country Code (MCC) plus the 2- or 3-digit Mob ile Ne tworK Code (MNC). 11 is n ot recommended lo use the AT+ COPS command llefore passing the CHV (card holder verification} 1 SIM PI N1 verifi ca tion. In case of entering of AT + CO PS= O be fore PIN1 verification the ME wi ll answer with OK and does not try to registerto the networK. Also, the test command should only be used alte r PIN1 authenti ca tion. lt's possible to apply a 5- or 6-digit LA I for nu meric fo rmal of < op Na me > parame te r. Please use the correct 2- or 3-digit Mobile NetworK Code. Oth erw ise an unintended P LMN could be selected. 11 is not recommended to use the AT +C OPS wri te and test command while TC65i is sea rching for a new operator . In this case the ME will answer wi th ERROR. Please use AT+CREG to verify the netwo rK r eg istration s ta - tus . 8.3 ATI\SOPS Extended Operator Selection AT AS OPS queries the present status of the TC65i's networK r eg istrati on . Since basic operator selection services are available with AT+ COP S th is command uses the methods of the Enhanced Operator Name String (EONS} specification while handling operator name strings. Additional EONS related information is ava il able with AT AS I ND . AT AS OPS test command lis is sets of five parameters. each representing an operator present in the ne two rK . A set consists of 1. an in te ge r indi ca ting the availability of the operator, 2. specificati on of the source of the operator name < eo nsOpe ra t or >, 3. operator name according to EONS Table, 4. Servi ce Provider N ame fr om the SIM Service Table and 5. numeric formal representation of the operato r. Any of the parameters may be unavailable and wi ll then be an empty field (, ). The list of operators comes in the following order: Home networK, networKs referenced in SIM and other networKs. lf the test command is used du ring an ongoing GPRS transfer, traffic will be interrupted f or up t oa minu te . Syntax Test Command ATASOPS : ? Response(s) ASO P S: [list of present operator(< op St atus >, <eo nsType >, <e on s Op erat or >, < Ser v Pr ov i der >, <OpName> )S), , (), () OK E RRO R +CM E E RR O R: < er r> P<N ASCO ASCI USB MUX1 MUX2 MUX3 Charge + Las! + + + + + + +
110 Pa ra m ete r Desc ription <OpS ta tU S>( nu m) Status o 2 3 <eo nsT ype> ( nu m) unKnown operator available curren! operator operator forbidden Specificati on of the source of the operator name < eonsOperator> . Details of EONS-supplied operator name types are available at ATA SI ND. <eon sO p era tor> (+cscs) Operator name; format de pends on the source of the operator name, specified by < eo nsT ype> . Can be up to 24 characters lo ng. < ServPr ov i der >( str )!•Cscs¡ Service Pr ov ider Name according to setting of Service No. 17 in the SIM Servi ce Table (EFssTl· Can be up to 16 char act ers lo ng. <OpName> Operator Operator na me in numerical presentation contai ns the GSM Location Area ldentificati on (LAI) number, which consists of the 3-digit Mobi le Country Code (MCC) pl us the 2- or 3-digit Mobi le NetworK Code (MNC). No te lt is not recommended to use the AT A SO PS test command wh il e TC65i is searching for a new operator. In this case !he module will ans we r with ERROR. Please use AT o CR EC to veri fy ! he net wor k registration status. 8.4 AT+CREG Network Registration Status AT+C RE G serves to monitor the TC65 i' s networK r eg istration status. For this purpose the read command or URC pr esentation mode are available. Sy ntax Test Command AT+CREG : ? Response(s ) +CR E G: (list of supported< urcMode > S) OK Read Command AT+CREG? Response(s ) +CR E G: <U rcMode >, <r egStatus >[. < netLac >, < netCe ll i d>) OK E RROR +CM E ERR OR: <er r > Write Command AT+C REG =(<ur cMode>) Response(s ) OK E RROR +CM E ERR OR: <er r > PIN ASCO ASCt USB MUXt MUX2 MUX3 Charge + Las! + + + + + + Reference(s) 3GPP TS 27 .007 (42)
Pa ra meter Description <UrcMode>(num)( &W ) (& V) (O) (&F) 1 2 <regS tatUS >(n um )( & V) o 1 2 3 4 5 <net L ac ) str l Disable +CREG URC. Enable URC +CREG:< regSta tu s> to report status of networK registration. Enable URC +CREG:< reg St atu s>[,< net La c> ,<net C elli d>) lo report stat us of net wor K registration includi ng location information. Optional parameters <net L ac > and <net Ce llid> will n ot: be updated during calls. Not registered, ME is currently not searchi ng for new operator Nonna ll y, status O occurs temporarily between two networK search phases (status 2). However, if it persists, one the following reasons may apply: Automatic networK selecti on is active. bu t probably there is no SIM card available - no PI N enter ed - no va li d Home PLMN entry found on the SIM Manual networK selection is active and the selected networK is available, but login fails due to one of the following reasons: # 11 . .. P LMN not allowed - #12 . .. Location are a no t a ll owed - #13 . .. Roaming not a ll owed in th is locati on are a In either case. u ser intervention is required. Yet, emergency calls can be made if any ne two rK is available. Register ed to home networK Not registered, but ME is currently searching for a new opera tor M E sea r che s f or an a va il able net work . F ail ure lo l og in unt il afte r more !han a m in u te m ay be due to one of the fo ll owing reasons: No networK available or insu ff icient Rx level. ME ha s no access rights to the networKs available. NetworKs from the SIM list of allowed networ Ks are around, but login fails due to one of t he following reasons: # 11 . .. P LMN not allowed - #12 . .. Location are a no t a ll owed - #13 . .. Roaming not a ll owed in th is locati on are a After this, the sear ch will be resumed (if au tomatic networK search is enabled). T he Home PLMN or an allowed PLMN is available, but login is rejected by the ce ll (reasons: Access Class or LAC). lf at least one net wor K is available, emergency calls can be made. Registration denied Authenti ca tion or reg istration fails aft er Location Up da te Reject due to one of the fo ll owing reasons: #2 . .. IMSI u nKn own al HLR -#3 ... lllegal MS -#6 ... lllegal ME Ei tne r t ne SIM or t ne ME are una ble to l og i nto any netwo rK. No furtner attempt is made to search or l og i nt o a networK. User interventi on is requi red . Emergency calls can be made, if any networK is available. UnKnown (not used} Registered, roaming ME is r eg istered ata forei gn networK ( na tional or intemational networK) Two b yte locat ion area code in hexadecimal f onna t (e.g. " OOC 3" equals 1 95 in decimal).
118
IV. Manuales de SDK Cinterion TC65i [70] 2 Overview The ME features an ultra-l ow pr of ile and l ow - power consumpt i on f or data ( CSD and GPRS), vo i ce , SMS and fax. Java t echno l ogy and seve ral per ipheral int erfaces on t he mo dule all ow you to eas ily int eg r ate your app li cat ion This document exp lai ns how to wor k with t he ME, t he installation CD and the too ls pr ov i de d on the i nsta llation CD. Old solutlon: The customer application was dl st rlbuted across 2 .,e , extema l .,e and l nt e ma l .,e on the module 11C 1 ROM 1 1 Customer SW 1 1 RAM 1 GSM module Customer Applícation ~ > F igu re 1: Overview 4.2 Interfaces 4.2.1 ASCO • Se rial Devi ce New solutl on : The customer appllcatlon exista only on the module 1 ROM 1 1 RAM 1 GSMmodule wlthJeve Cu s tomer SW 1 Customer Application ASC O, an Async hr onous Ser ial Contro ll er , is a 9-wire ser ial int erface.l t is d esc rib ed in [2]. Wi th - out a runn ing Java ap pli cat ion the mo dule can be contro lled by sen ding AT comman ds ove r ASC O. F urt hermore, ASC O is d es igned f or t ransfe rring fil es from the deve l opme nt PC to the mo dule. Whe n a Java app lication is started, ASC O can be u se d asan RS - 232 p ort or /and Sys - tem .out. Re f er to [3] f or details. 4.2.2 General Purpo se 1/0 There are te n 1/0 pins that ca n be co nfi gure d f or general p urpose 1/0 . One pin can be configurad as a pu lse cou nter. All li nes ca n be accesse d under J ava by AT comman ds ora Java AP I. See [1] and [2] f or inf orma tion about usage and startup beh av ior. 4.2.3 DAC/ ADC There are two anal ogue i nput lin es and one ana l ogue out put line. Th ey are accessed by AT commands orv ia a Java AP I. See [1] and [2] f or details. 4.2.4 ASC1 ASC 1 is the second ser ial int erface on the mo dule. This is a 4-pin int erface ( RX , TX, RTS, CTS). lt can be used as a second AT i nte rf ace wh en a Java applicati on is no t runni ng or by a runn ing Java appli cat i on as RS- 232 p ort or/ and System.out.
120 4.2.7 JVM Interfaces IMP-NG FileAP I AT Command API Connected Limited Device Configuration (CLDC) Java ME Figure 8: Interf ace Config urat i on 4.3 Data Flow of a Java Application Running on the Module Figure 9: Da ta ftow of a Java ap plication run ning on the m od ule. The diagram shows the data flow of a Java application running on the module. The data fl ow of a Java application running in the debug environment can be found in Figure 24. The compil ed Java applications are stored as JA R fi les in the Flash File System of modul e. When the application is sta rted, the JVM interprets the JA R file and calls the interfaces to the module environment. 5.7.1 Automatic Shutdown The ME is switched off au tomatically in differ ent situati ons : under-or overtempe ra t ure under- or overvoltage Ap propriate warning messages transmitted by the MEto the h ost application are implemented as URCs. To actívate the URCs f or temperature conditi on s use the ATASCTM command. Undervoltage and overvoltage URCs are generated automatically when fault conditions occur. For further detail ref er to the commands AT"SCTM and ATASBC described in the AT Command Set [1]. In additi on , a description of the shutdown procedures can be found in [2]. 5"7.2 Manual Shutdown The module can be switched off manually with the AT command, ATASMSO. In this case the mi dlets d est royApp method is call ed and the appli ca ti on has 5s time to clean up and call the not ifydestroy me thod. After !he Ss the VM is shut d ow n.
5.7.3 Restart after Switch Off When t he module is sw itched off wit hout setting an alarm time (see the AT Command Se t [1)), e.g. after a power failure, externa! hardware mus t restart the module with the l gn ition line (IGT) The Hardware lnteriace Description [2] exp lai ns how to handle a sw itched off situation. 5.12.3.1 Plain Serial Interface Scenario: A device is connected to ASCO ( re f er to Section 4.2.4) T he Java application must handle data i nput a nd output streams. A simple Java application (with only one th read) which loops incoming data direct ly to output, reaches data rates up to 1 80k b iU s. Test conditions: har dware flow control enabled (< autorts> and <autocts >) , 8N 1, and baud ra te on ASCO set to 230 kbaud ( ~ theoretical max imum 184kb iU s net data ra te). Figure 1 7: Scenario f or tes ting da ta rat es on ASC 1 11.5.4 Signa MIDiet Use the too l "ja dt ool. jar " to sign a Java MIDiet. This program is in the folder "w kt \bin". java -jar jadt oo l. jar -addjarsig -jarfile he ll owortd.jar -inputjad hellowo rl d.jad -outputjad helloworld.jad -ali as keyname -storepass ke yst ore passwo rd -keypass keypassword -ke ys tore custome r. ks -encoding UT F- 8 11.6 Attention The central element of Java Security is the pr iv ate k ey . lf J ava Security is act ivated and you lose the private k ey , then t he m odule is dest roye d You have no chance of d eac tivati ng Java Security, d own loading of a new Midl et or starti ng any ot h er operation concerning Java Security. To preven! probl ems you are strongly advised to sec ure the priv ate key . 12.1.3 ATCommandListener Interface The ATC ommandListener interiace implements callback fun ct i ons for: UR Cs Changes of the ser ial inte ri ace signals RING, DCD and DSR Openi ng and closing of data con nect ions The u ser must create an implementation cl ass f or A TCommandListen er to r ece ive AT events. The AT Ev ent method of this cl ass mus t canta in the processing code f or t he di ff erent AT -E vents (URCs) The RINGChanged, DCDChanged, DSRChanged and CONNC/Janged me thods should contain the processing code f or possible state changes. This code shall leave the listener context as soon as possible (i.e. running a new thread) While the callb ac k method does not return it cannot be called again if cha n ges occur. The CONNC/Janged me thod indicates the sta rt and t he end of data connec ti ons . D ur ing a data connection it is possible to transf er data with the 1/0 stream methods (see Sect io n 12.1.1.3). Some data services (i.e. FTP) transf er the data so quickly, th at the CONNChanged start and cl ase events are rece i ve d even parallel to the response of the AT command which originated t he data connection. The user's application must realize, that t he data connection had taken pl ace and read the data with the 1/0 st ream read me thods afterwards.
122 BIBLIOGRAFÍA Y REFERENCIAS [1] DLMS, «Documentación del protocolo DLMS,» [En línea]. Available: http://www.dlms.com/documentation/overviewexcerptsofthedlmsuacolouredbooks/dlmsdocumentationarchive.html. [Último acceso: 14 Septiembre 2015]. [2] Modbus, «Documentación del protocolo Modbus,» [En línea]. Available: http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b.pdf. [Último acceso: 14 Septiembre 2015]. [3] MTXTunnel, «FAQ MTXTunnel,» [En línea]. Available: http://www.mtxtunnel.com/faq-mtxtunnel/. [Último acceso: 12 Septiembre 2015]. [4] MTXTunnel, «Manual de Usuario del MTX-Tunnel v8.10,» [En línea]. Available: http://www.mtxtunnel.com/Downloads/MTX-Tunnel-Manual-sp.pdf. [Último acceso: 12 Septiembre 2015]. [5] MTXTunnel, «Modems con version de MTXTunnel,» [En línea]. Available: http://mtxm2m.com//soporte/. [Último acceso: 12 Septiembre 2015]. [6] MTXTunnel, «Software detallado MTXTunnel,» [En línea]. Available: http://mtxm2m.com//productos/mtx-tunnel- software/. [Último acceso: 12 MTXTunnel 2015]. [7] Meters and More, «Página principal de Meters and More,» [En línea]. Available: http://www.metersandmore.com/. [Último acceso: 12 MTXTunnel 2015]. [8] ENDESA, «Información sobre los contadores de telegestión instalados por ENDESA,» [En línea]. Available: http://es.slideshare.net/CanalEndesa/los-contadores-inteligentes-de-endesa. [Último acceso: 12 Septiembre 2015]. [9] Meters and More, «Especificación del protocolo Meters and More,» [En línea]. Available: http://www.metersandmore.com/wp-content/uploads/2014/04/20140318-MM-Press-Release.pdf. [Último acceso: 12 Septiembre 2015]. [10] CENELEC, «FAQ de CENELEC,» [En línea]. Available: http://www.cenelec.eu/faq/faq_entry.htm. [Último acceso: 12 Septiembre 2015]. [11] CENELEC, «Global partners de CENELEC,» [En línea]. Available: http://www.cenelec.eu/aboutcenelec/whoweare/globalpartners/iec.html. [Último acceso: 12 Septiembre 2015]. [12] 4CTT, «Manual de usuario del concentrador 4CTT,» [En línea]. Available: http://www.meteringsolutions.ziv.es/documentacion/manuales/castellano/LCCT1005Av01.pdf. [Último acceso: 12 Septiembre 2015]. [13] S. Grids, «Congreso de Smart grids en Madrid, 2012,» [En línea]. Available: https://www.smartgridsinfo.es/images/SMARTGRIDSINFO/media/content/20150216-libro-comunicaciones-i- congreso-smart-grids.pdf. [Último acceso: 12 Septiembre 2015]. [14] «Listado de iniciativas referentes a Smart grids,» [En línea]. Available: http://stargrid.eu/downloads/2013/07/STARGRID_Industry_Initiatives_Documentation_Map_v1.0.pdf. [Último acceso: 12 Septiembre 2015].
[15] MTX, «Características MTX65i,» [En línea]. Available: http://www.matrix.es/Comunicaciones-M2M-inalambricas- RFID-Networking-Industrial/GSM-GPRS-3G/Terminales/Modems-GPRS-GSM-programables-en- Java/Modelos/MTX-65i. [Último acceso: 12 Septiembre 2015]. [16] gemalto, «Características del módulo TC65i,» [En línea]. Available: http://www.gemalto.com/m2m/solutions/modules-terminals/other-families/tc65i. [Último acceso: 12 Septiembre 2015]. [17] ETSI, [En línea]. Available: http://www.etsi.org/technologies-clusters/technologies/m2m. [Último acceso: 20 Septiembre 2015]. [18] Cirwatt, «Especificaciones del contador monofásico Cirwatt B200RCP,» [En línea]. Available: http://circutor.es/es/productos/metering/contadores-de-energia-electrica-multifuncion/contadores-monofasicos/seriecirwatt-b200rcp-detail. [Último acceso: 12 Septiembre 2015]. [19] Wikipedia, «Información sobre PRIME (Power Line Carrier),» [En línea]. Available: https://en.wikipedia.org/wiki/PRIME_(PLC). [Último acceso: 12 Septiembre 2015]. [20] Cirwatt, «Ficha Técnica del contador Cirwatt B200RCP,» [En línea]. Available: http://circutor.es/docs/FT_Q1_CIRWATT-B200RCP_SP.pdf. [Último acceso: 12 Septiembre 2015]. [21] HP, «Especificaciones del ordenador portátil HP ProBook 4520s,» [En línea]. Available: http://h10010.www1.hp.com/wwpc/pr/es/sm/WF06a/321957-321957-64295-3955552-3955552- 4145198.html?dnr=2. [Último acceso: 12 Septiembre 2015]. [22] Wikipedia, «Información sobre OVM,» [En línea]. Available: https://es.wikipedia.org/wiki/Operador_m%C3%B3vil_virtual. [Último acceso: 15 Septiembre 2015]. [23] ITU, «Recomendación de la ITU sobre los comandos AT,» [En línea]. Available: http://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-V.250-200307-I!!PDF-E&type=items. [Último acceso: 13 Septiembre 2015]. [24] ETSI, «Estándar para comandos AT referentes a GSM ME,» [En línea]. Available: http://www.etsi.org/deliver/etsi_gts/07/0707/05.00.00_60/gsmts_0707v050000p.pdf. [Último acceso: 13 Septiembre 2015]. [25] ETSI, «High level descriptcion AT Commands - ETSI,» [En línea]. Available: http://www.etsi.org/deliver/etsi_tr/102100_102199/102179/01.01.01_60/tr_102179v010101p.pdf. [Último acceso: 13 Septiembre 2015]. [26] Wikipedia, «Información de los comandos Hayes,» [En línea]. Available: https://es.wikipedia.org/wiki/Conjunto_de_comandos_Hayes. [Último acceso: 13 Septiembre 2015]. [27] Hayes Communications, «Página de Hayes Communications,» [En línea]. Available: http://www.hayescom.com/. [Último acceso: 13 Septriembre 2015]. [28] Wikipedia, «Hayes Command Set,» [En línea]. Available: https://en.wikipedia.org/wiki/Hayes_command_set. [Último acceso: 13 Septiembre 2015]. [29] Oracle, «Especificación de Java - Oracle,» [En línea]. Available: http://docs.oracle.com/javase/specs/. [Último acceso: 13 Septiembre 2015]. [30] Oracle, «Referencia a WORA,» [En línea]. Available: http://www.oracle.com/us/technologies/java/oracle-javase-
124 embedded-ds-365290.pdf. [Último acceso: 13 Septiembre 2015]. [31] Wikipedia, «Referencia de Java,» [En línea]. Available: https://en.wikipedia.org/wiki/Java_(programming_language). [Último acceso: 13 Septiembre 2015]. [32] Oracle, «Java Compiler - Oracle,» [En línea]. Available: http://www.oracle.com/technetwork/articles/javase/javac- 137034.html. [Último acceso: 13 Septiembre 2015]. [33] Oracle, «Javadoc Tool - Oracle,» [En línea]. Available: http://www.oracle.com/technetwork/articles/java/index-jsp- 135444.html. [Último acceso: 13 Septiembre 2015]. [34] Oracle, «Página de Java ME,» [En línea]. Available: http://www.oracle.com/technetwork/java/embedded/javame/index.html. [Último acceso: 13 Septiembre 2015]. [35] Oracle, «Información sobre CLDC,» [En línea]. Available: http://www.oracle.com/technetwork/java/cldc- 141990.html. [Último acceso: 12 Septiembre 2015]. [36] Oracle, «Información IMP-NG,» [En línea]. Available: https://docs.oracle.com/javame/dev-tools/jme-sdk-3.2/devguide/platforms.htm#CHDJFIJI. [Último acceso: 12 Septiembre 2015]. [37] EIA, Estándar RS232. [38] Biblioteca US, «The basics of Recommended Standard 232 (RS-232),» 1997. [39] E. W. J. P. D. R. Steve Mackay, «3: EIA-232 overview,» de In Practical Industrial Data Networks 2003:32-52, Elsevier Ltd, 2004. [40] «4a: RS232 overview,» de In Practical Industrial Data Communications 2004:71-81, Elsevier Ltd, 2004. [41] IETF, «Transmission Control Protocol - RFC 793,» [En línea]. Available: https://tools.ietf.org/html/rfc793. [Último acceso: 13 Septiembre 2015]. [42] IETF, «HyperText Transfer Protocol - RFC 2616,» [En línea]. Available: https://www.ietf.org/rfc/rfc2616.txt. [Último acceso: 13 Septiembre 2015]. [43] IETF, «Uniform Resource Identifier - RFC 3986,» [En línea]. Available: https://www.ietf.org/rfc/rfc3986.txt. [Último acceso: 13 Septiembre 2015]. [44] IETF, «Simple Mail Transfer Protocol - RFC 821,» [En línea]. Available: https://tools.ietf.org/html/rfc821. [Último acceso: 13 Septiembre 2015]. [45] IETF, «File Transfer Protocol - RFC 959,» [En línea]. Available: https://www.ietf.org/rfc/rfc959.txt. [Último acceso: 13 Septiembre 2015]. [46] Modbus, «Modbus over serial line v1.02 - Documentation,» [En línea]. Available: http://www.modbus.org/docs/Modbus_over_serial_line_V1_02.pdf. [Último acceso: 19 Septiembre 2015]. [47] Eclipse, «Eclipse Helios SR2 versión 3.6.2,» [En línea]. Available: http://www.eclipse.org/downloads/packages/release/Helios/SR2. [Último acceso: 13 Septiembre 2015]. [48] Wikipedia, «Información sobre Eclipse,» [En línea]. Available:
https://es.wikipedia.org/wiki/Eclipse_(software)#Caracter.C3.ADsticas. [Último acceso: 12 Septiembre 2015]. [49] Oracle, «Java SE con JDK versión 6.25,» [En línea]. Available: http://www.oracle.com/technetwork/java/javase/downloads/jre-6u25-download-346243.html. [Último acceso: 13 Septiembre 2015]. [50] Oracle, «Diferencias entre JDK y JRE,» [En línea]. Available: https://www.java.com/es/download/faq/techinfo.xml. [Último acceso: 12 Septiembre 2015]. [51] Putty, «Web de Putty,» [En línea]. Available: http://www.putty.org/. [Último acceso: 12 Septiembre 2015]. [52] Minicom, «Información y ayuda de Minicom,» [En línea]. Available: https://help.ubuntu.com/community/Minicom. [Último acceso: 13 Septiembre 2015]. [53] Apache, «Información sobre Apache HTTP Server Project,» [En línea]. Available: http://httpd.apache.org/ABOUT_APACHE.html. [Último acceso: 13 Septiembre 2015]. [54] PHP, «Página de PHP,» [En línea]. Available: http://php.net/. [Último acceso: 13 Septiembre 2015]. [55] Cinterion, Java User's Guide (Manual de instalación de CMTK) PDF del CD de instalación, 2012. [56] Stack Overflow, «How to set variable JAVA_HOME in Windows 7,» [En línea]. Available: http://stackoverflow.com/questions/2619584/how-to-set-java-home-on-windows-7. [Último acceso: 13 Septiembre 2015]. [57] Oracle, «Mobile Tools for Java,» [En línea]. Available: https://projects.eclipse.org/projects/tools.sequoyah.mtj%20. [Último acceso: 16 Septiembre 2015]. [58] Cinterion, Java User Guide v19, 2012. [59] Gemalto, «Página de Gemalto,» [En línea]. Available: http://www.gemalto.com/. [Último acceso: 13 Septiembre 2015]. [60] JavaCint, «FAQ de JavaCint - Firmware,» [En línea]. Available: http://www.javacint.com/TC65Dev#Firmware. [Último acceso: 13 Septiembre 2015]. [61] Matrix Electrónica, [En línea]. Available: ftp://ftp.matrix.es/mtxm2m/Modems%20M2M/MTX- 65i%20Family/MTX-65i%20Family%20User%20Manual.pdf. [Último acceso: 13 Septiembre 2015]. [62] Linux, «Manual de Linux - Comando dmesg,» [En línea]. Available: http://man7.org/linux/manpages/man1/dmesg.1.html. [Último acceso: 13 Septiembre 2015]. [63] ITU-T, «Recomendación E.212 - Plan de identificación internacional para las redes públicas y los abonos,» [En línea]. Available: https://www.itu.int/rec/T-REC-E.212/es. [Último acceso: 15 Septiembre 2015]. [64] Gemalto, «How to validate a GPRS Connection,» [En línea]. Available: https://developer.gemalto.com/threads/howvalidate-if-device-connected-gprs. [Último acceso: 15 Septiembre 2015]. [65] Wavecom, «Comandos AT para GPRS,» [En línea]. Available: http://www.sendsms.cn/download/AT%20Commands%20for%20GPRS_1.3.pdf. [Último acceso: 15 Septiembre 2015]. [66] Honneywell - Scanning and Mobility, «How to set the allowed frequency,» [En línea]. Available:
126 http://hsm.force.com/publickb/articles/HSM_Article/How-to-set-the-Preferred-and-Allowed-GSM-Bands-in- Windows-Mobile-6. [Último acceso: 15 Septiembre 2015]. [67] Oracle, «MIDlet Class,» [En línea]. Available: http://docs.oracle.com/javame/config/cldc/refimpl/midp2.0/jsr118/javax/microedition/midlet/MIDlet.html. [Último acceso: 16 Septiembre 2015]. [68] Oracle, «Mobile Information Device Profile (MIDP) - Oracle,» [En línea]. Available: http://www.oracle.com/technetwork/java/index-jsp-138820.html. [Último acceso: 17 Septiembre 2015]. [69] TC65i, AT Command Set, 2012. [70] TC65i, Java User's Guide, 2012. [71] Eclipse, «Software Plugin EclipseME 1.6.8,» [En línea]. Available: http://www.easyeclipse.org/site/plugins/eclipseme.html. [Último acceso: 12 Septiembre 2015]. [72] EclipseME, «Página EclipseME,» [En línea]. Available: http://eclipseme.org/index.html. [Último acceso: 12 Septiembre 2015]. [73] EclipseME, «Información sobre EclipseME,» [En línea]. Available: http://eclipseme.org/docs/faq.html. [Último acceso: 12 Septiembre 2015]. [74] IETF, «Multipurpose Internet Mail Extensions - RFC 2045,» [En línea]. Available: https://tools.ietf.org/html/rfc2045. [Último acceso: 13 Septiembre 2015]. [75] REE, «Protocolo de comunicación entre registradores y concentradores de medidas,» [En línea]. Available: http://www.ree.es/sites/default/files/01_ACTIVIDADES/Documentos/Documentacion- Simel/protoc_RMCM10042002.pdf. [Último acceso: 13 Septiembre 2015]. [76] Oracle, «Wireless Toolkit Download,» [En línea]. Available: http://www.oracle.com/technetwork/java/download- 135801.html. [Último acceso: 16 Septiembre 2015].