Our Country Sites: Argentina|Brazil|Chile|Mexico|Peru

Codigo Envio SMS via Blackberry JDE

Versión para impresiónVersión para impresiónSend by emailSend by email

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.*;
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.