En 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).

modem-gprs

¿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:

  1. Conexión CSD a módulo GSM desde módem analógico Aunque cada vez es más frecuente el uso de comunicaciones...
  2. Cómo usar ficheros con módems de Siemens desde Java. Como seguro ya sabéis, varios de los modelos de módems...
  3. Añadir datos a ficheros con módems Siemens-Cinterion desde java En bastantes ocasiones me ha llegado la pregunta de cómo...
  4. 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...
  5. Cómo utilizar el Watchdog del módem GPRS Siemens TC65 Hace muy poquito salió la versión firmware 3.0 del módem...








149 Respuestas a “Modem GPRS Siemens. Gestión de una conexión TCP/IP desde Java.”
  1. kriyeng dice:

    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!

  2. blogElectronica dice:

    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.

  3. kriyeng dice:

    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

  4. kriyeng dice:

    Solo comentar que ya dispongo del CD de instalación,

    Muchas gracias,
    Saludos.

  5. Fran dice:

    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.

  6. blogElectronica dice:

    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.

  7. Fran dice:

    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.

  8. Isaac dice:

    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????

  9. david dice:

    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).

  10. Pua dice:

    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

  11. Gustavo dice:

    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

  12. blogElectronica dice:

    Isaac,

    tienes un ejemplo de cómo hacer eso con comandos AT aquí:
    http://www.matrix.es/videos/demoGPRS_Siemens.htm

    Salu2.

  13. blogElectronica dice:

    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

  14. Benito Ruiz dice:

    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

  15. blogElectronica dice:

    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

  16. Renzo dice:

    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

  17. blogElectronica dice:

    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.

  18. Renzo dice:

    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

  19. blogElectronica dice:

    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.

  20. Renzo dice:

    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

  21. blogElectronica dice:

    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

  22. Renzo dice:

    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

  23. Dani dice:

    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.

  24. Dani dice:

    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.

  25. blogElectronica dice:

    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

  26. Isaac dice:

    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

  27. blogElectronica dice:

    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.

  28. arlukas dice:

    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?

  29. blogElectronica dice:

    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.

  30. Arlukas dice:

    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.

  31. David dice:

    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

  32. blogElectronica dice:

    David,

    tienes los comandos escritos en este mismo post, en el ejemplo en java que además está bastante bien comentado.

    Salu2

  33. David dice:

    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.

  34. blogElectronica dice:

    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

  35. Javier dice:

    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

  36. blogElectronica dice:

    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

  37. Javier dice:

    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

  38. Deider dice:

    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

  39. Deider dice:

    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 ??

  40. blogElectronica dice:

    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

  41. Deider dice:

    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.

  42. blogElectronica dice:

    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.

  43. Deider dice:

    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.

  44. Deider dice:

    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 ??

  45. blogElectronica dice:

    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

  46. Deider dice:

    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”);

  47. Deider dice:

    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 ??

  48. blogElectronica dice:

    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

  49. Deider dice:

    Cual pin ?

    Podrias detallar un poco mas lo de quitar el pin ?
    Gracias

  50. Deider dice:

    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…

  51. Deider dice:

    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.

  52. Pua dice:

    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

  53. Fcorrea dice:

    Excelente blog….
    Saludos amigo por tú valioso aporte….

  54. David dice:

    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

  55. Miguel dice:

    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

  56. blogElectronica dice:

    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

  57. 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

  58. blogElectronica dice:

    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.

  59. 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

  60. Lt_Henry dice:

    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

  61. blogElectronica dice:

    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.

  62. Pablo dice:

    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?

  63. blogElectronica dice:

    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

  64. Pablo dice:

    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.

  65. Pablo dice:

    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.

  66. borja dice:

    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!!

  67. Dani dice:

    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.

    • blogElectronica dice:

      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

  68. Antonio Eligio dice:

    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

  69. currumblera dice:

    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.

    • currumblera dice:

      Datos comprobados:

      AT+CSQ: 21/22
      CGREG: 1,1
      CREG: 1,1

    • blogElectronica dice:

      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

      • currumblera dice:

        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.

      • currumblera dice:

        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

      • currumblera dice:

        Problema solucionado, era tema del servidor. Doy por cerrado este tema.

  70. Antonio Eligio Perez Moron dice:

    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

  71. Antonio Eligio Perez Moron dice:

    ¿ Alguien ha echo alguna ver un programa con un socket servidor ? ¿ es decir que admita conexiones entrantes ?

    Un saludo

    • SilviaC dice:

      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?

      • blogElectronica dice:

        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.

      • Antonio Eligio Perez dice:

        Hola Silvia , acabo de consegirlo , si me comentaas que te ocurre a lo mejor te puedo ayudar .

      • SilviaC dice:

        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!

  72. Pablo dice:

    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?

  73. currumblera dice:

    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.

    • blogElectronica dice:

      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

      • currumblera dice:

        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.

      • blogElectronica dice:

        Hola currumbela,

        no, no se puede capturar esos eventos, sólo los URC (^… )

        Gracias por lo del ejemplo, le daré un ojo.

        Salu2

  74. Amand dice:

    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

  75. Juan dice:

    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 :D

    Salu2

  76. Antonio Eligio dice:

    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.

  77. Antonio Eligio Perez Moron dice:

    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

  78. Dani dice:

    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!

    • blogElectronica dice:

      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

  79. Antonio Eligio Perez Moron dice:

    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

  80. Pua dice:

    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

  81. Antonio Eligio Perez Moron dice:

    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

  82. blogElectronica dice:

    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

  83. jesus dice:

    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

  84. Juan Carlos dice:

    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.

    • blogElectronica dice:

      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.

  85. Juan Carlos dice:

    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.

  86. lucianoizquierdo dice:

    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?

  87. Argus dice:

    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.

  88. Antonio dice:

    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

    • blogElectronica dice:

      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.

  89. Antonio dice:

    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

    • blogElectronica dice:

      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.

  90. Antonio dice:

    ¿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!

  91. Pua dice:

    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

  92. Antonio dice:

    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.

  93. Antonio dice:

    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).

  94. Antonio dice:

    De acuerdo :)

    Te mostrare de todos modos los comandos que se capturan, a ver si los puedes interpretar.

  95. Shintarillo dice:

    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,

  96. David dice:

    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

  97. Edu dice:

    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

    • blogElectronica dice:

      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

  98.  
Deja una Respuesta

Puedes publicar un comentario aquí si quieres, pero te recomiendo que uses el nuevo foroElectronica.com para introducir comentarios. Te contestaré más rápido. Recuerda que debes registrarte si no lo estás para publicar un comentario.