Android架构设计MQTTMQTT

Android(安卓)连接MQTT Broker(服务器)

2018-07-21  本文已影响141人  EMQ

准备工作

添加依赖

MQTT 客户端我们使用官方实现,Eclipse Paho Android Service

Maven

<project ...>
<repositories>
    <repository>
        <id>Eclipse Paho Repo</id>
        <url>https://repo.eclipse.org/content/repositories/paho-releases/</url>
    </repository>
</repositories>
...
<dependencies>
    <dependency>
        <groupId>org.eclipse.paho</groupId>
        <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.paho</groupId>
        <artifactId>org.eclipse.paho.android.service</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>
</project>

Gradle

dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}

配置 AndroidManifest.xml

修改 AndroidManifest.xml,添加网络权限以及添加后台 service

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Permissions the Application Requires -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- Mqtt Service -->
        <service android:name="org.eclipse.paho.android.service.MqttService">
        </service>
    </application>

</manifest>

开始使用

初始化

private void initClient() {
        String serverURI = "tcp://127.0.0.1:1883";
        String clientId = "your client id";
        mClient = new MqttAndroidClient(getApplicationContext(), serverURI, clientId);

        mClient.setCallback(new MqttCallbackExtended() {

            @Override
            public void connectComplete(boolean reconnect, String serverURI) {

            }

            @Override
            public void connectionLost(Throwable cause) {

            }

            @Override
            public void messageArrived(String topic, MqttMessage message) {

            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {

            }
        });
    }

回调方法说明

public void connectComplete(boolean reconnect, String serverURI)

连接成功

public void connectionLost(Throwable cause)

与服务断开连接

public void messageArrived(String topic, MqttMessage message)

接收到消息,可在该回调方法中进行消息的处理

public void deliveryComplete(IMqttDeliveryToken token)

发布消息成功

配置

配置连接

MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setUserName("username");
options.setPassword("password".toCharArray());
options.setAutomaticReconnect(true);

可以设置用户名,密码,是否重连,设置遗愿等,更多配置可以查看 MqttConnectOptions

配置客户端离线或者断开连接的选项

DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions();
disconnectedBufferOptions.setBufferEnabled(true);
disconnectedBufferOptions.setBufferSize(5000);
disconnectedBufferOptions.setDeleteOldestMessages(true);
disconnectedBufferOptions.setPersistBuffer(true);
mClient.setBufferOpts(disconnectedBufferOptions);

配置是否缓存消息,缓存大小,缓存满的时候是否删除旧消息,是否持久化消息

连接

private void connect(MqttConnectOptions options) throws MqttException {
        mClient.connect(options, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {

            }

            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

            }
        });
    }

订阅

private void subscribe() throws MqttException {
        mClient.subscribe("topic", 1, null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {

            }

            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

            }
        });
    }

发布消息

private void publish() throws MqttException {
        mClient.publish("topic", "payload".getBytes(), 1, false, null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {

            }

            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

            }
        });
    }

取消订阅

private void unsubscribe() throws MqttException {
        mClient.unsubscribe("topic", null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {

            }

            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

            }
        });
    }

断开连接

private void disconnect() throws MqttException {
        mClient.disconnect(null, new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {

            }

            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

            }
        });
    }

配置 SSL 连接

keytool -importcert -keystore key.bks -file cacert.pem  -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider

按照提示输入密码,然后就在该目录下生成了 key.bks 证书

SSLSocketFactory sslSocketFactory=
mClient.getSSLSocketFactory(getResources().openRawResource(R.raw.key), "your password");
MqttConnectOptions options = new MqttConnectOptions();
options.setSocketFactory(sslSocketFactory);
// more options

结语

更多关于MQTT的文章,请关注EMQ君的博客

上一篇 下一篇

猜你喜欢

热点阅读