Conectando Android a RabbitMQ con Eclipse PAHO.

By | 11 diciembre 2014

Lo primero que hay que hacer es descargar de Github la ultima versión de la librería Eclipse PAHO, compilarla (con Maven 3), e importarla en nuestro proyecto Android. Para este propósito se puede seguir la documentación oficial desde su propia página web aquí.

Una vez compilada e importada nuestra librería en Android, para el ejemplo voy a crear un Android Service, que hará conectara con RabbitMQ, recibirá mensajes y los emitirá con un broadcast al resto de la aplicación.

public class MQTTService extends Service implements MqttCallback {

    private NotificationService notificationService = null;

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {

	    Log.i("MQTT_INFO", "Servicio de notificaciones iniciado.");

	    new Thread(new Runnable() {

			@Override
			public void run() {

                MQTTService.this.notificationService =
                       new NotificationService(
                               MQTTService.this.getApplicationContext(),
                               MQTTService.this);
	    }
	}).start();

	return Service.START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {

	return null;
    }

    @Override
    public void onDestroy() {

	super.onDestroy();
	this.notificationService.disconnect();
    }

    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {

		Intent intent = new Intent("mqtt-message");

        intent.putExtra("message", mqttMessage.toString());

        LocalBroadcastManager.getInstance(MQTTService.this.getApplicationContext())
                .sendBroadcast(intent);
    }

    @Override
    public void connectionLost(Throwable throwable) {

	//TODO
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

        //TODO
    }

}

NotificationService es donde se realizan las operaciones con Eclipse PAHO sobre RabbitMQ.

public class NotificationService {

    private String broker = "tcp://{rabbitmq_server}:1883";
    private int qos = 0;

    private MqttCallBack mqttCallBack;
    private Context context;

    private MqttClient notificationClient = null;

    private MemoryPersistence persistence = new MemoryPersistence();

    public NotificationService(Context context, MqttCallBack mqttCallBack) {

        this.context = context;
        this.mqttCallBack = mqttCallBack;
    }

    public void start() throws MqttException{

        this.notificationClient =
                new MqttClient(
                        this.broker,
                        MqttClient.generateClientId(),
                        this.persistence);

        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setUserName("user");
        connOpts.setPassword("user".toCharArray());
        connOpts.setCleanSession(true);

        this.notificationClient.setCallback(this.mqttCallBack);

        this.notificationClient.connect(connOpts);

        if(!this.notificationClient.isConnected()){

            Log.e("MQTT_ERROR", "Error Connecting on notification server.");
            return;
        }

        this.notificationClient.subscribe("amq.topic.*", this.qos);

        Log.i("MQTT_ERROR", "Connected");
    }

    public void disconnect(){

        try{

            this.notificationClient.disconnect();
        }catch(MqttException me){

            Log.e(
                    "MQTT_ERROR",
                    "Error disconnecting connection from notification server.\n" + me.getMessage());
        }
    }

}

Por último, en alguna parte de nuestra aplicación Android recibimos el Broadcast.

BroadcastReceiver messageReceiver = new BroadcastReceiver() {

	@Override
	public void onReceive(Context context, Intent intent) {

		String message =
				(String) intent.getSerializableExtra("message");

		//TODO
	}
};

...

LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver,
				new IntentFilter("mqtt-message"));
Comparte esta entrada enShare on LinkedIn0Tweet about this on Twitter0Share on Facebook0Share on Google+0

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *