Ressources informatiques

Ressources informatiques

Ressources informatiques

Accéder à un topic MQTT

Créez une application Android

Suivez la docucmentation pour créer votre application Android

Installer l'API pour développer un client MQTT

dependencies {
	...
    implementation files('libs/org.eclipse.paho.android.service-1.1.1.jar')
    implementation files('libs/org.eclipse.paho.client.mqttv3-1.1.1.jar')
}
Client MQTT Android Client MQTT Android

Autoriser l'application à utiliser le réseau et le service MQTT

Accéder au réseau depuis l'application Android

Il faut ajouter les permissions ci-dessous dans le fichier app > manifests > AndroidManifest.xml à l'intérieur de la balise manifest :

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.WAKE_LOCK" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.READ_PHONE_STATE" />

Accéder au service Paho depuis l'application Android

Il faut ajouter la ligne ci-dessous dans le fichier app > manifests > AndroidManifest.xml à l'intérieur de la balise application :

<service android:name="org.eclipse.paho.android.service.MqttService" />

Créer l'application ClientMQTT

Créer l'IHM de l'application

Créer une IHM possédant :

Résultat d'exécurion attendu :

Client MQTT Android Client MQTT Android

Créer la classe ClientMQTT

package com.masociete.clientmqtt;

import android.content.Context;

import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

public class ClientMQTT {
    private final int QOS = 1;
    private String clientId;
    private MqttAndroidClient client;
    private String adresse;
    private String user;
    private String password;
    private Context context;
    private IMqttToken token;
    private IMqttToken subToken;
    private MqttConnectOptions options;
    private String message ="";
    private String topic ="";

    ClientMQTT(String adresse, String port, String user, String password, String topicL, Context context) {
        this.context = context;
        this.adresse = "tcp://" + adresse + ":" + port;
        this.user = user;
        this.password = password;
        this.topic = topicL;
        clientId = MqttClient.generateClientId();
        client = new MqttAndroidClient(context, this.adresse, clientId);
        client.setCallback(new MqttCallbackExtended() {
             public void connectComplete(boolean b, String s) {
                try {
                    abonner();
                } catch (MqttException e) {
                    e.printStackTrace();
                }
            }
            public void connectionLost(Throwable throwable) {
            }
             public void messageArrived(String topicLocal, MqttMessage mqttMessage)  {
                message = mqttMessage.toString();
                topic = topicLocal;
            }
            public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
            }
        });
    }

    public void connecter() throws MqttException {
        options = new MqttConnectOptions();
        options.setCleanSession(false);
        options.setAutomaticReconnect(true);
        options.setUserName(user);
        options.setPassword(password.toCharArray());

        token = client.connect(options);
        token.setActionCallback(new IMqttActionListener() {
            public void onSuccess(IMqttToken asyncActionToken) {
            }
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            }
        });
    }

    public void abonner() throws MqttException {
        subToken = client.subscribe(topic, QOS);
        subToken.setActionCallback(new IMqttActionListener() {
            public void onSuccess(IMqttToken asyncActionToken) {
            }
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            }
        });
    }

    public void desabonner(String topic) throws MqttException {
        IMqttToken unsubToken = client.unsubscribe(topic);
        unsubToken.setActionCallback(new IMqttActionListener() {
            public void onSuccess(IMqttToken asyncActionToken) {
            }
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            }
        });
    }

    public void deconnecter() throws MqttException {
        IMqttToken disconToken = client.disconnect();
        disconToken.setActionCallback(new IMqttActionListener() {
            public void onSuccess(IMqttToken asyncActionToken) {
            }
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            }
        });
    }

    public String getMessage() {
        return message;
    }

    public String getTopic() {
        return topic;
    }
}

Compléter la classe MainActivity

Lorque l'on clique sur le bouton S'ABONNER la fonction onClickBoutonSAbonner() est appelée, un objet clientMqtt est créé et sa méthode connecter() est appelée. L'exécution du Runnable thread est alors demandée. Sa fonction run() met à jour l'IHM avec la dernière valeur obtenue puis demande une nouvelle exécution du Runnable thread dans une seconde.

package com.masociete.clientmqtt;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.eclipse.paho.client.mqttv3.MqttException;

public class MainActivity extends AppCompatActivity {
    private boolean demarre = false;
    private TextView texteTopic;
    private Button boutonDemarrer;

    private ClientMQTT clientMqtt;
    private Handler mHandler = new Handler();
    private Runnable thread = new Runnable() {
        public void run() {
            if (demarre) {
                texteTopic.setText(clientMqtt.getTopic() +" : "+ clientMqtt.getMessage());
                mHandler..postDelayed(this, 1000);
            }
        }
    };

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        texteTopic = (TextView) findViewById(R.id.texteTopic);
        boutonDemarrer = (Button) findViewById(R.id.boutonDemarrer);
    }

    public void onClickBoutonSAbonner(View view) {
        if (!demarre) {
            clientMqtt = new ClientMQTT("192.168.1.11", "1883",
                    "user2","IOTPasswd","nodemcu-1/temperature", getApplicationContext());

            try {
                clientMqtt.connecter();
                demarre = true;
                boutonDemarrer.setText("ARRETER");
                mHandler.post(thread);
            } catch (MqttException e) {
                e.printStackTrace();
            }
        } else {
            boutonDemarrer.setText("S'ABONNER");
            try {
                clientMqtt.desabonner(texteTopic.getText().toString());
                clientMqtt.deconnecter();
            } catch (MqttException e) {
                e.printStackTrace();
            }
            demarre = false;
            mHandler.removeCallbacks(thread);
        }
    }
}