MQTT: Android Studio MQTT Test
settings.gradle
pluginManagement { repositories { gradlePluginPortal() google() mavenCentral() maven { url "https://repo.eclipse.org/content/repositories/paho-snapshots/" } } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() maven { url "https://repo.eclipse.org/content/repositories/paho-snapshots/" } } } rootProject.name = "MQTTTest" include ':app'
build.gradle (:app)
..... dependencies { ...... implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' implementation 'org.greenrobot:eventbus:3.3.1' }
activity_main.xml
<?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/btnConnect" android:layout_width="match_parent" android:layout_height="70dp" android:layout_marginBottom="10dp" android:text="Connect" app:layout_constraintBottom_toTopOf="@+id/btnPublish" tools:layout_editor_absoluteX="0dp" /> <Button android:id="@+id/btnPublish" android:layout_width="match_parent" android:layout_height="70dp" android:layout_marginBottom="10dp" android:text="Publish" app:layout_constraintBottom_toTopOf="@+id/btnSubscribe" tools:layout_editor_absoluteX="0dp" /> <Button android:id="@+id/btnSubscribe" android:layout_width="match_parent" android:layout_height="70dp" android:layout_marginBottom="10dp" android:text="Subscribe" app:layout_constraintBottom_toTopOf="@+id/textmqttmessage" tools:layout_editor_absoluteX="0dp" /> <TextView android:id="@+id/textmqttmessage" android:layout_width="match_parent" android:layout_height="150dp" android:text="MQTT Message" app:layout_constraintBottom_toTopOf="@+id/btndisConnect" tools:layout_editor_absoluteX="0dp" /> <Button android:id="@+id/btndisConnect" android:layout_width="match_parent" android:layout_height="70dp" android:layout_marginBottom="52dp" android:text="Disconnect" app:layout_constraintBottom_toBottomOf="parent" tools:layout_editor_absoluteX="0dp" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package itts.onno.mqtttest; import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; public class MainActivity extends AppCompatActivity { public static final String URL = "tcp://192.168.0.7:1883"; // private String userName = "userName"; // private String password = "password"; // private String clientId = "clientId"; private String userName = "onno"; private String password = "123456"; private String clientId = "MQTTTest"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.textmqttmessage); textView.setText("MQTT Message masuk"); //set text for text view findViewById(R.id.btnConnect).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { boolean b = MqttManager.getInstance().creatConnect(URL, userName, password, clientId); // Logger.d("isConnected: " + b); // EventBus.getDefault().register( this ); } }).start(); } }); findViewById(R.id.btnPublish).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { MqttManager.getInstance().publish("demo", 2, "MQTT Android Test".getBytes()); } }).start(); } }); findViewById(R.id.btnSubscribe).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { MqttManager.getInstance().subscribe("demo", 2); // EventBus.getDefault().register( this ); } }).start(); } }); findViewById(R.id.btndisConnect).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { try { MqttManager.getInstance().disConnect(); // EventBus.getDefault().unregister( this ); } catch (MqttException e) { } } }).start(); } }); EventBus.getDefault().register(this); } /** * Subscribe to received messages * The Event type here can be customized as needed, here is only a basic demonstration * * @param message */ @Subscribe public void onEvent(MqttMessage message) { // Logger.d(message.toString()); // Toast.makeText(this, message.toString() ,Toast.LENGTH_SHORT).show(); TextView textView = (TextView) findViewById(R.id.textmqttmessage); textView.setText( message.toString() ); //set MQTT message as text } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onDestroy() { EventBus.getDefault().unregister(this); super.onDestroy(); } }
MqttManager.java
package itts.onno.mqtttest; import org.eclipse.paho.client.mqttv3.MqttCallback; 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; import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence; class MqttManager { // instance private static MqttManager mInstance = null; // Private instance variables private MqttClient client; private MqttConnectOptions conOpt; private boolean clean = true; // callback private MqttCallback mCallback; private MqttManager() { mCallback = new MqttCallbackBus(); } public static MqttManager getInstance() { if (null == mInstance) { mInstance = new MqttManager(); } return mInstance; } /** * Release the instance, and the resources it references */ public static void release() { try { if (mInstance != null) { mInstance.disConnect(); mInstance = null; } } catch (Exception e) { } } /** * Create Mqtt connection * * @param brokerUrl (tcp://xxxxxx:1883) * @param userName * @param password * @param clientId clientId * @return */ public boolean creatConnect(String brokerUrl, String userName, String password, String clientId) { boolean flag = false; String tmpDir = System.getProperty("java.io.tmpdir"); MqttDefaultFilePersistence dataStore = new MqttDefaultFilePersistence(tmpDir); try { // Construct the connection options object that contains connection parameters // such as cleanSession and LWT conOpt = new MqttConnectOptions(); conOpt.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1); conOpt.setCleanSession(clean); if (password != null) { conOpt.setPassword(password.toCharArray()); } if (userName != null) { conOpt.setUserName(userName); } // Construct an MQTT blocking mode client client = new MqttClient(brokerUrl, clientId, dataStore); // Set this wrapper as the callback handler client.setCallback(mCallback); flag = doConnect(); } catch (MqttException e) { Logger.e(e.getMessage()); } return flag; } /** * establish connection * * @return */ public boolean doConnect() { boolean flag = false; if (client != null) { try { client.connect(conOpt); // Logger.d("Connected to " + client.getServerURI() + " with client ID " + client.getClientId()); flag = true; } catch (Exception e) { } } return flag; } /** * Publish / send a message to an MQTT server * * @param topicName the name of the topic to publish to * @param qos the quality of service to delivery the message at (0,1,2) * @param payload the set of bytes to send to the MQTT server * @return boolean */ public boolean publish(String topicName, int qos, byte[] payload) { boolean flag = false; if (client != null && client.isConnected()) { // Logger.d("Publishing to topic \"" + topicName + "\" qos " + qos); // Create and configure a message MqttMessage message = new MqttMessage(payload); message.setQos(qos); // Send the message to the server, control is not returned until // it has been delivered to the server meeting the specified // quality of service. try { client.publish(topicName, message); flag = true; } catch (MqttException e) { } } return flag; } /** * Subscribe to a topic on an MQTT server * Once subscribed this method waits for the messages to arrive from the server * that match the subscription. It continues listening for messages until the enter key is * pressed. * * @param topicName to subscribe to (can be wild carded) * @param qos the maximum quality of service to receive messages at for this subscription * @return boolean */ public boolean subscribe(String topicName, int qos) { boolean flag = false; if (client != null && client.isConnected()) { // Subscribe to the requested topic // The QoS specified is the maximum level that messages will be sent to the client at. // For instance if QoS 1 is specified, any messages originally published at QoS 2 will // be downgraded to 1 when delivering to the client but messages published at 1 and 0 // will be received at the same level they were published at. // Logger.d("Subscribing to topic \"" + topicName + "\" qos " + qos); try { client.subscribe(topicName, qos); flag = true; } catch (MqttException e) { } } return flag; } /** * disconnect the connection * * @throws MqttException */ public void disConnect() throws MqttException { if (client != null && client.isConnected()) { client.disconnect(); } } }
MqttCallbackBus.java
package itts.onno.mqtttest; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.greenrobot.eventbus.EventBus; /** * Dispatching events using EventBus * * @author LichFaker on 16/3/25. * @Email lichfaker@gmail.com */ public class MqttCallbackBus implements MqttCallback { @Override public void connectionLost(Throwable cause) { // Logger.e(cause.getMessage()); } @Override public void messageArrived(String topic, MqttMessage message) { // Logger.d(topic + "====" + message.toString()); EventBus.getDefault().post(message); // Toast.makeText(this, message.toString() ,Toast.LENGTH_SHORT).show(); } @Override public void deliveryComplete(IMqttDeliveryToken token) { } }