Codigo Envio SMS via Blackberry JDE
Para los interesados en programacion con Blackberry JDE para el envio de mensajes SMS, es adjunto el siguiente codigo. Lo pueden tomar como una base para costumizarlo segun sus necesidades.
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import javax.microedition.io.*;
import java.util.*;
import java.io.*;
import javax.wireless.messaging.*;
public class SmsSender extends UiApplication
{
private static final int MAX_PHONE_NUMBER_LENGTH = 32;
private EditField _sendText;
private EditField _address; // Un numero telefonico para recibir los SMS
private EditField _status;
private ListeningThread _listener;
private SendThread _sender;
private StringBuffer _statusMsgs = new StringBuffer();
private MessageConnection _mc;
private boolean _stop = false;
private MenuItem _sendMenuItem = new MenuItem("Send", 100, 10)
{
public void run()
{
String text = _sendText.getText();
String addr = _address.getText();
if ( text.length() > 0 && addr.length() > 0)
{
send(addr, text);
}
}
};
// definimos el protocolo de conexion sms (documentacion blackberry)
private static String _openString = "sms://:3590";
public static void main(String[] args)
{
SmsDemo sms = new SmsDemo();
sms.enterEventDispatcher();
}
// Clase interna para "escuchar" la llegada de nuevos mensajes
private class ListeningThread extends Thread
{
private synchronized void stop()
{
_stop = true;
try
{
if( _mc != null )
{
// Cerrar la conexion para que hilo pueda retornar
_mc.close();
}
}
catch (IOException e)
{
System.err.println(e.toString());
}
}
public void run()
{
try
{ // Cerrado por el metodo stop()
_mc = (MessageConnection)Connector.open(_openString);
for(;;)
{
if ( _stop )
{
return;
}
Message m = _mc.receive();
receivedSmsMessage(m);
}
}
catch (IOException e)
{
System.err.println(e.toString());
}
}
}
private static final class SmsMessage
{
private String _address;
private String _msg;
private SmsMessage(String address, String msg)
{
_address = address;
_msg = msg;
}
private Message toMessage(MessageConnection mc)
{
TextMessage m = (TextMessage) mc.newMessage(MessageConnection.TEXT_MESSAGE , "//" + _address + ":3590");
m.setPayloadText(_msg);
return m;
}
}
// Clase para manejar las trasacciones
private class SendThread extends Thread
{
private static final int TIMEOUT = 500; // ms
//Crear un vector de objetos SmsMessage que inicialmente tendra una capacidad de 5
//Para esta implementacion es poco probable que mas de 5 mensajes sean puestos en cola
private Vector _msgs = new Vector(5);
private volatile boolean _start = false;
// Los pedidos son puestos en cola
private synchronized void send(String address, String msg)
{
_start = true;
_msgs.addElement(new SmsMessage(address, msg));
}
// Terminar el Hilo.
private synchronized void stop()
{
_stop = true;
try
{
if ( _mc != null )
{
_mc.close();
}
}
catch (IOException e )
{
System.err.println(e);
updateStatus(e.toString());
}
}
public void run()
{
for(;;)
{
while( !_start && !_stop)
{
try
{
sleep(TIMEOUT);
}
catch (InterruptedException e)
{
System.err.println(e.toString());
}
}
if ( _stop )
{
return;
}
while(true)
{
try
{
SmsMessage sms = null;
synchronized (this)
{
if ( !_msgs.isEmpty() )
{
sms = (SmsMessage)_msgs.firstElement();
// Remover los elementos de esta manera no se envien de nuevo
_msgs.removeElement(sms);
}
else
{
_start = false;
break;
}
}
_mc.send(sms.toMessage(_mc));
}
catch (IOException e)
{
System.err.println(e);
updateStatus(e.toString());
}
}
}
}
}
private class SmsDemoScreen extends MainScreen
{
private SmsDemoScreen()
{
setTitle(new LabelField("SMS Demo", LabelField.USE_ALL_WIDTH));
_address = new EditField("Destination:", "", MAX_PHONE_NUMBER_LENGTH, EditField.FILTER_PHONE);
add(_address);
_sendText = new EditField("Message:", "");
add(_sendText);
add(new SeparatorField());
_status = new EditField();
add(_status);
addMenuItem(_sendMenuItem);
}
public boolean onSavePrompt()
{
return true;
}
public void close()
{
_listener.stop();
_sender.stop();
super.close();
}
}
private SmsDemo()
{
_listener = new ListeningThread();
_listener.start();
_sender = new SendThread();
_sender.start();
SmsDemoScreen screen = new SmsDemoScreen();
pushScreen(screen);
}
private void updateStatus(final String msg)
{
invokeLater(new Runnable()
{
public void run()
{
_statusMsgs.delete(0, _statusMsgs.length());
_statusMsgs.append(_status.getText());
_statusMsgs.append('\n');
_statusMsgs.append(msg);
_status.setText(_statusMsgs.toString());
}
});
}
private void receivedSmsMessage(Message m)
{
String address = m.getAddress();
String msg = null;
if ( m instanceof TextMessage )
{
TextMessage tm = (TextMessage) m;
msg = tm.getPayloadText();
}
StringBuffer sb = new StringBuffer();
sb.append("Received:");
sb.append('\n');
sb.append("Destination:");
sb.append(address);
sb.append('\n');
sb.append("Data:");
sb.append(msg);
sb.append('\n');
updateStatus(sb.toString());
}
private void send(String addr, String data)
{
_sender.send(addr, data);
}
}
Espero sus comentarios y si tienen propuestas de mejora para este codigo.
Gerardo Chung
Desarrollo Blackberry Senior
Nextel del Peru S.A.
- Inicie sesión o regístrese para enviar comentarios
- 362 lecturas
