Android - 对接MQTT

一、认识下 Android MQTT

首先你得知道这是什么吧,稀里糊涂抄一大堆完事就忘了可不行。

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。

MQTT有三个角色

  • 服务端
  • 客户端(简单理解为手机端)
  • 主题(是接收呢,还是发送)

MQTT服务质量等级

  • QoS = 0 – 最多发一次
  • QoS = 1 – 最少发一次
  • QoS = 2 – 保证收一次

基本就是这些,本文默认你已经有一个MQTT的服务地址了,接下来就负责Andriod连接。

我的使用场景是打开在线调试,一对一看到对方发来的数据

二、使用

1.导入库

//MQTT
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.2'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.0'

2.添加maven

maven { url 'https://repo.eclipse.org/content/repositories/paho-releases/'}
maven { url 'https://jitpack.io' }

3. AndroidManifest.xml 中添加

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

4.接下来就是 使用代码了

public class MainActivity extends AppCompatActivity {

    private ScheduledExecutorService scheduler;
    private MqttClient client;
    private Handler handler;
//这些都写你自己的或者找个测试的地址
    private String host = "tcp://139.xxx.xxx.xx:xxxx";     // TCP协议
    private String userName = "well2021"; //mqtt用户名称
    private String passWord = "public";//mqtt用户密码
    private String mqtt_id = "clientId_mqtt_well_android";//mqtt id
    private String mqtt_sub_topic = "well";//mqtt订阅的主题的标识
    private String mqtt_pub_topic = "well/1123/0";//mqtt你发布的主题的标识


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        findViewById(R.id.test).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                publishmessageplus(mqtt_pub_topic, "我是测试发送的数据给mqtt服务端");
            }
        });

        //初始化mqtt配置
        Mqtt_init();

        
        }


    // MQTT初始化
    private void mqttInit() {
        try {
            //host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
            client = new MqttClient(host, mqtt_id,
                    new MemoryPersistence());
            //MQTT的连接设置
            MqttConnectOptions options = new MqttConnectOptions();
            //设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
            options.setCleanSession(false);
            //设置连接的用户名
            options.setUserName(userName);
            //设置连接的密码
            options.setPassword(passWord.toCharArray());
            // 设置超时时间 单位为秒
            options.setConnectionTimeout(10);
            // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
            options.setKeepAliveInterval(20);
            startReconnect(options);

            //设置回调
            client.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable cause) {
                    //连接丢失后,一般在这里面进行重连
                    Logger.e(TAG, "连接丢失后connectionLost----------");
                }

                @Override
                public void deliveryComplete(IMqttDeliveryToken token) {
                    //publish后会执行到这里
                    Logger.d(TAG, "publish后会执行到这里deliveryComplete---------"
                            + token.isComplete());
                }

                @Override
                public void messageArrived(String topicName, MqttMessage message)
                        throws Exception {
                    //subscribe后得到的消息会执行到这里面
                    Logger.d(TAG, "subscribe后得到的消息会执行到这里面messageArrived----------" + message);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // MQTT重新连接函数
    private void startReconnect(MqttConnectOptions options) {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                if (!client.isConnected()) {
                    mqttConnect(options);
                }
            }
        }, 0 * 1000, 10 * 1000, TimeUnit.MILLISECONDS);
    }

    // 订阅函数    (下发任务/命令)
    public void publishmessageplus(String topic, String message2) {
        if (client == null || !client.isConnected()) {
            return;
        }
        MqttMessage message = new MqttMessage();
        message.setPayload(message2.getBytes());
        try {
            client.publish(topic, message);
        } catch (MqttException e) {

            e.printStackTrace();
        }
    }

    // MQTT连接函数
    private void mqttConnect(MqttConnectOptions options) {
        new Thread(() -> {
            try {
                if (!(client.isConnected()))  //如果还未连接
                {
                    client.connect(options);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }
}

这是布局 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/test"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="test"/>

</LinearLayout>

问题:

到这里就结束了 ,基本写法是没有问题的,如果连接不上多半是因为配置问题,不是你android代码的问题,很有可能是配置问题。

主要问题点就在于,你的订阅和发送的标识不一致,或者后台没有配置好 就可能导致连接不上

我个人服务端用的是:MQTTX

猜你喜欢

转载自blog.csdn.net/m0_59482482/article/details/127886751
今日推荐