Modem GPRS Siemens. Gestión de una conexión TCP/IP desde Java.
Escrito por blogElectronica en 2.DISPOSITIVOS (práctico), Comunic. GSM/GPRS, TelefoníaEn mi anterior post vimos como utilizar el sistema de ficheros de algunos de los modems Siemens para almacenar y recuperar información. Creo que fue bastante interesante. En esta ocasión vamos a ver algo que creo todavía más interesante y que la verdad, no hay demasiados ejemplos por ahí (yo no he encontrado ninguno), por lo que creo que este post va a ser bastante leído.
Vamos a ver cómo realizar una conexión TCP/IP desde un programa Java embebido en un módem de Siemens. Veréis como enviar datos por un socket y cómo recibir datos por él desde un servidor. Yo he utilizado un módem GPRS MTX65, aunque el ejemplo funcionará de la misma manera en un módem GPRS MTX65+G, en un Siemens TC65 o en un Siemens XT65 (distribuidos en España por Matrix).
¿Y a qué servidor nos conectamos para hacer las pruebas?
Pues como hago de forma habitual, utilizo la IP de un servidor de Google para hacer pruebas. Lo que veréis en el programa Java que os pongo a continuación es cómo realizar una conexión TCP/IP a un servidor con dirección IP 216.239.59.147 y puerto 80 (el puerto HTTP). En este programa, además de realizar la conexión TCP/IP, se envían una serie de datos al servidor por el socket una vez establecida la conexión (se pide la página principal) y se reciben lo datos también por el socket (los datos HTML). Es muy simple pero creo que ilustra bastante bien la mecánica y puede resultaros muy útil en alguna ocasión.
Ha continuación tenéis un programita de ejemplo. He puesto bastantes comentarios para que podáis seguirlo sin demasiada dificultad, pero cualquier cosa me comentáis, y si está en mi mano, os hecho un cable ;-)
package src;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import com.siemens.icm.io.ATCommand;
import com.siemens.icm.io.ATCommandFailedException;
import com.siemens.icm.io.ATCommandListener;public class Conexion extends MIDlet
{ATCommand ATC;
ATCommandListener LIS;
int hemosRecibidoDatos=0;//Constructor de la clase
public Conexion()
{
//Inicializamos la clase ATCommand y el Listener
try
{
LIS = new ATListener();
ATC=new ATCommand(false);
ATC.addListener(LIS);
}
catch (IllegalStateException e){e.printStackTrace();}
catch (ATCommandFailedException e) {e.printStackTrace();}//Iniciamos una conexión TCP
iniciaConexion();}
//Defimos nuestra clase ATListener
class ATListener implements ATCommandListener
{
//Sólo controlaremos un URC en este ejemplo
//y será para saber cuándo recibimos datos
public void ATEvent(String Event)
{
//Sacamos el evento que se ha producido:
System.out.println(“Evento: “+ Event);//Y si el URC corresponde a que han llegado datos …
if (Event.indexOf(“SISR”)>0)
{
//Mandamos leer los datos del socket
System.out.println(“Leemos los datos TCP”);
leerSocket();
}
}
public void RINGChanged(boolean Event) {}
public void DCDChanged(boolean Event) {}
public void DSRChanged(boolean Event) {}
public void CONNChanged(boolean Event) {}
}protected void startApp() throws MIDletStateChangeException {}
protected void pauseApp() {}
protected void destroyApp(boolean arg0) throws
MIDletStateChangeException {}//Método para conectarnos con el servidor remosto
public void iniciaConexion()
{
//Nos conectaremos a Google
String direccionIP = “216.239.59.147″;
String puerto = “80″;
String r=”";System.out.println(“Iniciando secuancia conexión GPRS”);
try
{
r=ATC.send(“AT^SICS=1,conType,GPRS0\r”);
Thread.sleep(100);r=ATC.send(“at^sics=1,user,CLIENTE\r”);
Thread.sleep(100);r=ATC.send(“at^sics=1,passwd,AMENA\r”);
Thread.sleep(100);r=ATC.send(“at^sics=1,apn,internet\r”);
Thread.sleep(100);r=ATC.send(“AT^SICI=1\r”);
Thread.sleep(100);r=ATC.send(“AT^SISS=1,srvType,socket\r”);
Thread.sleep(100);r=ATC.send(“AT^SISS=1,conId,1\r”);
Thread.sleep(100);r=ATC.send(“AT^SISS=1,address,socktcp://” + direccionIP + “:” + puerto + “\r”);
Thread.sleep(100);r=ATC.send(“AT^SISO=1\r”);
System.out.println(r);
Thread.sleep(3000);System.out.println(“Enviando datos …”);
//Enviamos una petición a Google de la página principal
escribirSocket(“GET / HTTP/1.1\r\n\r\n”);
System.out.println(“Datos enviados”);//Nos quedamos esperando en un bucle a recibir algo vía TCP
System.out.println(“Esperando recibir un paquete de datos TCP …”);
while (hemosRecibidoDatos==0);//Cerramos el socket
r=ATC.send(“AT^SISC=1\r”);
Thread.sleep(100);//Paramos el programa
notifyDestroyed();}
catch (Exception e){System.out.println(“Error.”);}
}//Método para leer los datos del socket
public void leerSocket()
{
try
{
//Mandamos el comando AT para leer lo que hay en el socket
ATC.send(“AT^SISR=1,1500\r”);
Thread.sleep(1000);//Asociamos el stream de entrada de datos
InputStream is = ATC.getDataInputStream();
//Y si hay datos disponibles los leemos …
if (is.available() > -1)
{
//Creamos un buffer del tamño de los datos recibidos
byte[] buffer = new byte[is.available()];
//Leemos los datos y los cargamos en buffer
is.read(buffer, 0, is.available());
//Mostramos los datos por la salida estandar …
System.out.println(new String(buffer));
//Activamos el flag, de esa manera ya no nos quedamos esperando
hemosRecibidoDatos=1;
}//Gestión de las exepciones
} catch (IllegalStateException e) {e.printStackTrace();
} catch (IllegalArgumentException e) {e.printStackTrace();
} catch (ATCommandFailedException e) {e.printStackTrace();
} catch (InterruptedException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();}}
//Método para escribir datos en el socket
public void escribirSocket(String cadena)
{
OutputStream os;try
{
System.out.println(“Enviado: ” + cadena);
//Asociamos el stream de salida al de la clase ATCommand
os = ATC.getDataOutputStream();
//Enviamos el comando AT^SISW de envío
ATC.send(“AT^SISW=1,” + cadena.length() + “,0,0\r”);
Thread.sleep(500);
//Escribimos los datos por el socket
os.write(cadena.getBytes());
Thread.sleep(500);
}
//Gestión de las exepciones
catch (IOException e) {e.printStackTrace();}
catch (IllegalStateException e) {e.printStackTrace();}
catch (IllegalArgumentException e) {e.printStackTrace();}
catch (ATCommandFailedException e) {e.printStackTrace();}
catch (InterruptedException e) {e.printStackTrace();}}
}
Bueno, espero que os haya gustado y que os pueda ser útil en alguna ocasión. Otro días más
Post relacionados:
- Conexión CSD a módulo GSM desde módem analógico Aunque cada vez es más frecuente el uso de comunicaciones...
- Cómo usar ficheros con módems de Siemens desde Java. Como seguro ya sabéis, varios de los modelos de módems...
- Añadir datos a ficheros con módems Siemens-Cinterion desde java En bastantes ocasiones me ha llegado la pregunta de cómo...
- Nuevo módem GPRS teminal MTX65 basado en el módem Siemens TC65 Matrix Electrónica ha lanzado la distribución de un nuevo modelo...
- Autoarranque de aplicaciones Java en módems Siemens Muy buenas. Hoy voy a poner un pequeño post relacionado con...
Buenas,
Tengo un par de dudas acerca de este ejemplo. De momento estoy programando desde el PC una aplicación que por puerto serie mando los comandos AT para realizar la conexión, pero para el caso sería lo mismo.
Mi duda es. Hago una conexión como la tuya y abro un socket contra un servidor propio. Hasta aquí todo correcto. Cuando finalizo, cierro el servicio con el comando AT^SISC=0. Cierro mi programa y lo vuelvo abrir y muchas veces cuando intento realizar todo el proceso de nuevo, el modem se queda sin responder a algun comando como AT^SICS, como si estubiera ya abierto o algo parecido y ya no puedo proseguir. ¿Como puedo, antes de cerrar mi programa asegurarme que he dejado el modem totalmente “cerrado”? es decir sin servicio abierto, ni conexión abierta, listo para empezar de nuevo. Si mando un AT^SISC=0 y luego un AT^SICC=0 a veces me coje bien la segunda instrucción y a veces la segunda ya no me la coje.
Por otro lado, mi proveedor me ha dado un ftp de descarga que no está completo el CD de siemens y no puedo seguir tus pasos (en tu ejemplo) para instalar el entorno de desarrollo java. ¿Como podría conseguir los programas para poder instalar tal y como tu explicas el IDE + SDK java?
buff, vaya parrafada!
Muchas gracias,
Enhorabuena por este fantástico blog!
Saludos!
donde puedo bajar las librerias de java o alguna libreria para enviar comandos at
?
Hola Milugar,
pídeselas a tu distribuidor. El SDK de los módems Cinterion es gratuito y las librerías vienen con él.
Salu2
hola estas estasn en C:\Program Files\Cinterion\CMTK\TC65I\WTK\lib una vez que hayan instalado el tc65i
Saludos
Hola kriyeng,
es extraño lo que te ocurre. ¿Estás completamente seguro que el problema no proviene de la aplicación del PC, es decir, por ejemplo que no envías un nuevo comando antes de finalizar la respuesta del módem al comando previo?
Yo no suelo utilizar el comando SICC, dejo que salte el timeout. Prueba a utilizar el comando SISS antes de cerrar el programa, estableciendo el srvType a none.
De todas maneras te aconsejaría que probaras el entrenador de Siemens de Matrix y probaras si se te reproduce el problema.
Respecto al CD de Siemens y los programas del SDK, los podrías descargar del ftp que Matrix Electrónica tiene para sus clientes. Te puedo asegurar que ahí está todo el software necesario, manuales y ejemplos (y el entrenador también está ahí). Deconozco otro lugar donde se puedan descargar.
Salu2.
Buenas de nuevo!
Muchas gracias por tu respuesta!
Cuando mando un comando siempre me quedo a la escucha esperando la respuesta que contenga el “OK”.
Lo raro es que paro la aplicación y luego al encenderla de nuevo es cuando ya no me acepta comandos. Es al cabo de un tiempo (no he llegado a la conclusión de cuanto) que el modem ya me acepta los comandos. Si lo reinicio, me funciona al instante.
Por lo del FTP, mi proveedor del modem no fué matrix, con lo que no tengo acceso a su ftp. Lo que me he podido descargar yo es lo siguiente:
01/12/2005 09:29 5.664.779 EclipseMEplugin.zip
01/12/2005 09:30 5.175.379 MES.zip
01/12/2005 09:30 1.683.596 tc65_wtk.zip
¿Crees que es suficiente si por mi mismo me instalo el JDK i el eclipse?
Gracias.
Saludos
Solo comentar que ya dispongo del CD de instalación,
Muchas gracias,
Saludos.
Para probar con este ejemplo he de tener una dirección ip fija no? el problema que tengo es que quiero enviar un archivo del modem a un servidor que en mi caso es localhost. Como podría hacerlo?? de la misma forma?? que ip pondría en ese caso??
Gracias y saludos.
Hola Fran,
para probar precisamente este ejemplo no es necesario tener IP fija, pues te conectas al servidor de Google. Si quieres probarlo en un servidor tuyo pues si, tienes que tener IP fija en el servidor o utilizar los servicios de dyndns.org.
Para subir archivos lo mejor que puedes hacer es utilizar el servicio de FTP del módem de Siemens.
Salu2.
Buenas,
Primero y ante todo enhorabuena por este magnífico sitio donde encontrar información sobre estos módulos.
Los artículos me parecen muy útiles y prácticos. Yo trabajo con el terminal Siemens TC65 y a diferencia de tu artículo no utilizo los comandos AT para las conexiones HTTP sinó que utilizo la clase HttpConnection. En general funciona bien, pero me he encontrado con algún problema en puntos con poca cobertura. Supongo que la solución es monitorizar la fuerza de la señal con el comando AT+CSQ o el comando AT^MONI. Bueno, simplemente era por si te habías encontrado con este problema que supongo que se puede forzar desconectando la antena una vez intentas enviar datos. Bueno, me estoy enrrollando. De nuevo, enhorabuena por la página aunque parezca peloteo.
Saludos.
Hola Amigos,
Alguien podria decirme que comandos AT se usan para enviar una cadena de datos de nuestra eleccion a un servidor propio??
Muchas gracias,
Se hace esto con el AT^sics????
Hola!
Lo primero es agradecer este magnífico blog sobre este tipos de dispositivos.
Podrías poner un ejemplo que gestione automáticamente la conexión gprs. En trasmisiones gprs el coste de la conexión es muy elevado con respesto al coste del envío de datos (se debe conectar el menor número de veces, mantenerla abierta aunque no se transmita).
hola,
Para el servico GPR necesitas una calidad de señal. Por debajo de esa calida de señal el servicio no será bueno o adecuado.
Intenta desconectar GPRS del modem con AT+GCATT o AT+GACT , no recuerdo el comando, y luego vuelve a abrir el HTTPConnection. De esta manera te evitarás posibles despriorizaciones en la red.
Salu2
Pua
Hola, estoy probando un terminal MTX-65+G con conexión a FTP via GPRS, ¿tenéis idea por que con una tarjeta de contrato funciona y con una de prepago no, para el mismo operador -Orange-? He comprobado en un teléfono normal que ambas se conectan a internet vía GPRS.
Muchas gracias.
Un saludo a todos.
Gustavo
Isaac,
tienes un ejemplo de cómo hacer eso con comandos AT aquí:
http://www.matrix.es/videos/demoGPRS_Siemens.htm
Salu2.
Hola david,
eso depende del plan de datos que tengas. No todos los planes de datos cobran por conexión. Algunos sólo por volumen. No tengo ningún ejemplo que “gestione la conexión gprs”.
Salu2
Buenos dias.
Lo primero es que estoy encantado con este sitio, ya que es el único que tiene información “util” sobre este tipo de programación.
Te comento mi problema para ver si me puedes ayudar. En mi proyecto, vamos a conectar el modem gprs tc65 a un dispositivo via RS232. El tema es que la conexion la vamos a hacer a traves de una apn propia del cliente. El sistema, basicamente lo que hace es que cada cierto tiempo, le pide datos al dispositvo a traves del modem GPRS, por lo que necesito tener una conexion siempre abierta y con un socket preparado para recibir comandos.
En el código que has puesto antes, dices que te vas a conectar al servidor de google, pero yo no me voy a conectar a ningun servidor, sino que será mi aplicacion la que se conecte al modem para mandar los comandos al dispositivo que tiene conectado.
¿Que pasos tengo que dar para hacer esto? Creo que deberia de:
1- poner en memoria del modem los comandos at necesarios para conectarme a la apn del cliente con su usuario y password, para que nada mas arrancar el equipo se conecte y obtenga una ip ¿como hago esto?
2- ¿una vez creada la conexion, el modem es capaz de gestionar los paquetes tcp que se le manda o hay que hacer una aplicación java que gestione los sockets?
Siento la parrada que acabo de soltar, pero llevo bastante tiempo intentado resolver el problema pero acabo de dar con la tecla.
Espero que me puedas ayudar.
Muchas gacias
Hola Benito,
debes hacer un programa java. Desde ese programa java debes conectarte a Internet. No me preguntes cómo hacer eso, precisamente en el post donde escribes aparece como crear una conexión (ya lo se, cliente no server) GPRS desde Java.
Y sí, creada la conexión el programa java debe controlar los sockets de tu aplicación. Si te esperas un poco, antes de final de mes voy a poner un post de un equipo (comercial) que hace exactamente eso.
Salu2
Hola,
este tema es sumamente interesante, gracias por compartirlo con nosotros.
Tengo una inquietud, quiero hacer una aplicación donde el modulo TC65T reciba unas señales digitales y que cuando yo quiera, empleando un aplicativo en una PC, le solicite la información al modulo.
Mi pregunta es, que tipo de protocolo es el adecuado? Socket? HTTP?
Y en el caso que quiero tener la opcion de pedirle al equipo que me envie la información y además que el solo me la envíe cada cierto tiempo, que protocolo debería usar?
Te agradeceré cualquier comentario al respecto
Muchas gracias
Saludos,
Renzo
Hola Renzo,
el protocolo HTTP es para conctarte por HTTP a un servidor remoto, no para implementar un web server en el interior del TC65. Sin duda la aplicación debes implementarla utilizando sockets. El ejemplo de este mismo post con sockets puede irte bastante bien.
Salu2.
Hola nuevamente,
gracias por tu respuesta…te comento estoy haciendo unas pruebas con Socket basadas en el ejemplo que publicaste..
Primero usando la PC como servidor corriendo un aplicativo en java y el TC65T como cliente, no tengo ningun problema, los dos equipos se comunican.
Pero cuando hago que el TC65T sea servidor y la PC cliente, no logro que se comuniquen, estoy siguiendo tambien las indicaciones del manual AT, pero nada.
Intentando hacer algo basico, en el modulo usando el hyperterminal creo el perfil y pongo: AT^SISS=1,address,socktcp://listener:65534
cuando pongo at^siso? me da el IP, el cual se lo pongo a un aplicativo en java que corre en la PC,
Socket s;
s = new Socket( “10.30.179.251″,65534 );
todo dentro de un try-catch
Pero despues de un tiempo me arroja un error de timeout, intenté aumentar el tiempo de conexion pero igual no consigo nada.
Te agradecería mucho si por favor me envias alguna sugerencia.
Gracias
Saludos,
Renzo
Hola Renzo,
pero después de iniciar la conexión desde el PC ¿aceptas la conexión del socket entrante en el TC65T?, es decir, seguramente viendo tu programa, cuando recibas un URC en el módem de conexión entrante, tendrás que hacer un AT^SISO=0 para aceptar la conexión entrante por el socket 0, si como veo de tu post estás utilizando el 1 para escuchar el puerto 65534.
Salu2.
Hola,
por lo que veo, el TC65T nunca recibe un mensaje URC, yo lo tengo corriendo con el hyperterminal y se queda en modo “listening” todo el tiempo, nunca me aparece el URC de conexion entrante.
Y en la PC, el programa que tengo, me indica un error por exceso de tiempo de conexion.
Parece que nunca le llega una conexion entrante, pero no sé de que depende eso…No sé si depende del operador telefonico o algo estoy haciendo mal.
Gracias
Saludos,
Renzo
Hola Renzo,
a menos que tengas desactivados lo URC me temo que o bien tiene bloqueados los puertos tu operadora, o tienes un firewall que no te deja enviar a según qué puertos, o el programa de tu PC no está bien.
¿ te responde el ping ? ¿ Has probado conectarte desde el explorador como http://LaIpDelEquipo:65534 ? (Esto último únicamente para ver si recibes el URC y descartar un problema del software de tu PC)
Salu2
Hola, gracias nuevamente por tu respuesta.
te cometno que hice lo que me indicaste, y el TC65T no recibe ninguna URC. Quizá sea por culpa del operador telefonico.
Lo que estoy haciendo ahora es que la PC sea el Servidor y el Modulo se conecte a este como un cliente, pero quiero que siempre este conectado, para que la PC le solicite información al módulo en cualquier momento.
El problema que tengo es que cuando pasa mucho rato en que no hay transferencia de comunicación entre ambos, el TC65T se desconecta y me aparece: ^SIS: 1, 0, 13, “The network is unavailable”
Como puedo hacer para que no se desconecte?
Te agradezco cualquier comentario al respecto
Saludos,
Renzo
Hola:
Como siempre gracias por la infomración que nos das siempre es de gran ayuda.
Mi duda es ¿por qué usas comandos at y no las clases SocketConnection o ServerSocketConnection? Ya que ocultan el uso de comandos haciendo la comunicación mucho más fácil.
Además la clase ServerSocketConnection es muy útil para realizar lo que plantea Benito Rúiz ya que te permite crear un listener que permanezca a las escucha en un puerto determinado. Lo que te permite comunicarte con el modem siempre y cuando conozcas su IP (el proveedor debe ofrecer una IP estatica).
Un saludo.
Hola de nuevo:
Se que esta entrada no tiene que ver con la pregunta que voy a hacer pero es que no he encontrado casi nada al respecto.
Nosotros utilizamos una VIPER de Arcom y queremos usar el MTX65 para proporcionarle conexión GPRS. Para ello uso el driver que viene por defecto para una conexión Unimodem. Introduzco todos los parametros y la Viper se comunica con el Modem pero no consigo mas que NODIALTONE. Tal vez podaís ayudar con una explicación de como configurar la conexión.
Muchas gracias.
Hola Dani,
utilizo los comandos AT porque me era más sencillo realizar algunas cosas que mantener una simple conexión. Me es más sencillo saber cuando se cierra una conexión así como mantener o no el attach a la red GPRS. Pero eso es por gustos, puedes hacerlo como más te guste.
Respecto a la Viper de Arcom, no lo conozco, no te sé ayudar a crear la conexión.
Salu2
Hola,
Tienes un tutorial que nos diga como programar un TC65 desde cero??? Si ya se que ya tienes uno pero yo lo unico que veo es el prgrama terminado, eso no me a ayudado mucho porque cuando corro el eclipse me pide que mencione el workspace, lo hago, pero no abre el archivo de ejemplo, no se como funciona eso de workspace, creo que tiene que ver con eso que no me quiera abrir el archivo. Pero lo que mas me interesaba es ver como hacer un programa desde cero. Veran voy empezando en JAVA y existen muchas palabras y lexicos dentro del IDE Eclipse que no entiendo….disculpa por quitarte tu tiempo
Hola Isaac,
no, no tengo nada tan básico. Te aconsejo que te leas el documento Java User Guide que viene con el CD de Siemens, ahí encontrarás lo que necesitas. Si no tienes ese documento, pídeselo a tu distribuidor de Siemens, él lo tendrá.
Salu2.
Buenas!!
He probado el programa para la gestion tcp/ip que has colgado en tu blog, pero al ejecutarlo en el modem (TC65) justo cuando va a enviar los datos se produce una excepcion.
El modem se configura correctamente y obtengo una direccion IP. Con el entrenador del TC65 proporcionado en el Cd de Matrix funciona perfectamente.
¿que puede estar pasando?
Hola Arlukas,
¿Qué versión de módem estás utilizando (comando ATI)? ¿Qué tipo de excepción te da? En principio debiera funcionar correctamente.
Puedes hacer otra prueba ya que tienes el software entrenador. Puedes utilizar la pestaña del software “Comunicaciones GPRS”. Abajo, donde pone Servidor TCP/IP dala al botón “Run/Stop”. Por defecto el entrenador escuchará por el puerto 20010 a menos que lo cambies. Haz un NAT en tu router al puerto 20010 (o el que escojas) hacia el ordenador donde tengas el entrenador.
Luego en el soft de ejemplo, cambia la IP de Google por la IP pública de tu router y el puerto 80 por el 20010 o el que elijas. Cuando ejecutes la aplicación deberías ver cómo se conecta al entrenador y también en el entrenador deberías ver cómo recibes los datos.
Salu2.
He probado lo de enviar datos desde el modem a mi propio ordenador con el entrenador de Matrix y he podido comprobar que funciona perfectamente.
Muchisimas gracias.
Buenas, me gustaría saber los comandos que hay que enviar para:
1) Abrir una conexión GPRS, obtener la IP del dispositivo y mantenerla abierta “indefinidadmente”
2) Cerrar la conexión GPR
3) Detectar que la conexión GPRS esta activa
4) Conectar con un servidor socket
5) Enviar datos al servidor socket
6) Cerrar la conexion con el servidor socket
David,
tienes los comandos escritos en este mismo post, en el ejemplo en java que además está bastante bien comentado.
Salu2
Buenas, pero en el ejemplo anterior no se obtiene la IP y la conexión GPRS hasta que no se conecta con el socket. Además al cerrar el socket se cierra la conexión GPRS.
Si un dispositivo debe enviar periódicamen información lo mas eficiente es:
1.- Abrir la conexión GPRS (obteniendo la IP), mantenerla indefinidamente abierta y reconectarla en caso de perdida, debido a que las conexiones GPRS son muy caras (mucho mas que el envío de datos).
2.- En cada envío, se debe abrir una conexión socket enviar los datos y cerrarla, debido a que no se deben mantener abierta las conexiones socket por que los servidores tienen limitadas las conexiones entrantes,
Usando el código anterior, por cada envío abrirá y cerrará la conexión GPRS y socket y se obtendrá una nueva IP por cada envío.
Saludos.
Hola David,
lo que tu comentas depende un poco de la aplicación. Hay ocasiones en el que el socket debe permanecer siempre activo, te lo puedo asegurar, aunque si las transmisiones son esporádicas, por supuesto la opción que tu planteas es la mejor.
El ejemplo es lo que es, un ejemplo básico, donde se muestra cómo abrir un socket enviar y cerrar.
1) Abrir una conexión GPRS, obtener la IP del dispositivo y mantenerla abierta “indefinidadmente”.
Pues en vez del comando AT^SISO utiliza el AT^SICO, que abre un perfil de conexión en lugar de uno de servicio. No abrirás el socket y tendrás la conexión, en principio, indefinida hasta que te eche el operador.
2) Cerrar la conexión GPRS
Siguiendo la manera anterior con AT^SICO, si no tienes sockets y quieres cerrar la conexión puedes usar el comando AT^SICC
3) Detectar que la conexión GPRS esta activa
AT^SICI Ojo aquí, en algunas ocasiones puede ocurrir (algunos operadores lo hacen) que pasado un tiempo no enrutan ppp. Te aconsejo que hagas un ping cada x horas.
4) Conectar con un servidor socket
AT^SISO
5) Enviar datos al servidor socket
AT^SISW
6) Cerrar la conexion con el servidor socket
AT^SISC
Salu2
Buenas.
Ante todo, enhorabuena por este pedazo de Blog.
Y para continuar, espero que no me eches a los perros, jejeje.
Veras, no tengo practicamente ni idea de programar un modem GPRS, pero me han pasado dos modelos para que los programe. Uno de ellos es el MTX-65+G y el otro un modelo Mini-MT de Enfora. En principio tengo que hacer algo sencillo… Cada minuto, comprobar si ha cambiado la posicion y en caso afirmativo enviar un post con la direccion a un servicio web.
Mi pregunta es bastante simple.
Asi como en el modelo Mini-MT si que he encontrado comandos que controlan Eventos, Timers, Variables… en el MTX-65+G no he encontrado nada de eso (no te puedo decir que me haya leido el manual de comandos AT de cabo a rabo… pero en ninguna de sus secciones se mencionan este tipo de comandos). El caso es, ¿existen este tipo de comandos o tengo que programar en java por huevos? No es que me importe lo segundo… pero el problema principal (y ahora es cuando me cortan los huevos, jejeje) es que no se como se mete la aplicacion en Java y si hay alguna forma de que arranque nada mas se enchufe el modem.
Espero que no te cueste mucho responderme esto porque voy muy perdido con este tipo de cosas.
Saludos
Hola Javier,
no te echo los perros porque están durmiendo ahora que si no …
Es broma, mira, para hacer lo que indicas, si el equipo ha de ser autónomo, es decir, si no va a haber ni un micro ni un PC conectados al módem, no te va a quedar otra que programar en Java. Pero no te preocupes, que es muy fácil.
No compares el MTX65+G con el Énfora, son dos conceptos distintos, aunque desde mi punto de vista, el primero es muy superior (todo lo que puedes hacer con el Enfora lo puedes hacer con el MTX65+G (programando claro) pero no todo lo que puedes hacer con el MTX65+G lo puedes hacer con el énfora).
Respecto a lo de “meter la aplicación Java” está explicado por varios puntos del blog:
Una vez compilado el programa se crean los ficheros .jar y .jad
El Siemens TC65 (y el siemens xt65) tiene un software llamado MES. Al instalar ese software en el icono de MiPC de tu ordenador aparecerá un simbolito que representa al módem Siemens ero lo trata como si fuera un Pendrive. Evidentemente el Siemens TC65 o Siemens XT65 tienen que estar conectados al PC bien por puerto serie o bien por puerto USB. Tan solo tendrás que arrastrar los ficheros .jad y .jar que te comentaba antes a la “unidad de disco” del Siemens. Por supuesto puedes poner tantos ficheros como quieras, sin superar los 1.7Mb que tiene de memoria flash.
Para ejecutar un programa java, imaginemos que tienes el programa enviarSMS.jar, tan sólo tendrías que ejecutar el comando AT: at^sjra=”a:/enviarSMS.jar” , donde a: es la unidad virtual que crea el módulo de Siemens TC65 (o XT65). O si lo prefieres pues configurar el parámetro autostat y appname (mira el comando AT^SCFG?) para que al conectar el módem arranque automáticamente tu aplicación.
Salu2
Ante todo, gracias por la respuesta.
Todo lo que sea programacion… siempre es mejor que cualquier sistema que se limite a comandos… en eso te doy toda la razon.
No habia instalado el MES todavia ya que no tengo el CD de siemens y no sabia que se me crearia la unidad virtual (eso me pasa por no trastear un poco mas, jajaj). Y lo del autostat me viene cojonudo entonces. Ahora falta que consiga que todo funcione perfectamente.
Otra vez, gracias por contestar y seguire tu blog ya que me esta siendo de una increible ayuda ya que en pocos (o ninguno) se profundiza tanto como en este.
Un saludo
Hola, me gustaria saber como almacenar datos(pulsos) en la memoria de un modem siemens TC65 datos que son leidos atraves de uno de sus puertos.
Gracias
Hola Buenas tardes
sus articulos me an ayudado mucho pero ahora tengo una duda y es la siguiente. tengo un programa java muy sencillo(“Hola mundo”) el IDE de java que estoy usando es Eclipse 3.0 y estoy usando el moden siemens TC65.
cuando trato de ejecutar el algoritmo desde eclipse este me arroja el siguiente error:
Download aborted, because of:
Flash Files System of the module is full or
communication problem to the module or
Module is switched off
me gustaria saber como puedo saber si la memoria del modulo esta llena o no o talvez esto se presente por otra razon ??
Hola Deider respecto a tu problema con el Flash Files System comentaste ya lo solucionaste, me pudieras indicar como lo solucionaste?? ya que yo tengo el mismo problema y no encuentro el motivo.
Gracias
Hola Deider,
respecto a lo de almacenar los pulsos puedes hacerlo, para ello sólo tienes que dar un vistazo a un post que puse sobre el sistema de ficheros:
http://www.blogelectronica.com/ficheros-siemens-xt65-tc65-java-flash/
respecto a lo del error,
¿te funciona el MES? ¿tienes bien configurado el puerto COM con el MES? ¿Tienes el módem configurado con AT+IPR=115200? ¿Utilizas el puerto serie o el USB? ¿Por qué utilizas el Eclipse 3.0? se recomienda el 3.1.2 para la versión 2.0 del TC65 y la 3.2 para el nuevo firmware v3.0.
Salu2
Hola
Gracias por atender mis inquietudes ya logre solucionar ese problema.
pero ahora estoy tratando de realizar una coneccion por tcp/ip para esto me guie del ejemplo que esta arriba.
lo he montado igua que como lo muestran pero al ejecutar este codigo mas esactamente despues que se ejecuta el (AT^SISO=1) .
primero la respuesta a este comando es (OK) pero despues me aparece:
Evento:
^SIS: 1, 0, 23, “An unexpected error occurred”
Evento:
^SISR: 1, 2
y despues de esto aparece:
java.io.IOException: Error sending data, no ongoing data connection
– com.siemen
s.icm.io.ATCommand..unknown.(), bci=0
– com.siemens.icm.io.ATCommand..unknown.()
, bci=4
– com.siemens.icm.io.ATCommand$OutputStreamDataConnection.write(), bci=6
0
– com.siemens.icm.io.ATCommand$OutputStreamDataConnection.write(), bci=5
– Dat
aConnection.escribirSocket(), bci=73
– DataConnection.iniciaConexion(), bci=502
- DataConnection.(), bci=61
– Contador.startApp(), bci=97
– javax.microedi
tion.midlet.Main.run(), bci=3
Datos enviados
Esperando recibir un paquete de datos TCP …
quisiera saber cual es la causa de este error y como podria repararlo.
Muchas gracias.
Hola Deider,
a ver, el ejemplo es un ejemplo muy básico en el que no controlo excepciones. De hecho fíjate que tras el siso hago una pausa de 3 segundos pero no espero al URC que me indique que ya está hecha la conexión y se pueden enviar datos. Ahí está el problema. Seguramente se intentan enviar los datos antes de que la conexión esté establecida. A ver si tengo un rato y durante la semana modifico un poquillo el programa. Por el momento pon una pausa mayor.
Salu2.
OK gracias pero ya aumente los tiempos donde tiene (100) coloque (20000)
y despues de r=ATC.send(“AT^SISO=1\r”) coloque 120000. pero ocurre lo mismo.
espero puedan ayudarme lo antes posible.
muchas gracias.
Otra pregunta que tengo es el comando (AT^SICI=1) me retorna
^SICI: 1,0,0,”0.0.0.0″
OK
¿ no deberia en lugar de “0.0.0.0″ tener una ip valida ???
creo que esto tendria algo que ver…
Que piensan ustedes ??
Hola Deider,
el problema radica que el ejemplo hace la conexión sobre un servidor Web (Google). Si tienes una conexión mucho tiempo abierta (has puesto 120 segundos) osea 2 minutos, el servidor te va a cerrar la conexión (el socket) con toda seguridad.
Después con el parámetro inactTO (que en el ejemplo no aparece y por defecto es 20 segundos) si tienes una conexión GPRS establecida y durante 20 segundos no tienes un socket abierto, ésta se cierra, de ahí que cuando miras el comando AT^sici veas un 0.0.0.0 y no la IP pública que te ha asignado el operador (entiendo que el login, pass, apn … lo tienes bien).
Lo dicho, por el momento pon una pausa, pero hay que controlar el URC que indica que puedes escribir datos. El problema es que ahora estoy en casa y hoy no me he traido un módem con el que modificar y probar la aplicación.
Salu2
Hola,
Esta es la seccion de codigo con la que tengo problemas;
Ahora ajuste los tiempos de otra forma pero obtengo el mismo resultado, no me mustra la ip y ademas imprime la xception de la que he comentado.
porfavor dale una mirada y comentame lo que piensas.
r=ATC.send(“AT^SICS=1,conType,GPRS0\r”);
Thread.sleep(100);
r=ATC.send(“at^sics=1,user,”\r”);
Thread.sleep(100);
r=ATC.send(“at^sics=1,passwd,”\r”);
Thread.sleep(100);
r=ATC.send(“at^sics=1,apn,apnAqui\r”);
Thread.sleep(100);
r=ATC.send(“AT^SICI=1\r”);
Thread.sleep(100);
r=ATC.send(“AT^SISS=1,srvType,socket\r”);
Thread.sleep(100);
r=ATC.send(“AT^SISS=1,conId,1\r”);
Thread.sleep(100);
r=ATC.send(“AT^SISS=1,address,socktcp://” + direccionIP + “:” + puerto + “\r”);
Thread.sleep(100);
r=ATC.send(“AT^SISO=1\r”);
Thread.sleep(10000);
escribirSocket(“GET / HTTP/1.1\r\n\r\n”);
Hola otra pregunta que tengo es:
si el modem nesecita una configuracion previa a la ejecucion de la aplicacion ??
aparte de la aplicacion hay que configurar algo mas en el modem ??
Hola Deider,
¿has probado los ejemplos que he puesto hace poco?
http://www.blogelectronica.com/ejemplos-java-j2me-modem-gprs-siemens/#more-231
en concreto los de TCP?
Por otro lado no pones login y pass en la configuración. ¿No hacen falta para tu operador? Y no, el módem no necesita ninguna config previa salvo quitar el pin.
Salu2
Cual pin ?
Podrias detallar un poco mas lo de quitar el pin ?
Gracias
Otra cosa… yo utilizo los siguientes comandos para configurar el contexto PDP:
at+cgdcont=1,”ip”,
at+cgact=1,1
at+cgatt=1
Falta o sobra algun comando?
Ademas, tambien uso estos comandos para leer una GPIO, ¿eso podria estar bloqueando la conexion ??? (no creo, pero pregunto por si acaso…)
AT^SPIO=0
AT^SPIO=1
AT^SCPIN=1,1,0
AT^SCPOL=1,1
Nuevamente gracias…
Hola nuevamente.
Dices que has ingresado ejemplos nuevos pero consulto el link que me sugieres y no encuentro un ejemplo nuevo, solo los que ya había mirado antes, podría describirme el encabezado del ultimo ejemplo que subió porfavor.
Gracias.
hola Deider,
Deberías leer un poco mas los manuales y los ejemplos espuestos. en ellos te darás cuenta enseguida de la respuesta de tus preguntas.
Recuerda que un foro es una ayuda, desisteresada y por gusto. Esto no es un centro de soporte personalizado.
Salu2
Pua
Excelente blog….
Saludos amigo por tú valioso aporte….
Hola,
Tengo que hacer una conexion con un modem TC65 y me estoy comiendo la cabeza porque no consigo la conexion IP. Ni con los comados “ATD*99***1#”, despues de configurar lo con “+cgdcont” y con “^sics” y los comandos que utilizas como “^sici” y “^sico” no me los reconoce el modem y me devuelve ERROR.
Me podias dar alguna pista?
Gracias
Hola David,
utiliza estos comandos AT:
http://www.matrix.es/videos/demoGPRS_Siemens.htm
Salu2
Saludos, respecto al problema
Flash Files System of the module is full or communication problem to the module or Module is switched off
se me ha presentado en un XT75 y no permite descargar el programa al modulo
no funciona el MES, sin embargo utilizo 115200 para transferecia serial mediante AT+IPR=115200
Tengo NetBeans 6.5 y el firmware es version 1.001, es recomendable recargar el firmware para reparar lo que pudiera estar mal? quiza actualizar a la version 2.0 del XT75?
Que otras pruebas puedo realizar para detectar el problema?
Saludos
Hola Miguel,
al tener AT+IPR=115200 sólo se me ocurre que tengas un programa java corriendo dentro o que tengas algún problema en las líneas de control de flujo del módem (RTS/CTS). Esto último me pasó hace un tiempo y estuve dando vueltas hasta que me di cuenta.
Si todo lo anterior es correcto intenta acceder por el MES por USB. Si no puedes entonces, o estás utilizando una versión NO adecuada para la versión 1.001 del XT o tienes un problema en el módulo. Intenta pues actualizar a la 2.0 del XT65, aunque si haces esto último tienes que utilizar el nuevo MES, el antiguo no va con la 2.0.
Salu2
hola a todos.
Tengo el terminal mtx-65+g version 1.001 , estoy intentando realizar una conexion gprs , pero siempre me sale el mismo error.
Siguiendo el video de ejemplo de conexion , mediante comandos at no se consigue por que sale el error:
AT^SISO?
^SISO: 0, “Socket”,”2″,”1″,”0″,”0″,”0.0.0.0:0″,”0.0.0.0:0″
^SISO: 1, “”
^SISO: 2, “”
^SISO: 3, “”
^SISO: 4, “”
^SISO: 5, “”
^SISO: 6, “”
^SISO: 7, “”
^SISO: 8, “”
^SISO: 9, “”
OK
AT^siso=0
ERROR
AT^siss=0,address,socktcp://81.36.46.127:80
OK
AT^siss=0,conID,0
OK
AT^siss=0,srvType,socket
OK
AT^sics=0,apn,airtelnet.es
OK
AT^sics=0,passwd,vodafone
OK
AT^sics=0,user,vodafone
OK
AT^sics=0,dns1,195.235.30.34
OK
AT^sics=0,inactTO,20
OK
AT^sics=0,conType,GPRS0
OK
y si lo hago mediante httpconnection, del ejemplo tambien, me sale el error:
java.io.IOException: Profile could not be activated
– com.sun.midp.io.j2me.socket.Protocol.openPrim(), bci=94
– com.sun.midp.io.ConnectionBaseAdapter.openPrim(), bci=23
– com.sun.midp.io.ConnectionBaseAdapter.openPrim(), bci=11
– com.sun.midp.io.j2me.http.Protocol.connect(), bci=43
– com.sun.midp.io.j2me.http.Protocol..unknown.(), bci=31
– com.sun.midp.io.j2me.http.Protocol..unknown.(), bci=7
– com.sun.midp.io.j2me.http.Protocol..unknown.(), bci=34
– com.sun.midp.io.j2me.http.Protocol.sendRequest(), bci=3
– com.sun.midp.io.j2me.http.Protocol.getResponseCode(), bci=5
– src.main.descargaHTTP(), bci=113
– src.main.startApp(), bci=11
– javax.microedition.midlet.Main.run(), bci=3
Fin de la aplicacion
Pedimos la página a Google.es
Los ejemplos de tcp y tcp2 tambien me sale este error.
Lo he probado con varias tarjetas de orange, vodafone y movistar en prepago y contrato y siempre me sale los mismos errores.
Lo he probado con dos xt65 distintos y sale tambien los mismos errores
Las tarjetas me permiten conectarme a traves de movil pero no atraves del xt65.
¿Alquien sabe por que sucede esto?¿Hay alguna solución?
Muchas gracias a todos
Hola Ricardo,
dime el resultado de los comandos:
AT+CSQ (para ver si tiene cobertura)
AT+CREG? (para ver si está registrado a la red)
AT&V (para ver el perfil de tu módem)
Y vuelve a hacer todo el proceso que has hecho antes con comandos AT pero especificando el comando AT+CMEE=2 (para ver un error descriptivo, no sólo ERROR, que no da pistas).
Salu2.
hola gracias a todos ya he encontrado el fallo:
el problema era que no le habia enviado el pin
at+cpin
y que la sim estaba bloqueada , me pedia el codigo puk , gracias al comando AT+CMEE=2 pude ver esto
Muchas gracias a todos
y a blogElectronica en especial
Vale ya, ya me he desesperado del todo. Resulta que desde el hyperterminal, si que puedo hacer varios SISW. y recibiendo el URC casi al instante y para colmo, los datos llegan. Pero desde el programa de java no, y eso que he copiado descaradamente los ejemplos. Pero despues del primer SISW ya no llega el URC, y la siguiente llamada a SISW bloquea el terminal. Estoy haciendo esperas de segundos, pongo el \r en cada comando AT, y envio la misma cadena que hay en el ejemplo de este blog ! Pero sucede siempre lo mismo, no lo entiendo, que es lo que puede estar fallando??? llevo dos semanas con esto :C
Hola Lt_Henry,
como es navidad y hay que ser generosos , he dedicado un ratillo de mi primer día de vacaciones a prepararte un ejemplo java que realiza 2 envíos, uno detrás del otro. Lo acabo de probar y funciona correctamente.
Te lo pongo aquí:
http://www.blogelectronica.com/TEMP/EJEMPLO_ConexionTCP3.zip
Te aseguro que funciona, primero envía “Hola” y después “Adios”.
A ver que tal …
Salu2 y felices fiestas.
Mi problema es el siguiente, al establecer una conexión UDP con un servidor (en mi caso uno que proporciona la hora) consigo leer la información pero al intentar cerrar la conexión y continuar con mi programa recibo un escandaloso error de “Ongoing data connection” o “Error sending AT Command, blocking command running”. A alguien le ha pasasado algo parecido?
Hola Pablo,
ese error yo lo he obtenido en alguna ocasión cuando intento enviar datos por un socket antes de haber recibido el URC correspondiente ^SISW: 0,1. Sin ver el programa es difícil saber lo que ocurre.
¿No te iría bien utilizar un servidor de hora por TCP como los que puse aquí?
http://www.blogelectronica.com/hora-java-cinterion-siemens-mtx-tc65-xt65/
Salu2
Es eso lo que intento hacer, al terminar de leer mis cuatro bytes que me dan la hora (desde uno de esos servidores), intento cerrar el socket con “AT^SISC=1″ y el programa se queda bloqueado en esa instrucción.
He estado haciendo multitud de pruebas, y resulta que si comento las instrucciones en las que uso el el InputStream para leer los cuatro bytes, luego puedo cerrar el servicio sin problemas. Es decir, que si uso SISO=1, SISR=1,4 y SISC=1, no se para pero en cuanto uso el InputStream para saber mis 4 bytes de hora, el programa se me para al llegar al SISC. Tiene pinta de que no leo correctamente los 4 bytes o que no hago todo lo que debería hacer. Aquí dejo exactamente lo que hago, y funciona pues leo los 4 bytes, pero luego me bloquea el programa al cerrar el servicio. Alguien ve algo mal??
is=ATCmd.getDataInputStream();
int length= is.available();
byte [ ] bytes = new byte [ length ] ;
is.read(bytes, 0, is.available());
is.close();
Sobre los tiempos de espera, he comprobado que me espero a recibir los SISW y SISR que aparecen al abrir la conexión antes de empezar a leer mis bytes.
Hola Pablo!
Tengo un problema parecido al tuyo.
Estoy utilizando el EJEMPLO_ConexionTCP3 que manda Hola y Adiós. Manda Hola perfectamente pero se me queda bloqueado cuando intenta mandar Adiós. Parece que el tema esta en el cierre del socket.
Por cierto lo resolviste? Alguna ayuda será bienvenida
Salu2
Hola Juan,
quita el autobauding. Configura desde el ASC0 con AT+IPR=115200
Salu2.
Hola!
Efectivamente, tenía puesto el el AT^IPR en autobauding :$ Lo he fijado a 115200 y ya por fin se cierra bien. El problema es que ahora no recibo nada :S
Alguna sujerencia.. Recuerdo que estoy probando simplemente el EJEMPLO_ConexionTCP3
Gracias!
Hola!
Gracias por el programa para quitar el autostart!
He estado leyendo en la documentación de java y creo que el método de la clase DataInputStream, available() no devuelve nunca -1, en el ejemplo que tienes puesto haces un if(is.available()>-1) para ver si hay datos, no debería ser > 0?
Saludos!!
Hola Borja,
tienes razón, gracias, lo corrijo.
Salu2.
Hola!
Tengo un problema con la conexión tcp/ip del ejemplo. Resulta que durante la ejecución del ejemplo he podido observar que al ejecutar at^siso=1 se realiza correctamente arrojándome este resultado:
^SISO: 0, “”
^SISO: 1, “Socket”,”4″,”2″,”0″,”0″,”88.30.150.164:1024″,”80.34.23.149:80″
^SISO: 2, “”
^SISO: 3, “”
^SISO: 4, “”
^SISO: 5, “”
^SISO: 6, “”
^SISO: 7, “”
^SISO: 8, “”
^SISO: 9, “”
OK
Por lo que entiendo que hasta este punto todo funciona correctamente.
Si continua la ejecución se procederá a escribir en el socket haciendo uso del método escribirSocket(string cadena);
Y es aquí donde me devuelve el siguiente error:
Enviado: GET / HTTP/1.1
AT^SISW=1,18,0,0
+CME ERROR: invalid index
FALLO EXCEPCION:Error sending data: No open data connection.
Comentar que “fallo excepción” me canta en el método escribirSocket al producirse el error por la sección de excepción.
¿Sabría alguien decirme porque la operación:
“ATC.send(“AT^SISW=1,” + cadena.length() + “,0,0\r”);”
me devuelve el error “invalid index” o en su defecto a que es debido el que no me funcione el ejemplo?
Gracias de Antemano.
Saludos.
Hola Dani,
los ejemplos son muy simples, demasiado. Creo que los voy a modificar un poco para evitar estos problemas.
No escribas nada en el socket hasta no haber recibido el evento ^SISW: 1, 1 que indica que ya puedes escribir datos en el socket. Lo que te ocurre es porque intentas escribir datos antes de que la conexión esté establecida. Espera al evento que te digo y verás como no sucede. De todas maneras a ver si antes del Lunes modifico el ejemplo.
Salu2
Hola BlogElectronica!
Decias de cambiar el ejemplo para que no escriba nada en el socket hasta no haber recibido el evento ^SISW. El código que aparece arriba está actualizado con esa modificiacion?
Si no, podrías publicarlo por aqui?
Muchas gracias!
Salu2
Hola , tengo un problema con el codigo que me he bajado de la web para conexion tcp ,lo que me pasa es que no me salta el evento de datos recibidos para poder leer lo que me envia google.
este es el codigo , solo he introducido comentarios , seguidamente os pongo lo que me imprime en el entrenador.
//Ejemplo muy b�sico de como enviar y recibir datos por un socket TCP utilizando la clase ATCommand
//Se utiliza el servidor de Google.es y el puerto 80 para esccribir y leer datos.
package src;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import com.siemens.icm.io.ATCommand;
import com.siemens.icm.io.ATCommandFailedException;
import com.siemens.icm.io.ATCommandListener;
public class main extends MIDlet
{
ATCommand ATC;
ATCommandListener LIS;
int hemosRecibidoDatos=0;
protected void startApp() throws MIDletStateChangeException
{
//Inicializamos la clase ATCommand y el Listener
try
{
LIS = new ATListener();
ATC=new ATCommand(false);
ATC.addListener(LIS);
}
catch (IllegalStateException e){e.printStackTrace();}
catch (ATCommandFailedException e) {e.printStackTrace();}
//Iniciamos una conexi�n TCP
iniciaConexion();
}
//Defimos nuestra clase ATListener
class ATListener implements ATCommandListener
{
//S�lo controlaremos un URC en este ejemplo
//y ser� para saber cu�ndo recibimos datos
public void ATEvent(String Event)
{
//Sacamos el evento que se ha producido:
System.out.println(“Evento: “+ Event);
//Y si el URC corresponde a que han llegado datos …
if (Event.indexOf(“SISR”)>0)
{
//Mandamos leer los datos del socket
System.out.println(“Leemos los datos TCP”);
leerSocket();
}
}
public void RINGChanged(boolean Event) {}
public void DCDChanged(boolean Event) {}
public void DSRChanged(boolean Event) {}
public void CONNChanged(boolean Event) {}
}
protected void pauseApp() {}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException
{
notifyDestroyed();
}
//M�todo para conectarnos con el servidor remosto
public void iniciaConexion()
{
//Nos conectaremos a Google )
String direccionIP = “72.14.221.19″;
String puerto = “80″;
String r=”";
System.out.println(“Iniciando secuencia conexi�n GPRS”);
try
{
r=ATC.send(“AT^SICS=1,conType,GPRS0\r”);
Thread.sleep(100);
r=ATC.send(“at^sics=1,user,vodafone\r”);
Thread.sleep(100);
r=ATC.send(“at^sics=1,passwd,vodafone\r”);
Thread.sleep(100);
r=ATC.send(“at^sics=1,apn,airtelnet.es\r”);
Thread.sleep(100);
System.out.println(“Configurando Conexion”);
r=ATC.send(“AT^SICI=1\r”);
Thread.sleep(100);
r=ATC.send(“AT^SISS=1,alphabet,1\r”);
Thread.sleep(100);
r=ATC.send(“AT^SISS=1,srvType,socket\r”);
Thread.sleep(100);
r=ATC.send(“AT^SISS=1,conId,1\r”);
Thread.sleep(100);
r=ATC.send(“AT^SISS=1,address,socktcp://” + direccionIP + “:” + puerto + “\r”);
Thread.sleep(100);
System.out.println(“Abrimos el Socket”);
r=ATC.send(“AT^SISO=1\r”);
System.out.println(r);
Thread.sleep(3000);
r=ATC.send(“AT^SICI=1\r”);
System.out.println(r);
System.out.println(“Enviando datos …”);
//Enviamos una petici�n a Google de la p�gina principal
escribirSocket(“GET / HTTP/1.1\r\n\r\n”);
System.out.println(“Datos enviados”);
//Nos quedamos esperando en un bucle a recibir algo v�a TCP
System.out.println(“Esperando recibir un paquete de datos TCP …”);
while (hemosRecibidoDatos==0);
System.out.println(“Cerramos Socket”);
//Cerramos el socket
r=ATC.send(“AT^SISC=1\r”);
Thread.sleep(100);
//Paramos el programa
destroyApp(true);
}
catch (Exception e){System.out.println(“Error.”);}
}
//M�todo para leer los datos del socket
public void leerSocket()
{
try
{
//Mandamos el comando AT para leer lo que hay en el socket
ATC.send(“AT^SISR=1,1500\r”);
Thread.sleep(1000);
//Asociamos el stream de entrada de datos
InputStream is = ATC.getDataInputStream();
//Y si hay datos disponibles los leemos …
if (is.available() > -1)
{
//Creamos un buffer del tam�o de los datos recibidos
byte[] buffer = new byte[is.available()];
//Leemos los datos y los cargamos en buffer
is.read(buffer, 0, is.available());
//Mostramos los datos por la salida estandar …
System.out.println(new String(buffer));
//Activamos el flag, de esa manera ya no nos quedamos esperando
hemosRecibidoDatos=1;
}
//Gesti�n de las exepciones
}
catch (Exception e) {e.printStackTrace();}
}
//M�todo para escribir datos en el socket
public void escribirSocket(String cadena)
{
OutputStream os;
try
{
System.out.println(“Enviado: ” + cadena);
//Asociamos el stream de salida al de la clase ATCommand
os = ATC.getDataOutputStream();
//Enviamos el comando AT^SISW de env�o
ATC.send(“AT^SISW=1,” + cadena.length() + “,0,0\r”);
Thread.sleep(500);
//Escribimos los datos por el socket
os.write(cadena.getBytes());
Thread.sleep(500);
System.out.println(“ya Enviados”);
}
//Gesti�n de las exepciones
catch (Exception e) {
e.printStackTrace();
System.out.println(“fallo”);
}
}
}
***********
Lo que imprime el entrenador
************
ya Enviados
Datos enviados
Esperando recibir un paquete de datos TCP …
AT^SICI=1
^SICI: 1,2,1,”77.208.178.177″
OK
Enviando datos …
Enviado: GET / HTTP/1.1
Evento:
^SISW: 1, 1
AT^SISO=1
OK
Abrimos el Socket
Configurando Conexion
Iniciando secuencia conexi?n GPRS
Evento: ^SYSSTART
AT^sjra=a:/Ethernet1.jar
Buenas, al igual que en post anterior, en el que utilizando httpconnection, daba el error:
java.io.IOException: Profile could not be activated
- com.sun.midp.io.j2me.socket.Protocol.openPrim(), bci=94
- com.sun.midp.io.ConnectionBaseAdapter.openPrim(), bci=23
- com.sun.midp.io.ConnectionBaseAdapter.openPrim(), bci=11
- com.sun.midp.io.j2me.http.Protocol.connect(), bci=43
- com.sun.midp.io.j2me.http.Protocol..unknown.(), bci=31
- com.sun.midp.io.j2me.http.Protocol..unknown.(), bci=7
- com.sun.midp.io.j2me.http.Protocol..unknown.(), bci=34
- com.sun.midp.io.j2me.http.Protocol.sendRequest(), bci=3
- com.sun.midp.io.j2me.http.Protocol.getResponseCode(), bci=5
- src.main.descargaHTTP(), bci=113
- src.main.startApp(), bci=11
- javax.microedition.midlet.Main.run(), bci=3
y el problema era que no mandaba el pin a la sim, yo arranco mi aplicación y se ejecuta perfectamente, hasta que me lanza el error anterior y se cuelga. ¿Alguien sabe que puede estar pasando?. Lo mismo esta funcionando correctamente, 1 hora, 2 horas, 15 minutos, como le da.
Y la cobertura no lo aseguro al 100% por que no lo compruebo, pero estoy probando en un sitio fijo en donde si hay buena cobertura.
Datos comprobados:
AT+CSQ: 21/22
CGREG: 1,1
CREG: 1,1
Hola Currumbela,
eso te ocurre porque estás abriendo y cerrando servicios http demasiado deprisa y se acaban los servicios de http. ¿Cada cuanto realizas la conexión http? ¿Qué haces tras la conexión o tras un fallo de la misma? ¿Liberas los objetos creados y pasas después el garbage collector System.gc(); ?
Salu2
Hola Blogelectronica, gracias por contestar, ya que estoy un poco perdido.
Como lo anterior me daba problemas lo estoy probando con comandos AT:
Primero creo el perfil de conexion y luego el de servicio.
Como estoy probando, abro el servicio con AT^SISO, y comienzo a enviar tramas cada minuto con AT^SISW, hasta que da ahora otro fallo a la hora y media / 2 horas (+CME ERROR: operation failed).
Al contrario que con httpconnection, no se me queda colgado, pero cada vez que intenta mandar me sale el error y no manda, logicamente.
Pienso que es el operador de telefono me tira la conexion, pero no se como controlar eso.
No, no utilizo el garbaje collector, ya que con httpconnection, no me arregló el problema.
Un saludo Blogelectronica.
Este es el error que me lanza ahora, y como digo, no se queda colgado, pero ya no me manda. Estoy totalmente perdido y ya no se que mas probar….:
AT^SISW=0,132,0,0
+CME ERROR: operation failed
java.io.IOException: Error sending data, no ongoing data connection
- com.siemens.icm.io.ATCommand..unknown.(), bci=0
- com.siemens.icm.io.ATCommand..unknown.(), bci=4
- com.siemens.icm.io.ATCommand$OutputStreamDataConnection.write(), bci=59
- com.siemens.icm.io.ATCommand$OutputStreamDataConnection.write(), bci=5
- src.main.enviarTramaAT(), bci=76
- src.main$Monitor.run(), bci=647
- java.util.TimerThread..unknown.(), bci=215
- java.util.TimerThread.run(), bci=1
Problema solucionado, era tema del servidor. Doy por cerrado este tema.
Respuesta a mi anterior post.
Al parecer los problemas eran dos:
1º la velocidad del modem estaba configurada a automatica AT+IPR=0 y hay que ponerla a 115200 AT+IPR=115200
2º el tiempo de espera despues de el at siso debe ser mayor aprox 6000
Si no recuerdo mal el tiempo de espera tras el AT^SISO estaba pues en 3000, verdad?
¿ Alguien ha echo alguna ver un programa con un socket servidor ? ¿ es decir que admita conexiones entrantes ?
Un saludo
Hola Antonio,
yo estoy intentando hacer justamente eso, pero no me acaba de funcionar. Desde el hyperterminal sí que he conseguido lanzar el servidor y conectarme desde fuera, pero desde el programa java con los mismos comandos at no me funciona, da error y todavía no sé por qué
De momento estoy intentando con esto:
AT^SICS=0,conType,GPRS0
AT^SICS=0,user,movistar
AT^SICS=0,passwd,movistar
AT^SICS=0,apn,movistar.es
AT^SICI=0
AT^SISS=0,alphabet,1
AT^SISS=0,srvType,socket
AT^SISS=0,conId,0
AT^SISS=0,address,socktcp://listener:8080
AT^SISO=0
AT^SICI?
¿tu has conseguido que funcione desde java?
SilviaC,
qué error te da? es complicado si no lo indicas. “Da error” es muy genérico.
Configura el módem con AT+CMEE=2 para obtener errores descriptivos.
Asegúrate que la tarjeta no tiene PIN.
Creo que el login y password de movistar son en mayúsculas, no se si afectará.
Desde java un listener funciona perfectamente. Yo lo utilizo bastante a menudo.
Salu2.
Hola Silvia , acabo de consegirlo , si me comentaas que te ocurre a lo mejor te puedo ayudar .
Hola de nuevo. Muchas gracias José y Antonio por las respuestas.
Lo de movistar con mayúsculas o minúsculas debe ser indiferente porque se conecta.
Me he dado cuenta que el problema no es del listener, que el listener efectivamente estaba funcionando y por eso no veía el error. El problema es que le costaba cerca de 4 minutos desde que lanzaba el cliente php hasta que le llegaba el evento al ATlistner, y tenía el cliente un tiempo de espera máximo de 2 minutos. Al cabo de 2 minutos como aun no había podido conectar se cerraba. No sé aun la razón por la que le costaba tanto, si es que tenía justo en la mesa menos cobertura o si esque estaba la antena algo suelta, si era algo mal configurado o qué pasaba, el caso es que he revisado todo y ahora ya va con tiempos más razonables. A veces lo más tonto es la solución :p
Ahora a seguir con el el programita. Saludos y gracias!
Hola a todos, a ver si alguien me puede echar una mano.
Estoy haciendo un programa para el MTX65 en el que cada x segundos envío unos datos por GPRS. Mi problema es que en unas ocasiones realiza el envío perfectamente y en otras al abrir el socket me sale el siguiente error:
AT^SISO=1
+CME ERROR: network is down
No sé por qué me sucede esto, ya que puede que a la siguiente vez (o después de varios intentos) que intente abrir el socket me haga el envío correctamente. En donde está el MTX65 y con la antena GPRS no debería haber problemas de cobertura, por lo que pienso que por eso no es, y creo que la apertura y el cierre de sockets lo realizo bien. Alguien me puede ayudar?
El error es claro Pablo, no se si tendras cobertura o no, pero no estas conectado a red. Ponle un AT+CREG o CGREG a ver que te devuelve.
Hola Pablo,
pues tendrás que comprobar el estado de la red, no sea un problema puntual del operador. Cuando ocurra eso comprueba:
at+creg?
at+csq
at+cops?
Intenta poner una pausa entre envíos de comandos AT, es posible que cierres y abras sockets a demasiada velocidad.
Salu2.
Gracias por vuestras respuestas chicos. Ejecutando los comandos que me decís después del error las respuestas son las siguientes:
AT^SISO=1
+CME ERROR: network is down
AT+CREG?
+CREG: 0,1
OK
AT+CSQ
+CSQ: 12,0
OK
AT+COPS?
+COPS: 0,0,”movistar”
OK
Parece que no hay nada incorrecto no? Lo he intentado dejando un delay mayor entre comandos y me sigue pasando.
Pablo,
tienes una cobertura muy bajita, en el límite de lo aceptable. ¿No tienes posibilidad de hacer una prueba en un lugar de mayor cobertura o utilizar una antena de mayor ganancia?
Tengo una duda sobre la conexión GPRS, y la expongo aquí, para ver si alguien lo sabe y me puede ayudar.
Creo el perfil de conexión y el de servicio, abro con AT^SISO, y despues escribo con
os.write y os.close, pero no cierro nunca (AT^SISC).
Hoy he probado durante 6 horas y todo perfecto, sin errores ni colgarse.
1. ¿Es “obligatorio” abrir y cerrar?
2. Al no cerrarlo ¿que puede llegar a ocurrir?
Lo que yo pienso, es que puede que la operadora me “eche”, aunque hoy durante 6 horas no me ha pasado, y si es así como me entero, o cual es la forma de proceder?. ¿Tengo que volver a crear los perfiles de conexion y servicio?
Un saludo a todos los foreros que nos peleamos (en el buen sentido de la palabra), con los MTX.
Hola Currumblera,
no pasa nada si tienes tráfico por el socket. De hecho si envías datos a menudo es mucho mejor hacer lo que haces que andar abriendo y cerrando sockets continuamente, con el riesgo de agotar recursos además de consumir más tráfico IP.
Si no tienes mucho tráfico te puede ocurrir que la operadora te “eche” como dices. Lo peor es que no te vas a enterar si estás en modo server, ya que el operador (aunque lo niegue) bloquea la sesión ppp. Si estás en modo cliente es más fácil, pq al cabo de unos minutos te saltará una excepción al enviar datos o puedes comprobar los datos que se han enviado correctamente, y si no se envían correctamente al cabo de X tiempo, puedes reiniciar tu la sesión.
Si no envías datos a menudo y quieres mantener el socket abierto lo mejor que puedes hacer es hacerte un ping a ti mismo cada X minutos (suelo usar 30 minutos), es decir, a la IP pública que te ha dado el operador. Eso genera un ligero tráfico que hará que el operador no te “eche” y en caso de “echarte” lo detectarás porque no recibirás respuesta a tu propio ping.
Salu2
Gracias por tu respuesta!!Así es Blogelectrónica, mando cada minuto, unos 135 bytes, mi MTX está en modo cliente mandando los datos al listener. A veces me pasaba que ma salía la excepción que comentas, y el MTX no se colgaba, pero a la hora de mandar los datos me daba la excepción una y otra vez.
Te quería hacer otra pregunta. ¿como puedo capturar los eventos del tipo +CME ERROR: network is down? ¿no son URC´s? Es que capturo (gracias a tus ejemplos, jeje) cualquier URC que he probado (tipo ^SCCNT, ^SISW, en fin cualquiera), pero los +CME no, y tampoco he visto ningun ejemplo por ahi.
Por cierto, en tu ejemplo “Ejemplo_Conexion_TCP3″, en el que haces la gestión del ^SISW= 0,1 (para poder enviar datos), utilizas un while(puedoenviardatos==false), y en mi programa me hacía unas cosas rarísimas o no me funcionaba, y lo he solucionado poniendo 2 llaves al final. No entiendo muy bien la diferencia, pero lo posteo por si es de interés para alguien.
((puedoenviardatos==false){}).
Gracias de nuevo por tu tiempo.
Hola currumbela,
no, no se puede capturar esos eventos, sólo los URC (^… )
Gracias por lo del ejemplo, le daré un ojo.
Salu2
saludos.
primero felicitarte y agradecerte por tu blog, soy nueva en esto y necesito saber si ¿¿¿¿es posible simular mis programas java de eclipse para el xt75, sin tener conectado el modem a la PC???, repito solo simularlo para ver su ejecucion, gracias
Hola Amand,
no conozco ninguna aplicación para debugar la aplicación sin el equipo, lo siento.
Salu2
Hola,
Me preguntaba si se puede intercalar la clase socket de java con comandos AT para gestion de sockets. He intentado lo siguiente:
//Abrimos la conexión al servidor
sk =(SocketConnection)
Connector.open( “socket://”+ Socket+
“bearer_type=GPRS;”+
“access_point=movistar.es;”+
“username=movistar;”+
“password=movistar”);
r=ATC.send(“AT^SISO=0?\r”);
System.out.println(r);
He probado con varios perfiles (AT^SISO=1,2,3…) y me da siempre error. Supongo que estoy haciendo una locura
Salu2
Hola Juan,
o sockets de java o comandos AT, las 2 cosas a la vez, no es buena idea.
Salu2.
Hola , os comento una cosita a ver si me podeis ayudar.
para no liarnos os lo voy a explicacar como si lo hicieramos en el entrenador.
he conseguido crear un socket servidor al cual se conecta desde internet y realiza peticiones de datos y el equipo responde .
lo que quiero hacer ahora es que cada cierto tiempo mi equipo se conecte a una direccion ip concreta y le envie unos datos.
asi que el tema quedaria con un socket servidor recibiendo y enviando datos
y un socket cliente enviando datos.
esto como se hace ,¿ hay que compartir el perfil de conexion ? para los dos sockets
o hay que crear un perfil para cada socket ?
gracias.
Hola , necesito hacer un programa que tiene 2 sockets simultaneos , uno servidor y otro cliente , ¿tienen que compartir el mismo perfil de conexion ? o ¿ hay que configurar uno para cada uno ? .
gracias
Hola Antonio,
efectivamente necesitas un solo perfil de conexión, el mismo para ambos sockets y 2 perfiles de servicio, uno para cada socket, uno como cliente y otro como servidor. Es muy sencillo. Pruébalo con el entrenador y te darás cuenta.
Salu2.
Hola blogElectronica!
Tengo dos problemillas
El primero haber si me sabrías decir porque ocurre. Estoy enviando en un bucle infinito datos al servidor. Cada vez que envío datos lo hago con “AT^SISO=0″ y despues de enviado cierro con “AT^SISC=0″. El tema que ocurre es que el módem empieza bien pero con el tiempo comienza a tardar en enviar datos hasta que deja de enviarlos. ¿Puede ser que esté saturando las comunicaciones al abrir y cerrar las conexiones muy rápido?
Lo segundo es que me sale el error Ongoing Data connection. Y tengo dudas de porque lo estoy recibiendo. No tengo claro si es porque estoy intentando abrir una conexión con at^siso=1, y puede ser que el programa que se ejecuta no haya cerrado otra comunicacion que tambien hago en paralelo con at^siso=0. En teoría lo tengo preparado para que no se solapen pero puede ser que sea eso.
En definitiva, para no liar ¿sabrías decirme porque se produce esta excepción?
Muchisimas gracias, por este mágnifico blog. La verdad es que he aprendido mucho desde que lo sigo. Un saludo!
Hola Dani,
1) por supuestísimo. Es algo habitual. No se debe cerrar y abrir las conexiones de forma muy rápida. Es prefereible para este tipo de comunicaciones rápidas mantener el socket abierto. Verás como desaparece el problema.
2) Eso es porque no esperas tras el SISO=1 el evento ^SIS: 1,1 que indica que tienes el socket listo para transmitir. Estás intentando transmitir antes de que el socket esté listo para ello.
Salu2
Pregunta Tonta .
¿ Como se hace para conectarse a una url en vez de a una ip ?
es decir conectarme a http://www.google.es y no a 172.64.12.12
ademas de configurar las DNS
gracias
Hola Antonio,
no es pregunta tonta. Si te refieres conectarte a una DNS tal como servidor.midominio.com simplemente substituye la dirección IP por la dns, tal y como lo harías con una IP.
Me refiero a algo así:
AT^siss=0,address,socktcp://bcn.midominio.com:20010
Si lo que quieres es “bajarte una web” necesitas utilizar un perfil de servicio (AT^SISS) http, no socket.
Salu2.
lo que quiero es barjarme una web , bueno mejor dicho autentificarme en una web para poder poner la ip del modem en el dyndns , con el explorador lo hago de la siguiente forma:
escribo en el explorador
http://username:password@members.dyndns.org/nic/update?hostname=elygprs.selfip.net&myip=192.168.1.1&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG
y el me responde con una web donde dice si ha podido cambiar la ip.
me puedes explicar como bajarme la web como me comentas ??
gracias
Hola Antonio,
como te digo antes tienes que configurar el perfil de servicio http. Dale un vistazo al manual de comandos AT a ese comando que te digo. Si estás mirando el manual del TC65i, dale un vistazo a la página 273.
Salu2.
he conseguido leer paginas normales , pero al intentar entrar en una pagina con usuario y password me dice que no estoy autentificado.
para ello he visto que se podia poner un password y un usuario.
en http service existe un parametro llamado password y otro llamado user .
el user me permite introducirlo , pero al introducir el password da error.
¿porque no me permite introducirle el password?
saludos
Hola,
Entiendo estás utilizando la pila IP con comandos AT. Comprueba qye todos los caracteres que estás usando son correctos. Es decir el alfabeto ASCII no coresponde con el alfabeto GSM. Seguramente tu password tiene uno de esos caracteres y por eso te da error. El tipico ejemplo es la @, la codificación en GSM no tiene nada que ver con las ASCII.
En todos los manuales de Cinterion tienes el alfabeto GSM en las ultimas páginas del manual de comandos AT, en la primeras hay ejemplos de algunos caracteres y de como se introducen en la cadena a usar.
Salu2
Pua
Os cuento mi problema a ver si me podeis ayudar.
Estoy intentando entrar en una pagina con autenticacion desde el modem , la pagina en concreto es la de dyndns para poder utilizar el dns dinamico y poder acceder al modem independientemente de cual sera su direccion ip.
cuando intento entrar en la pagina añadiendoles el usuario y el password me da este error
^SIS: 0, 0, 204, “HTTP-ERR: No access to this URL allowed”
^SIS: 0, 0, 2201, “HTTP/1.1 401 Authorization Required”
¿ alguien me puede ayudar ?
Parece que es un problema de que la autenticacion hay que hacerla codificando el usuario y el password en base64 , que no se lo que es ni como se hace , cuando consiga hacerla no se como enviarsela al modem.
Os paso las pruebas que he echo con el configurador , como sabeis el configurador las imprime de abajo hacia arriba , por lo tanto la primera instruccion es la ultima:
^SIS: 0, 0, 204, “HTTP-ERR: No access to this URL allowed”
^SIS: 0, 0, 2201, “HTTP/1.1 401 Authorization Required”
OK
AT^siso=0
AT^siss=0,hcMethod,0
OK
AT^sisc=0
OK
^SIS: 0, 0, 204, “HTTP-ERR: No access to this URL allowed”
^SIS: 0, 0, 2201, “HTTP/1.1 401 Authorization Required”
OK
AT^siso=0
AT^siss=0,hcMethod,1
OK
AT^sisc=0
OK
^SIS: 0, 0, 204, “HTTP-ERR: No access to this URL allowed”
^SIS: 0, 0, 2201, “HTTP/1.1 401 Authorization Required”
OK
AT^siso=0
AT^siss=0,user,elygprs
OK
AT^siss=0,passwd,clavedyndns
OK
AT^siss=0,address,http://members.dyndns.org/nic/update?hostname=elygprs.selfip.net&myip=192.168.1.1&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG
OK
AT^sisc=0
OK
AT^siss=0,address,http://members.dyndns.org/nic/update?hostname=elygprs.selfip.net&myip=192.168.1.1&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG
ERROR
OK
^SIS: 0, 0, 23, “An unexpected error occurred”
AT^siso=0
AT^siss=0,address,http://elygprs:clavedyndns@members.dyndns.org/nic/update?hostname=elygprs.selfip.net&myip=192.168.1.1&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG
OK
AT^siss=0,conID,0
OK
AT^siss=0,srvType,http
OK
Hola Antonio, lo he probado con 2 servidores y no he tenido problema alguno. En concreto te pongo aquí la conexión que he hecho con un servidor HTTP que he puesto en mi PC (puedes usar uno gratuito: http://www.rejetto.com/hfs/?f=d)
Intenta utilizar este servidor que te paso en local para hacer las pruebas y saber si tu problema viene por la conexión gprs o la http.
AT^siss=0,user,admin
OK
AT^siss=0,passwd,jose
OK
AT^siss=0,hcAuth,1
OK
AT^siss=0,address,http://213.96.77.238:20010/index.html
OK
AT^siso=0
OK
^SIS: 0, 0, 2200, “HTTP Redirect to:213.96.77.238:20010/index.html”
^SIS: 0, 0, 2201, “HTTP/1.1 401 Unauthorized”
^SISR: 0, 1
^SIS: 0, 0, 2201, “HTTP/1.1 200 OK”
^SISR: 0, 2
AT^sisr=0,1500
^SISR: 0, 41
privado
OK
Recuerda en que en el manual de comandos AT, página 273:
“Currently only HTTP
simple authentication is supported.”
No sé el mecanismo de autenticación que usan los de Dyndns …
Salu2
Muchisimas garcias , ya me funciona , el problema era que yo no ponia el AT^siss=0,hcAuth,1 y claro el modem no se autenticaba aunque tuviera puesto el pass y el usuario , otro problema es que en la documentacion pone passsword y es passwd
un saludo
hola al momento de compilar el codigo java me salen estos errores
Conexion.java:183: cannot resolve symbol
symbol : class ATCommandFailedException
location: class src.Conexion
catch (ATCommandFailedException e) {e.printStackTrace();}
^
16 errors
Hola Jesus,
¿has hecho el import de:
import com.siemens.icm.io.ATCommandFailedException;
al inicio de tu programa?
Salu2
si si lo eh echo justo como esta en el blog…..
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import com.siemens.icm.io.ATCommand;
import com.siemens.icm.io.ATCommandFailedException;
import com.siemens.icm.io.ATCommandListener;
gracias por contestar
Muy buenas, de antemano tengo que decir que soy un profano en estos temas y pido perdón si digo alguna tontería o sencillamente estos temas no se tratan en este blog.
Soy taxista y en nuestra flota de vehículos llevamos el modem SIEMENS TC65T para la comunicación con nuestra Central, tenemos clientes que nos piden taxis constantemente y para agilizar su trabajo y no estar llamando a nuestra Central cada vez que necesitan uno, quieren que les instalemos algún dispositivo de manera que simplemente con accionar un pulsador, avise a nuestra Central que el cliente solicita un taxi.
A mi se me ocurre utilizar uno de estos modem, metiendo el modem, un alimentador de modem y un pulsador en una caja e instalarlo en el cliente, mi duda es si esto se puede hacer y que señales del modem tendría que utilizar para conectar el pulsador.
Gracias de Antemano.
Hola Juan Carlos,
eso es muy sencillo de hacer, basta con utilizar uno de los GPIOs que dispone el TC65T en su conector lateral. Puedes utilizar cualquier GPIO, aunque necesitarás conectar en el pulsador una resistencia de pull-up.
Después necesitarás hacer un pequeño programa en java y embeberlo en los módems para que, cuando se detente el pulsador haga algo. Ya sea enviar un SMS o realizar una llamada perdida o establecer una conexión GPRS con un programilla que tengas en la central y que muestre en pantalla que un determinado módem (cliente) ha activado el pulsador.
Si necesitas ayuda (a nivel profesional) en cuanto a la aplicación java dímelo, tengo cosas medio hechas, también para la aplicación del PC (el que generaría el aviso en pantalla).
Salu2.
Muchas gracias por tu respuesta.
Ya que se puede hacer el avisador de taxi voy a ponerme con ello, pero antes de nada necesito documentarme sobre estos temas ya que no tengo ni idea.
Todo lo que me puedas enviar a mi dirección de correo electronico sobre aplicaciones, tutoriales etc. me será de gran ayuda.
Gracias y hasta pronto.
Gente, hice una aplicacion que tramite cada aproximada 45 sgundos a un servlet, y me tira el error de Profile Could not be Activated, alguien tiene una repsuesta certera a cual es el problema de esto?.
Anda bien un rato y depsues de un par de horas empieza a tirar eso.
O ahora el caso que tengo es que las dos primeras conexiones las envia bien, pero a la tercera ya queda tildada y siempre que intenta transmitir cada 45 segundo me tira profile can not be activated alguien sabe que puede ser?
Hola Luciano,
eso es que se te ha cerrado la conexión o que estás cerrando y abriendo sockets muy deprisa. Ahora no tengo el manual aquí pero creo recordar que lo aconsejable para ir abriendo y cerrando sockets era 1 minuto como mínimo.
Salu2.
Hola amigos. Antes de nada gracias por este útil blog electrónico.
No ando muy puesto en el tem pero estoy practicando con este modem y lo que quiero es que tres vehiculos los teng ubicados en el Google Earth, de manera que cuando interrogue al modem éste me pase la ubicación en ese instante, y que cuando le solicite una ruta, éste me envíe la trama de coordenadas que ha ido almacenando cad x tiempo.
Mi proncipl poble es que no consigo saber como hacer que esas coordenadas se posicionen en el Google Earth. ¿Alguna sugerencia?
Muchisimas gracias.
Hola Argus,
pues en el Google Earth no se como hacerlo. Con google maps tienes una API para programadores con cientos de ejemplos que lo explica perfectamente.
Busca: API google maps
Salu2
Hola,
Llevo varios meses trabajando con el modem MTX63. Estamos trabajando en una aplicación transmisora, que consiste en un programa en C que hemos volcado a un micro con el AVR Studio. Utilizamos el modem MTX63 para comunicarnos con una aplicación receptora.
La conexion puedo realizarla directamente a través del entrenador de Siemens, y también a través del terminal. Sin embargo, cuando ejecuto la aplicación transmisora, no consigo conectarme. Me he asegurado, a través de un software como Docklight, de que los comandos que envia la placa con el micro son idénticos a lo que envío en el entrenador de Siemens.
¿Qué es lo que puede estar pasando? El módem se pone enseguida en modo “idle”, lo q veo con el LED, ¿acaso es necesario enviar en algún momento un comando para despertarlo, comando que mandara automáticamente el entrenador y que de no hacerlo ignorara el resto? He probado con lapsos grandes de tiempo para que ello no suponga inconveniente.
Lo más desconcertante del tema es que reproduzco tal cual los comandos que envío en el entrenador (o en el hiperterminal) y no es capaz de conectarse. La captura de datos con el Docklight la hago a través de un puerto serie. Por tanto, se supone que si lo conecto al módem, le va a llegar lo que muestra el Docklight! Es necesaria alguna accion para que el modem interprete todo lo que le llega como comandos?
Muchas gracias por la ayuda desinteresada que nos brindas.
Un saludo
Hola Antonio,
si envías lo mismo que el entrenador debe funcionar. Estaría bien que nos envíes unas trazas de los comandos que envías (Y DE LAS RESPUESTAS DEL MÓDEM).
Por cierto, típico error es unir el pin TX de un micro con el RX del módem y el RX del micro con el TX del módem. Un módem es un equipo DTE y el pin RX de un módem es el pin de transmisión y el TX el de recepción del módem. Ojo tus problemas no vayan por ahí. Debes unir TX con TX y RX con RX.
Salu2.
Muchas gracias por contestar.
Sigo atascado, ya que no logro hacer funcionar la placa transmisora. Con el Docklight obtengo los siguientes comandos:
AT
AT+CBST=0
AT+IPR=9600
AT&C2
AT^SCFG=Tcp/WithURCs,off
AT^SISC=1 (aunque no sea necesario la primera vez, hay que tratar de cerrar la conexión en caso de que se quede abierta, para que no de error en caso de volver a intentar abrirla).
En caso de que no hubiera ninguna abierta, da error sin más, pero esto no supone inconveniente.
AT^SICC=0
AT^SICS=0,conType,GPRS0
AT^SICS=0,inacTO,65535
AT^SICS=0,dns1,194.179.1.100 (dns de movistar, al menos, uno de ellos)
AT^SICS=0,user,MOVISTAR
AT^SICS=0,passwd,MOVISTAR
AT^SICS=0,apn,”xxxxxxx.movistar.es” (tenemos un apn específico para disponer de una IP fija)
AT^SISS=1,srvType,socket
AT^SISS=1,conId,0
AT^SISS=1,address,”socktcp://xxx.xxx.xxx.xxx:38001″
Con esto, conecto perfectamente con el entrenador. No puedo ver las respuestas del módem, porque estoy utilizando el Docklight y no sé si me es posible con el hardware que tengo.
La conexión entre el puerto serie de la placa y el del módem, lo he probado en principio mediante “Software FLow Control”, o sea, sólo Rx con Rx, Tx con Tx y GND con GND.
También he probado Hardware Flow COntrol (o sea, con un cable serie-serie DB9 – DB25 – DB25 – DB9). Me falta probar con un cable serie macho – macho 9 pin a 9 pin (aunque el cable serie que he probado debería valer igualmente).
A parte de esto, no sé exactamente qué podría probar. Porque creo que a la salida de la tarjeta llegan los comandos seguro, y a partir del ordenador, llegan al módem (tanto con el entrenador como con el hiperterminal). Así que la conclusión es que existe algún problema de hardware, o es que hay que programar algo particular en los registros del Atmega? Ya están programados aquellos relacionados con la velocidad, los pines entrada / salida de cada puerto, etc.
Alguna sugerencia ??
Muchas gracias
Hola Antonio,
sin estar delante del equipo es muy difícil. Si yo estuviera en tu lugar lo primero que intentaría es comunicarme desde el PC con la placa (prescindiendo del módem) para ver que no tengo ningún problema en el puerto y que tengo claro todas las conexiones.
Una vez conseguido eso probaría el módem.
También, lo he dado por supuesto, supongo que la placa de tu micro tiene una salida RS232 y no una simple uarth TTL, ya sabes que los niveles RS232 no son los mismos que TTL. ¿Es RS232 verdad? Asegúrate lo primero de todo.
Salu2.
¿De qué manera puedo comunicarme desde el PC con la placa? Con el DOcklight, ya estoy viendo los comandos que manda la placa. Los comandos de respuesta del módem, son el “OK”, etc, o sea, los mismos que se reciben a través del terminal o del entrenador, ¿no? Puede ser útil, desde luego. Los comandos ya los recibo con el Docklight, además también he comprobado que le llegan al módem. ¿Qué más podría probar?
La placa de mi micro efectivamente tiene un RS232 y las conexiones parece que están bien. Me inclino a pensar que el problema podría estar en alguna línea de control (DCD, DTR) que sea necesaria para el módem y no para el PC, aunque este módem debería funcionar únicamente con control de software (GND, TX, RX), con lo cual, tampoco tiene mucha lógica.
¿Es posible que el módem tenga parte del hardware defectuoso e interprete bien lo que le llega a través del PC (entrenador, hiperterminal), pero no a través de la placa? O si le llegan los comandos por el PC y es capaz de reconocerlos, por la placa también deben de llegarle imperativamente?
Muchas gracias de nuevo!
Hola,
Compueba los comand AT&D y AT&C de acorde a los requerimientos de tu máquina y programa.
Tambien te recomiendo que fijes la velocidad del puerto serie del modem con el comando AT+IPR=Velocidad
Salu2
Pua
Hola,
Gracias Púa por tu contribución. Esos parámetros creo que ya los configuré y de hecho los envío siempre, así que no creo que el problema sea ese.
Tengo novedades al respecto. En realidad, la tarjeta transmisora está enviando, después de cada comando, un “00″ espúreo que parece ser la causa del problema. El salto de carro lo incluyo yo en los comandos con \r, pero ese “00″ no consta en el software.
O sea:
AT+CBST=0 (CR) (00)
AT+IPR=9600 (CR) (00)
Ese (00) es el que me está complicando la vida. Estoy usando un ATmega 128, es posible que algún registro deba ser configurado para que no envíe ningún separador entre comandos?
Gracias una vez más.
Hola Antonio,
debes enviar un \r\n no sólo un \r. El 00 ese no creo que afecte (no estoy seguro).
Salu2.
He probado tanto con \r\n como con \r y en ninguno de los casos funciona. He comprobado que el entrenador sólo envía (CR) de hecho, después de un comando.
Ahora sí puedo ver las respuestas del módem cuando uso el entrenador. Con este (00), el módem no responde a los comandos, y eso que he cambiado la instrucción (Tcp/WithURCs, ON).
Hola Antonio,
el entrenador envía \r\n después de cada comando, te lo digo con conocimiento, porque el entrenador lo he hecho yo.
Salu2
De acuerdo
Te mostrare de todos modos los comandos que se capturan, a ver si los puedes interpretar.
Buenas tardes,
Tengo un pequeño problema al cerrar sockets y esperaba que alguien de aquí me pudiese prestar algo de ayuda.
En mi aplicación abro socket como listener que al parecer funciona prerfectamente, y después otro socket, pero este smtp.
Al terminar de enviar datos y toda la parafernalia intento cerrarlos con AT^SISC, el comando devuelve OK pero al ver el listado esto es lo que obtengo:
AT^SISO?
^SISO: 0, “Socket”,”2″,”1″,”0″,”0″,”0.0.0.0:0″,”0.0.0.0:0″
^SISO: 1, “Socket”,”2″,”1″,”0″,”0″,”0.0.0.0:0″,”0.0.0.0:0″
^SISO: 2, “Smtp”,”2″,”1″,”0″,”0″,”0.0.0.0:0″,”0.0.0.0:0″
Mi problema es que al recibir otra conexión esta lo hace en una conexión nueva (^SIS: 0, 1, 3) en lugar de llegar una conexión en la id de la que ya había cerrado (^SIS: 0, 1, 1). Con lo cual, a partir de la quinta vez, ya no acepta más conexiones.
Yo supongo que el problema es el modo en que los estoy abriendo o cerrando, pero ya me empiezo a marear y creo que una manita me vendría muy bien.
Saludos,
Hola Shintarillo,
debes enviar un comando del tipo
AT^SISS=X,srvType,none (donde X es el nº de socket que quieres cerrar)
después de hacer el AT^SISC=X
Así de fácil.
Salu2.
Perfecto, muchas gracias
HOla
busco una forma de hacer lo siguiente:
Tengo un equipo remoto con un modem 3g o gprs conectado. El modem estará registrado en la red (como movil) pero no quiero que este consumiendo datos, vamos, que esté dormido.
entonces, si yo me quiero conectar bajo demanda a ese equipo de forma remota, necesito que el módem remoto se despierte y habra una conexión GPRS/3g.
Yo habia pensado en remoto, hacer una llamada al numero del modem 3g, que este cuelgue y levante una conexión gprs sobre mi equipo local y entonces poder conectarme a ese equipo y ver datos carpetas etc..
¿Es esto factible? ¿Como se podría hacer? ¿Hay forma de hacerlo a través de ocmandos AT?
MUCHAS GRACIAS
Hola David,
es muy simple con un MTX65, pero necesitas programar una pequeña aplicación. Haz una aplicación que lea el puerto serie del módem, cuando reciba el texto “RING” cuelgue (comando ATH) y lanza un acceso telefónico a redes (busca ejemplos por la red, que los hay), así de fácil.
Salu2.
Hola,
no tendras un ejemplillo o link por ahi no??
Hola,
cuidadito con este procedimiento de colgar cuando recibes el RING.
Mi operador me ha activado el buzon de voz cuando no acpeto la llamada ATH, al llamante le salta mi buzon de voz.
Segundo punto, mi operador me esta cobrando el establecimiento de llamada al originanate cada vez que no acepto la llamada ATH
Salu2
Pua
Hola, espero que alguien me pueda ayudar, tengo problemas en la comunicacion, estoy utilizacion conexion gprs la cual tengo permanentemente abierta y enviando datos cada 5 minuto, el problema se presenta cuando dejo de transmitir por mas de una hora los datos, cuando se retoma nuevamente el envio de datos, el socket server, ya no recibe nada, pero al verificar si aun esta conectado el modem, veo que si lo está.
No se que está sucediendo.
El programa que controla las comunicaciones está en un microcontrolador de freescale, el modem es un wismo 228. este modem envia y recibes datos desde y hacia el socket que esta en un servidor que tiene una ip publica.
saludos
Hola Edu,
ese es un problema habitual trabajando con los operadores GSM. Te recomiendo que hagas un PING periódico cada 30 minutos a una determinada IP. Si no recibes respuesta reinicia la sesión GPRS. Si usas un módem Cinterion ó MTX en vez de un feo wismo puedes usar el comando AT^SISX para el ping.
Salu2!!!
Jose