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
- Téléchargez
Paho Android Service
(librairie client MQTT écrite en Java pour développer des applications Android) - Téléchargez
Android MQTT Client library
- Copiez les 2 fichiers
.jar
obtenus dans le répertoireapp/libs
de votre application. - Dans le panneau
Android
, suivez le cheminGradle Scripts > build.gradle (Module: app), ajoutez les deux lignes surlignées ci-dessous :
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') }
- Demandez la synchronisation en cliquant sur
Sync Now
- Vous devez obtenir le message ci-dessous
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 :
- Un bouton permettant de se connecter et s'abonner au topic MQTT puis de se désabonner du topic MQTT et se déconnecter
- Une zone de texte permettant d'afficher la valeur du topic
Résultat d'exécurion attendu :
- Avant connexion :
- Après connexion :
Créer la classe ClientMQTT
- Le constructeur de la classe
ClientMQTT
met en place deux fonctionsCallback
: - La fonction
connectComplete()
est appelée lorsque la connexion est réussie. Elle appelle alors la méthodeabonner()
qui permet l'abonnement autopic
MQTT
- La fonction
messageArrived()
qui permet de mémoriser le nom et la valeur correspondante dutopic
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); } } }