SMSGateway basado en aplicación J2ME
Como les comenté, subiré algo de código para demostrar el funcionamiento
del API que desarrollé para simplificar el envío de mensajes MMS y SMS en J2ME.
En esta ocasión, he desarrollado una pequeña aplicación java instalable en handsets iden que tienen capacidades CLDC 1.1 / MIDP2.0 y la JSR 205, la cual funciona como un SMSGateway basado en un handset.
El funcionamiento de la aplicación es sencillo, la aplicación java abre una conexión de puerto serial, usando una conexión usb entre el handset y la pc. A través de este puerto serial virtual la pc transmite al handset el mensaje que se desea enviar, usando el siguiente formato:
{{ptn destino}}|{{mensaje}}
por ejemplo:
525500000000|mensaje de prueba
para realizar el envío de los mensajes de la pc al handset solo se requiere tener instalado el driver usb de motorola (el cual pueden descargar en el sitio de motodev.com)así como algún programa de emulación de terminal como el Hyperterminal (o cualquier otro softweare que permita abrir una conexión por puerto serial). La conexión serial se debe establecer a 115200 bps.
Al recibir la trama de mensaje antes descrita, la aplicación java separa el mensaje y el número destino (ptn destino), y dependiendo del aprovisionamiento del equipo, lo envía ya sea por MMS o por SMS
A continuación muestro el código de la clase que implementa la rececpción de los mensajes por el puerto serial y su envío por SMS o MMS según sea el caso:
* CommPortMessagingEngine.java
* 2 de Septiembre de 2009
*/
package gs.embtel.netsms.iden.engine;
import java.io.*;
import gs.mobile.messaging.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.wireless.messaging.*;
/**
* Clase que implementa el motor de mensajerÃa vÃa puerto serial
* @author Ing.Giancarlo Santini
* @version 1.0
*/
public class CommPortMessagingEngine implements Runnable{
private Form console;
private Thread thread;
private boolean execute;
private CommConnection port;
private DataInputStream input;
private DataOutputStream output;
public CommPortMessagingEngine(CommConnection port , Form console){
input = null;
output = null;
thread = null;
this.port = port;
this.console = console;
execute = false;
}
public void start(){
execute = true;
try{
input = port.openDataInputStream();
output = port.openDataOutputStream();
thread = new Thread(this);
thread.start();
} catch(Exception ex){
console.append("Cannot start Messaging engine because of Exception: " +
ex.getMessage() + "\n");
}
}
public void stop(){
execute = false;
try{
input.close();
output.close();
} catch(Exception ex){
console.append("Error while closing input/output buffers. Exception: " +
ex.getMessage() + "\n");
} finally{
input = null;
output = null;
}
thread.interrupt();
}
public void run() {
console.append("Starting Messaging engine..\n");
while(execute){
int data = 0;
StringBuffer sb = new StringBuffer("");
try{
while((data = input.read()) != '\r'){
sb.append((char)data);
}
if(sb.toString().indexOf("|") > -1){
String ptn = sb.toString().substring(0, sb.toString().indexOf("|"));
String message = sb.toString().substring(sb.toString().indexOf("|") + 1);
console.deleteAll();
console.append("Sending message to PTN: " + ptn + " - Message:" + message + "\n");
console.append("Sending Message...\n");
SmsInfo smsBody = new SmsInfo();
smsBody.setAddress(ptn.trim());
smsBody.setMessage(message.trim());
SmsSender sms = new SmsSender(smsBody);
MessageConnection smsConn = (MessageConnection)Connector.open("sms://" + smsBody.getAddress());
sms.setConnection(smsConn);
sms.start();
while(sms.isSending());
if(sms.getResultCode() == 1){
console.append("Message Sent Successfully!\n");
output.writeUTF("OK");
}
else{
MmsInfo mmsBody = new MmsInfo();
mmsBody.setAddress(ptn.trim());
mmsBody.setSubject("Santini Embtel NetSMS MMS");
mmsBody.setTextMsg(message);
MmsSender mms = new MmsSender(mmsBody);
MessageConnection mmsConn = (MessageConnection)Connector.open("mms://" + mmsBody.getAddress());
mms.setConnection(mmsConn);
mms.start();
while(mms.isSending());
if(mms.getResultCode() == 1){
console.append("Message Sent Successfully!\n");
output.writeUTF("OK");
}
else{
console.append("Error while sending message!!\n");
output.writeUTF("ERROR");
}
mmsConn.close();
mmsConn = null;
mmsBody = null;
mms = null;
}
smsConn.close();
smsConn = null;
smsBody = null;
sms = null;
}
sb = null;
} catch(Exception ex){
console.append("Error while reading port. Exception: " +
ex.getMessage() + "\n");
}
}
}
}
Adjunto a este post el .jar y .jad para que puedan instalar la aplicación en su handset.
Saludos
| Anexo | Tamanho | |
|---|---|---|
| smsgetaway.zip | 91.49 KB | Entrar |
- Por favor, se logue ou se registre para poder enviar comentários
- 3573 leituras
Estta pequeña aplicación la he probado en el i876,i776,i576
Espero les sea de utilidad
Saludos
- Por favor, se logue ou se registre para poder enviar comentários
Hola, lo instalé en un Motorola i760. Puedo inicialo, aparece la imagen de la computadora, puedo ver el menú de START y STOP y el "About". Pero cuando selecciono START me aparece una leyenda "Starting Service" con una imagen en el fondo de un reloj de arena. Así se queda de por vida y por el Hyperterminal en 115200 bps me sigue devolviendo OK a los comandos AT, como si la aplicación no "tomara" el puerto del teléfono.
¿Hay algo que pueda hacer o deba configurar en el handset? Gracias.
- Por favor, se logue ou se registre para poder enviar comentários
Hola, lo instalé en un Motorola i760. Puedo inicialo, aparece la imagen de la computadora, puedo ver el menú de START y STOP y el "About". Pero cuando selecciono START me aparece una leyenda "Starting Service" con una imagen en el fondo de un reloj de arena. Así se queda de por vida y por el Hyperterminal en 115200 bps me sigue devolviendo OK a los comandos AT, como si la aplicación no "tomara" el puerto del teléfono.
¿Hay algo que pueda hacer o deba configurar en el handset? Gracias.
- Por favor, se logue ou se registre para poder enviar comentários
Hola Dario,
Primero antes de conectar el handset a tu pc e iniciar la aplicación debes instalar los drivers para teléfonos motorola, los cuales puedes descargar de la ssiguiente dirección:
http://developer.motorola.com/docstools/USB_Drivers/
Una vez instalados los drivers al conectar tu handset a tu pc, se registrará un nuevo puerto COM (puerto serial), este nuevo puerto es el que deberás usar para comunicarte con el telefono vía hyperterminal.
Para probar que esto este funcionando, a través del hyperterminal puedes enviar el comando "at" y el handset te deberá responder "OK", todo esto SIN INICIAR LA APLICACIÓN JAVA. Una vez que hayas obtneido una respuesta correcta (OK), cierra tu conexión en el hyperterminal, reiniciala, e inicia la aplicación JAVA presiona Start y listo.
- Por favor, se logue ou se registre para poder enviar comentários
El mensaje con el reloj de arena "Starting services", es el mensaje que despliega cuando la aplicación java está abriendo el puerto serial a utilizar para comunicarse con la PC, para que este proceso sea exitoso el teléfono debe tener configurada su conexión USB como Modem de Datos (Data MODEM)
- Por favor, se logue ou se registre para poder enviar comentários
Primero gracias por responder. Te comento que la última versión del driver está instalada y corriendo correctamente. Tengo comunicación con el teléfono utilizando el hyperterminal en 115200 bps sin problemas, responde a los comandos AT. He intentado cerrar la conexión del terminal e iniciar la aplicación java, pero sigue con el mismo problema, es decir, queda en "Starting Service". Por otra parte, no encontré en ningún menú del teléfono la opción de "Conexión USB" o nada parecido.
Lo máximo que vi relacionado con el puerto es "Configurar / Avanzado / Vel Baud" y está seteado en 115200.
Los datos de la versión de firmware del equipo son:
Versión de SW: R3E.01.01 / Tipo de SW: MS-PDGY-BER-DEER_KEY-R13 / Fecha SW: Tue Jul 11 10:26:14 EST 2006
¿Será que es una versión vieja de firmware y tendré que buscar cómo hacer un upgrade del mismo?. Saludos y gracias.
- Por favor, se logue ou se registre para poder enviar comentários
Testei essa aplicação em meu i876.
Mas estou tendo um problema:
- Quando a mensagem é enviada a um Nokia, o Nokia não consegue abrí-la(modelo E71 por exemplo).
Mas se uso a aplicação do kernel do i876 para enviar sms ao mesmo Nokia, a mensagem é aberta sem problema.
Voce poderia ajudar-me ??
obrigado
Jeferson Passos
- Por favor, se logue ou se registre para poder enviar comentários
Oi Jeferson,
Tudo bem?
Eu já vi esse problema. Tem que ver com a codificação da mensagem -- tem vezes que alguns mensagens enviados por Java e MMS não chegam aos aparelhos de outros operadores.
O truque é enviar somente SMS e se assegurar que esteja usando basicamente somente o alfabeto ASCII
[]s
Juan Felipe
- Por favor, se logue ou se registre para poder enviar comentários
Olá Juan,
Você sabe se funciona no i290 ou i335?
Abraços!
- Por favor, se logue ou se registre para poder enviar comentários
Acredito que deve fundioncar no i290 e i335 -- os dois são aparelhos de MMS/SMS.
Juan Felipe
- Por favor, se logue ou se registre para poder enviar comentários
Olá pessoal, esse programa consegue enviar mensagens em lotes em pouco espaço de tempo?
Baixei a aplicação e via emulador eu consigo, mas não sei se a engine do celular suporte o envio de SMS em lotes.
No aguardo se alguem souber da informação
Marcelo Fernandes
- Por favor, se logue ou se registre para poder enviar comentários
Oi Marcelo
SMS se faz um por um.
MMS pode enviar em lotes, adicionando receitores com addAddress()
[]s
Juan Felipe
- Por favor, se logue ou se registre para poder enviar comentários
Preciso desse programa rodando no meu i290, para disparar lote de sms, mesmo sendo 1por1. Alguem pode adaptar o mesmo para isso.
Pago por isso.
Obrigado Heros
djheros@gmail.com
- Por favor, se logue ou se registre para poder enviar comentários
Hi Dj Heros,
My name is Giancarlo Santini, from Mexico City.
I have developed the iDEN based SMSGateway and I can help you with your new requirement
Regards
Skype: ing.giancarlosantini
- Por favor, se logue ou se registre para poder enviar comentários
Com el i876w no funciono.
El hyperterminal se conecta, envia comandos at com resposta OK, mais quando vou iniciar o netsms4iden ele exibe o erro "failed to start services"
Alguma sugestao?
- Por favor, se logue ou se registre para poder enviar comentários
Hola Gian,
Ya que te he enviado la nueva version de la aplicación y al hacer pruebas, como te explique y pudiste comprobar, el error se debia al uso del puerto incorrecto
- Por favor, se logue ou se registre para poder enviar comentários
Hola Nostradamus,
Creo que no he comprendido del todo Tu Comentario. Podrias aclararme a lo que te refieres??
Si te refieres al problema que reporta Giancarlo Rubio sobre una aplicación que le proporcioné, este problema no se refería a un puerto usado en la aplicación J2ME que se carga en el handset, si no al puerto serial que elijió en la aplicación de PC que interactua con el handset
Saludos
- Por favor, se logue ou se registre para poder enviar comentários

Joined: 2009-02-09