Hi All,
After a few week I have been working on how to write a code using Android Studio for MQTT, finally I have successfully found it.
I have been searching a few tutorial about MQTT on Android studio, many tutorial share same program. However, they forget to to tell that if you are using a new version of android studio like android studio X, you need to add the line below in you gradle file.
implementation(‘org.eclipse.paho:org.eclipse.paho.android.service:1.0.2’) { exclude module: ‘support-v4’}
Good luck ya !!!!!
The mobile app is like below. It has three buttons which is:
- CONNECT – Will connect to MQTT service
- DISCONNECT – Will disconnect the MQTT service
- PUBLISH – To publish a message to MQTT service based on topic.
It also contain one textView that will subscribe and show the message received from the MQTT service.
- When click button Publish, you will see the “the payload” in the Messages bar. The message is already embedded in the coding.
- When click Publish from MQTT websocket client with correct topic (“event”), you will see the “YEAHH!!!” on you mobile app.
Below is the steps on how to write MQTT code on Android Studio.
Step 1: Add dependencies into gradle file.
Add Paho Android Service as a dependency to your app add the following parts to your gradle file.
repositories {
maven {
url "https://repo.eclipse.org/content/repositories/paho-releases/"
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation('org.eclipse.paho:org.eclipse.paho.android.service:1.0.2') {
exclude module: 'support-v4'
}
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
}
Picture in Gradle file
Step 2: Add permission on AndroidManifest.xml
To be able to create a binding to the Paho Android Service, the service needs to be declared in the AndroidManifest.xml
. Add the following within the <application>
tag:
<service android:name="org.eclipse.paho.android.service.MqttService" > </service>
The Paho Android Service needs the following permissions to work:
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
Picture in AndroidManifest.xml
file
Step 3: Design the layout activity_main.xml
- Update your layout.
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="236dp" android:onClick="published" android:text="PUBLISH" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/subText" android:layout_width="141dp" android:layout_height="68dp" android:layout_marginTop="360dp" android:text="TextView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/connBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="524dp" android:onClick="conn" android:text="connect" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.201" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/disconnBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="524dp" android:onClick="disconn" android:text="disconnect" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.78" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Step 4: Write the code in MainActivity.java
- Write the coding below at MainActivity.java.
- If you have the MQTT service in your computer like mosquitto service with port 1883, you can uncomment the line below:
//client = new MqttAndroidClient(this.getApplicationContext(), “tcp://192.168.43.41:1883”,clientId);
Picture of MainActivity.java:
package com.example.subcribe_java; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; 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.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; public class MainActivity extends AppCompatActivity { MqttAndroidClient client; TextView subText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); subText = (TextView)findViewById(R.id.subText); String clientId = MqttClient.generateClientId(); client = new MqttAndroidClient(this.getApplicationContext(), "tcp://broker.mqttdashboard.com:1883",clientId); //client = new MqttAndroidClient(this.getApplicationContext(), "tcp://192.168.43.41:1883",clientId); try { IMqttToken token = client.connect(); token.setActionCallback(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Toast.makeText(MainActivity.this,"connected!!",Toast.LENGTH_LONG).show(); setSubscription(); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Toast.makeText(MainActivity.this,"connection failed!!",Toast.LENGTH_LONG).show(); } }); } catch (MqttException e) { e.printStackTrace(); } client.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) { } @Override public void messageArrived(String topic, MqttMessage message) throws Exception { subText.setText(new String(message.getPayload())); } @Override public void deliveryComplete(IMqttDeliveryToken token) { } }); } public void published(View v){ String topic = "event"; String message = "the payload"; try { client.publish(topic, message.getBytes(),0,false); Toast.makeText(this,"Published Message",Toast.LENGTH_SHORT).show(); } catch ( MqttException e) { e.printStackTrace(); } } private void setSubscription(){ try{ client.subscribe("event",0); }catch (MqttException e){ e.printStackTrace(); } } public void conn(View v){ try { IMqttToken token = client.connect(); token.setActionCallback(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Toast.makeText(MainActivity.this,"connected!!",Toast.LENGTH_LONG).show(); setSubscription(); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Toast.makeText(MainActivity.this,"connection failed!!",Toast.LENGTH_LONG).show(); } }); } catch (MqttException e) { e.printStackTrace(); } } public void disconn(View v){ try { IMqttToken token = client.disconnect(); token.setActionCallback(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Toast.makeText(MainActivity.this,"Disconnected!!",Toast.LENGTH_LONG).show(); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Toast.makeText(MainActivity.this,"Could not diconnect!!",Toast.LENGTH_LONG).show(); } }); } catch (MqttException e) { e.printStackTrace(); } } }
Step 5: You can test you mobile app
- RUN the app
- In browser, open the MQTT websocket client as link below:
http://www.hivemq.com/demos/websocket-client/
Click button connect and Add New Topic Subcription.
Example of Topic in my program:
event
QoS = 0
- Click subscribe.
- When click button Publish, you will see the “the payload” in the Messages bar. The message is already embedded in the coding.
- When click Publish from MQTT websocket client with correct topic (“event”), you will see the “YEAHH!!!” on you mobile app.