Cómo usar ficheros con módems de Siemens desde Java.
Escrito por blogElectronica en 2.DISPOSITIVOS (práctico), 3.GENERAL, Comunic. GSM/GPRSComo seguro ya sabéis, varios de los modelos de módems de Siemens son programables en Java. Hace ya un tiempo puse varios posts acerca de la programación de estos módems. Concretamente puse un ejemplo, publicado en varias entregas, en el que utilicé como base un MTX65+G (recordemos, un módem terminal GPRS con GPS integrado) con el que vimos cómo desarrollar un pequeño localizador por GPS. Entre otras cosas la aplicación básicamente consistía en que el módem al recibir un determinado mensaje SMS, devolvía otro SMS con la posición GPS.
Ese fue un ejemplo basado en SMS, pero tan vez en alguna ocasión necesitemos almacenar información dentro del propio equipo.
¿Y para qué voy a querer almacenar información en el módem si la puedo transmitir por GPRS o SMS?
Hombre, imagina que recoges la posición GPS cada 10 segundos. Es posible transmitir la posición en tiempo real por GPRS a un servidor remoto, pero tal vez no te es necesario enviar la posición en tiempo real en todas las situaciones (y seguro es más económico). Puede haber situaciones en las que sí, situaciones en las que quieres poder controlar la posición en todo momento, pero otras en las que te interesa simplemente recoger las posiciones para tratarlas o enviarlas más adelante.
Esto si hablamos de módems con GPS, como el XT65 o el MTX65+G. Pero también tiene sentido si hablamos del TC65 (y el TC65T y MTX65) pues tienen entradas digitales, entradas analógicas y varios tipos de buses (SPI, I2C, RS232, …) y pueden, y de hecho se usan mucho para ello, recoger información de dispositivos y sensores externos, como sondas de temperatura, de caudal, de presión, pueden recoger información de PLCs … y puede que tampoco nos interese enviar la información inmediatamente tras haberla recogido, sino al final del día, o cuando nos vaya bien.
¿Y no puedo ir almacenando la información en memoria RAM?
Pues sí, puede hacerse. Pero eso es como si haces un trabajo en Word y no grabas nunca durante días. Lo tienes guardadito en memoria RAM, pero si ocurre algún imprevisto, una caída de alimentación, algún problema en la aplicación, puedes perder la información. Eso sin contar que los datos almacenados en RAM no pueden ser muy grandes.
¿Y cómo puedo almacenar la información?
Pues de la misma forma que puedes grabar los ficheros java de tus programas en la memoria FLASH de los módems, puedes crear ficheros desde tu aplicación java para guardar, añadir y leer la información cuando lo necesites.
A continuación te pongo un pequeño fragmento de código en Java para que veas cómo guardar y leer información utilizando ficheros que se almacenarán en la memoria Flash del equipo.
try
{
//Creamos un objeto de la clase FileConnection y especificamos
//el nombre del fichero a abrir, que pondremos fichero.txt
FileConnection objFileConnection = (FileConnection)
Connector.open(“file:///a:/fichero.txt”);//Si el fichero no existe lo mandamos crear
if (!objFileConnection.exists())
objFileConnection.create();//Creamos un objeto de la clase DataOutputStream, con el
//que escribir datos en el archivo
DataOutputStream objDataOutputStream =
objFileConnection.openDataOutputStream();//Escribimos un texto dentro del fichero que acabamos de abrir
//(o de crear)
objDataOutputStream.write(“Hola de blogElectronica”.getBytes());//Mandamos todo lo que quede en el buffer previo al cierre del mismo
objDataOutputStream.flush();//Cerramos el objeto
objDataOutputStream.close();//Ahora leemos los datos. Creamos un objeto de clase DataInputStream
DataInputStream objDataInputStream =
objFileConnection.openDataInputStream();//Creamos un array para almacenar los datos del fichero leído.
//Lo haremos del tamaño de los datos del fichero, porque
//sabemos que son pocos
byte[] datos = new byte[objDataInputStream.available()];//Si hay datos, que en nuestro caso los habrá …
if (objDataInputStream.available() > -1)
{
//Leemos y guardamos todos los datos del fichero
//en el array que hemos creado
objDataInputStream.read(datos, 0, objDataInputStream.available());//Y los sacamos por la consola para verlos
System.out.println(new String(datos));
}//Cerramos los objetos
objDataInputStream.close();
fconn.close();
}catch (IOException ioe)
{
}
Por cierto, no olvides de hacer los siguientes imports al inicio del programa.
import javax.microedition.io.Connector;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import com.siemens.icm.io.file.FileConnection;
import com.siemens.icm.io.file.FileSystemRegistry;
Todo lo anterior lo puedes aplicar en los módems Siemens TC65, TC65T, XT65, MTX65 y MTX65+G, distribuidos en España por Matrix.
Espero que os haya resultado interesante este post y que os pueda resultár útil en alguna ocasión. Otro día más.
Post relacionados:
- Añadir datos a ficheros con módems Siemens-Cinterion desde java En bastantes ocasiones me ha llegado la pregunta de cómo...
- Modem GPRS Siemens. Gestión de una conexión TCP/IP desde Java. En mi anterior post vimos como utilizar el sistema de...
- Ejemplo FTP Java para módems Siemens Hoy pongo un brevísimo post con un nuevo ejemplo Java...
- Autoarranque de aplicaciones Java en módems Siemens Muy buenas. Hoy voy a poner un pequeño post relacionado con...
- Ejemplo envío Email Java para módems Siemens / Cinterion Esta mañana he estado un buen rato realizando pruebas de envío...
Muy buen artículo.
Enhorabuena por el blog en general, me resulta muy interesante!!
un saludo.
Hola, gracias por tu ayuda para almacenar ficheros me ha sido muy util. Sabrias alguna forma de transmitir un fichero que tenemos almacenado en el modem a otro dispositivo (por ejemplo a un dispositivo movil)??? Si se os ocurre alguna forma os agradeceria que la comunicáseis.
Un saludo y gracias!!!
Hola Fran,
sea el dispositivo que sea tienes que tener cierta inteligencia en el equipo receptor, es decir, tienes que hacer una aplicación en el equipo receptor con un socket listener, conectarte desde el módem, leer le fichero de la flash del módem, transmitirlo por el socket al dispositivo móvil. Con una PDA con Windows Mobile es fácil desarrollar una aplicación en .net para hacer esto, aunque lleva su horas.
Salu2.
Muchas gracias!! la idea es tener un programita en un movil que solicite al modem el fichero y este se lo envíe.
Un saludo.
Hola!
Muy interesante este y todos los ejemplos que pones, gracias por compartirlo con todos.
Tengo una consulta, a ver si me puedes ayudar.
Estoy haciendo un programita que debe contar pulsos, los pulsos se generan con un switch que al cerrarse, cuando un iman esta cerca, deja pasar el voltaje a su entrada, este voltaje, pensaba sacarlo de un puerto del mismo TC65T que utilizo, para no poner nada adicional.
Estoy utilizando el contador del modulo (GPIO10 en modo Start/Stop) pero cuando genero un pulso, el contador cuenta una cantidad muy grande de “pulsos” mayor a la generada, incluso hice la prueba haciendo que el mismo TC65T envie ondas cuadradas por un pin y directamente lo conecté al contador de pulsos y aun asi cuenta mas de los pulsos que recibe.
Es necesario que utilice un circuito externo para evitar rebotes? o se puede hacer por software?
Si tienes alguna sugerencia para realizar este programa, te agradecería me la indiques.
Muchas gracias
y Felicitaciones por tu blog!
Saludos,
Renzo
Hola Renzo,
lo puedes hacer por software, pero, ¿estas conectando alguna resistencia de pull-up o pull-down a la entrada de la GPIO 10? El contador no cuentas más pulsos de los que lee.
De todas maneras, implementa un sistema antirrebotes soft, es muy fácil, una forma sencilla es esperar una cadena como …1111100000111111… es decir, tienes que leer 1s y un nº seguido de 0s consecutivos para considerar que ha habido un cierre.
Salu2
Hola,
Muchas gracias por tu pronta respuesta…
no he utilizado una resistencia a la entrada del contador, haré la prueba con una de 1K a ver que pasa….
Del antirebotes por soft, en el caso que me mencionas, ya no utilizaría el contador GPIO10? sino que tendría que hacer un contador a parte, utilizando cualquier pin de uso general? y estar sondeando ese pin, para analizar cuando hubo un pulso?
Gracias nuevamente
Saludos,
Renzo
Hola Renzo,
claro, si implementas un contador antirebotes soft, tendrías que utilizar una GPIO convencional, pero piensa que la lectura de las entradas es mucho más lenta.
Salu2
Hola,
Estoy intentando grabar en un fichero el contenido de los SMS según me van llegando al MTX-65, incluido el teléfono que lo envía y la fecha y hora de llegada.
Con ayuda del código que nos has dejado, he conseguido la escritura (y creacción si no existe) en el fichero, pero lo que no consigo es escribir a continuación del contenido del fichero. Con el objDataOutputStream.write(“texto”); se sobreescribe en el fichero, y al final el fichero contiene solo la última escritura.
Como puedo hacer para que cada vez que se quiera escribir, se añada al final del texto ya escrito??
Gracias y un saludo
Hola!
Escribía para comentar que el problema con el contador que tenía, se arregló colocando una resistencia de 10K entre GPIO10 y tierra.
Saludos,
Renzo
Hola a todos, estoy intentando enviar un archivo a un servidor ftp, que supongo que será más sencillo que crear una aplicación en visual studio y que abra un socket, yo me conformo con subir ese fichero a un servidor ftp. En el documento AT command set del tc65 he visto un ejemplo de como subir un fichero, pero la verdad es que es un poco raro, en este documento te indica como configurar la conexión y luego enviar el contenido del fichero como si se tratara de texto y además he creído entender que el fichero debe estar creado ya en el ftp, así que no lo tengo muy claro. Alguna ayuda??.
Gracias de antemano, felicidades por el blog.
Hola,
EL TC65 tiene primitivas de FTP a través de su pila TCP/IP interna.
Esta pila es también utilizable desde Java, cre ocrecordar que lo único que no puedes haces es tener una conexión GPRS por Java y simultaneamente la de la pila TCP/IP interna
Salu2
Trastete
Muy bueno el articulo!
Pero quisiera que ayudaras por favor con lo siguiente:
1. Lo que yo quisiera saber es como se escribe y se lee directamente al puerto RS232 el modem TC65T, ya que no he podido enlazar los imports necesarios para esto.
2. Como puedo enlazar o conectar el puerto serial RS232 respecto a caracteres recibidos a un fichero de texto tipo txt como lo acabas de explicar.
Muchas gracias por la ayuda.
Salu2
Antonio
Hola Antonio,
con los ejemplos de:
http://www.blogelectronica.com/ejemplos-java-j2me-modem-gprs-siemens/
tienes bastante material como para poder hacer la aplicación que indicas. Tienes sendos ejemplos del tema que pides.
Salu2
Hola,
he trabajado con archivos en la version R2 del TC65T y ha veces me aparecia la exception ClassNotFoundErrror en la linea (solo en depuracion):
FileConnection objFileConnection = (FileConnection)Connector.open(”file:///a:/fichero.txt”);
ahora con la R3 me salta siempre de forma que no hay manera de depurar las aplicaciones en la que utilizo archivos, estoy utilizando el Eclipse 3.2.2 con el plugin 1.5.5. y no hay manera….
Saludos
Hola Jordi,
¿Actualizaste todo el SDK? Yo debugo aplicaciones sin problemas con el Eclipse 3.2.2 y el plugin 1.6.8 si bien es cierto que no he debugado nunca un programa con ficheros, pero no le encuentro mucho sentido a lo que te ocurre. Si has instalado el nuevo SDK ¿tienes asociado el proyecto a la nueva plataforma? (Ya sabes, propiedades del proyecto, J2ME, …)
Salu2
Hola,
Gracias por compartir todo tu conocimiento, nos ayuda muchísimo a la gente que estamos empezando. Estoy intentando escribir datos en un fichero y necesito que la ultima escritura sea lo que el fichero contenga; te pongo un ejemplo: si escribo primero “123456789″ con tu ejemplo me lo guarda perfectamente. Sin embargo, si luego vuelvo a escribir en el fichero, ahora “ABCDE”, el contenido del fichero es “ABCDE6789″, es decir, me sobrescribe los 5 primeros caracteres del contenido y el resto de la primera escritura se mantiene y necesito que se borre y sólo contenga: “ABCDE”. Es posible solucionar esto? Muchas gracias.
PD: perdona por poner un ejemplo tan simple, es para intentar explicarlo correctamente.
Hola Pablo,
mañana o a más tardar el viernes voy a poner precisamente un post en blogElectronica de cómo añadir datos a un fichero. Sigue con otras cosas de tu aplicación, que eso lo verás aquí en un par de días.
Salu2
Perfecto!! Una pregunta más: y si lo que quiero es que al escribir en un fichero el contenido de éste sea solamente lo que haya escrito la última vez, se puede hacer? Gracias de nuevo
Hola Blog!!! Muchas felicidades por tu conocimiento compartido ha sido de gran ayuda.
Espero me puedas ayudar con una pregunta.
Resulta que tengo un Modem TC65 conectado a una PC y necesito que los datos que le llegan a eso modem por mensajes SMS se guarden pero no en la memoria flash del equipo sino en la PC. Como puedo hacer ese translado de datos de un lugar a otro.
Espero q estes bien. Saludos
puedes hacerlo de muchas formas.
Puedes crearte un servidor ftp en ese ordenador, y subir los archivos, pero tendras que utilizar GPRS. Otra forma es que te hagas un programa en tu pc, que te guarde estos SMS, por ejemplo comunicandote con el puerto serie.
Hola, gracias por la información repartida por los distintos post, me esta siendo muy útil.
Estoy intentando implementar una base de datos en un dispositivo MTX65, he probado con floggy y perst lite. Floggy me da errores de librerias debido a incompatibilidades de versiones entre el floggy y eclipse + eclipse.me (uso 3.2.2 y 1.6.8 respectivamente) y perst lite me da “OutOfMemory” en cuanto intento crear un índice.
¿Alguien ha conseguido hacer funcionar alguna de estas bases de datos?
¿Hay alguna alternativa más a estas dos bases de datos que funcione con la familia TC65 y en concreto con el MTX65? no tiene porque ser relacional, también puede ser orientada a objetos.
Muchas gracias.
Un Saludo. Enrique.
Hola, tal vez esto sea mas bien problema de Java, pero, ¿es posible abrir un fichero en modo aleatorio, es decir, con su cursor para escribir donde se desee? P.e. cambiar datos, etc.
Un saludo y muchas gracias
Hola Mario,
no de la manera que estás acostumbrado con otros lenguajes. Tienes que abrir el fichero, especificando por ejemplo un offset y sí, empezará a escribir por ahí.
Lo más sencillo es utilizar la clase RecordStore, podrás guardar, leer, cambiar, borrar registros cómodamente.
Salu2.
Muchas gracias:
Efectivamente, abriendo con un offset determinado si te vas a esa posición. Luego ya tua aplicación lo maneja como consideres.
Un saludo,
Mario
hola, un como puedo direccionar un fichero para que guradarlo en una memoria SD externa, como habilito los pines gracias
Hola,
desde el TC65/XT65 solo es posible escribir en modo RAW en un memoria externa conectado al SPI o I2C.
Tienes unos cuantos post tratando esto en esta misma página.
Salu2
Pua
Hola,
Soy usuario del módulo EGS5, y buscando en la carpeta de samples del WTK encontré un ejemplo que se llama fwupdemo en el cual muestra cómo descargar un archivo de firmware desde http, y luego hacer una actualización de firmware utilizando el mismo. El punto interesante, es que según reza el ejemplo, no descarga el archivo en el mismo sistema de archivos del módulo sino directamente sobre un almacenamiento externo (sd?) a través de spi. Según parece, toda la cuestión sería abrir un FileConnector con usando un 3 en la unidad:
fconn = (FileConnection)Connector.open(“file:///3:/kathy_all_222an.usf”);
(Utiliza algunas variables en el ejemplo que las reemplacé aquí para simplificar).
Me restaría conectar un zócalo para tarjetas SD a la SPI y probar si realmente funciona. Alguien tiene alguna placa con el slot SD conectado a la SPI que ya la esté usando como RAW y puede probar ésto? De funcionar solucionaría muchísimos dolores de cabeza creo yo.
Salu2