(3)MQTT在Android端应用

前言

我们搭建好并测通了MQTT.fx的Broker服务器,现在我们想要用Android客户点去和服务器通信。
和Android通信有一套已有的库就是Paho Android Service。

Paho Android Service是一个基于Java语言的Paho MQTT库开发的MQTT客户端服务包。

接入

  • 在build.gradle中添加仓库地址
maven {
     url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
}
或者是
maven {
     url "https://repo.eclipse.org/content/repositories/paho-releases/"
}
  • 在App或者是子Module中引入依赖
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'
}
  • 在AndroidManifest文件中添加权限和注册Service
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxx.xxxx.mqtt">

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

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

</manifest>

应用

  • 以下是建联和发布订阅等代码
public class IOT {
    private final String TAG = "MyIOT";

    private Context mContext;

    /* 用于上报消息 */
    final private String PUB_TOPIC = "/message/publish";
    /* 用于接受消息 */
    final private String SUB_TOPIC = "/message/publish";
    /* 自己部署到本地的服务器地址(协议+地址+端口号) */
    private final String HOST = "tcp://替换成自己的IP:1883";
    /* 用户名 */
    private String USERNAME = "admin";
    /* 密码 */
    private String PASSWORD = "admin";

    private MqttAndroidClient mqttAndroidClient;

    private static final class IOTHolder {
        private static final IOT instance = new IOT();
    }

    public static IOT getInstance() {
        return IOT.IOTHolder.instance;
    }

    /**
     * 初始化
     *
     * @param context
     */
    public void init(Context context) {
        mContext = context.getApplicationContext();
        connect();
    }

    /**
     * 订阅特定的主题
     *
     * @param topic mqtt主题
     */
    public void subscribeTopic(String topic) {
        try {
            mqttAndroidClient.subscribe(topic, 0, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    Log.i(TAG, "subscribed succeed");
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    Log.i(TAG, "subscribed failed");
                }
            });

        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    /**
     * 向默认的主题/user/update发布消息
     *
     * @param payload 消息载荷
     */
    public void publishMessage(String payload) {
        try {
            if (!mqttAndroidClient.isConnected()) {
                mqttAndroidClient.connect();
            }
            MqttMessage message = new MqttMessage();
            message.setPayload(payload.getBytes());
            message.setQos(0);
            mqttAndroidClient.publish(PUB_TOPIC, message, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    Log.i(TAG, "publish succeed!");
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    Log.i(TAG, "publish failed!");
                }
            });
        } catch (MqttException e) {
            Log.e(TAG, e.toString());
            e.printStackTrace();
        }
    }

    /**
     * 断开连接销毁资源
     */
    public void destroy() {
        try {
            if (mqttAndroidClient.isConnected()) {
                mqttAndroidClient.disconnect();
                mqttAndroidClient.unregisterResources();
            }
            mqttAndroidClient = null;
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    /**
     * 断开连接
     */
    public void disconnect() {
        try {
            if (mqttAndroidClient.isConnected()) {
                mqttAndroidClient.disconnect();
            }
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    /**
     * 重新连接
     */
    public void reInit() {
        connect();
    }


    /**
     * 连接
     */
    private void connect() {
        if (mqttAndroidClient != null && mqttAndroidClient.isConnected()) return;

        MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
        mqttConnectOptions.setUserName(USERNAME);
        mqttConnectOptions.setPassword(PASSWORD.toCharArray());
        mqttConnectOptions.setCleanSession(false); // 不清理离线消息。qos=1的消息,在设备离线期间会保存在云端。
        mqttConnectOptions.setAutomaticReconnect(false); //本demo关闭自动重连。强烈建议生产环境开启自动重连。
        mqttConnectOptions.setKeepAliveInterval(300);
        /* 创建MqttAndroidClient对象, 并设置回调接口 */
        mqttAndroidClient = new MqttAndroidClient(mContext, HOST, DeviceUuidFactory2.getDeviceUuidStr(mContext));
        mqttAndroidClient.setCallback(new MqttCallback() {
            @Override
            public void connectionLost(Throwable cause) {
                Log.i(TAG, "connection lost");
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                Log.i(TAG, "topic: " + topic + ", msg: " + new String(message.getPayload()));
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                Log.i(TAG, "msg delivered");
            }
        });
        /* Mqtt建连 */
        try {
            mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    Log.i(TAG, "connect succeed");

                    //自动订阅
                    subscribeTopic(SUB_TOPIC);
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    Log.i(TAG, "connect failed");
                }
            });

        } catch (MqttException e) {
            e.printStackTrace();
        }

    }

github地址

阿里云MQTT使用Paho接入

猜你喜欢

转载自blog.csdn.net/u011148116/article/details/106543568