Android - 对接MQTT

这篇具有很好参考价值的文章主要介绍了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

android mqtt,android

 文章来源地址https://www.toymoban.com/news/detail-608540.html

到了这里,关于Android - 对接MQTT的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android框架mqtt库无法兼容高版本android13的问题

    最近使用mqtt库,测试的时候发现在Android12及以下正常,但在13上闪退,闪退日志如下 提示很明显是version 31版本在创建PendingIntent的时候需要做适配,于是全局搜索把适配代码加上,代码如下 加上之后还是报同样的错误,几经周折才发现mqtt库里也用到了PendingIntent且没有做适配

    2024年02月07日
    浏览(29)
  • 【Android+物联网】Android封装MQTT连接阿里云物联网平台

    前言: 亲测可行,本文实现Android封装MQTT连接阿里云物联网平台。将MQTT协议和连接阿里云平台的操作通过Android studio写入APP中,并简单设计UI。实现手机APP远程控制单片机LED灯亮灭的功能。 关于《 Android软件开发 》,见如下专栏 https://blog.csdn.net/m0_61712829/category_12455686.html?sp

    2024年02月01日
    浏览(66)
  • IOT开发---Android MQTT使用

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议。 该协议构建于TCP/IP协议上,它的设计思想是轻巧、开放、 简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于

    2024年02月10日
    浏览(32)
  • Android 实现MQTT客户端,用于门禁消息推送

    添加MQTT依赖 implementation ‘org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.2’ implementation ‘org.eclipse.paho:org.eclipse.paho.android.service:1.1.1’ 在Manifest清单文件中添加服务 MqttClient的实现方式 MQTT初始化连接线程,实现与服务器的连接、订阅、发布消息 MQTT重连 MQTT断开 发送消息 MqttAndroid

    2024年02月14日
    浏览(37)
  • Android MQTT:实现设备信息上报与远程控制

    1.1 MQTT是什么? MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,最初由IBM开发,用于连接远程设备与服务器之间的通信。它在物联网(IoT)应用中变得越来越流行,因为它具有以下特点: 轻量级协议 :MQTT是一种精简的协议,有效地减少了通信开销,适合于

    2024年02月09日
    浏览(30)
  • Android MQTT连接阿里云使用Json解析数据

    这里有两种方法: 这里先介绍第一种方法: 切换到Android 目录: 按照如下图,添加依赖即可: 第二种方法: 打开Android Studio 然后切换到Android 目录找到Lib文件夹,将MQTT的JAR包复制进去即可。 然后点击project目录然后将MQTT JAR包导进去 添加完成之后作为库导入工程中 在MainA

    2024年02月03日
    浏览(33)
  • Android集成MQTT教程:实现高效通信和实时消息传输

        随着物联网技术的不断发展,Android应用程序对于实时通信和消息传输的需求越来越迫切。MQTT(Message Queuing Telemetry Transport)作为一种轻量级的、可扩展的通信协议,被广泛应用于物联网领域。本文将为您详细介绍如何在Android应用中集成MQTT,实现高效通信和实时消息传输

    2024年02月07日
    浏览(30)
  • 【Android】MQTT入门——服务器部署与客户端搭建

    MQTT(Message Queuing Telemetry Transport) 是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽、和不稳定网络环境的物联网应用而设计,它可以用极少的代码为互联网设备提供实时可靠的消息服务。 MQTT 协议主要用于物联网和移动设备等资源有限的场景中,其中包括

    2024年02月04日
    浏览(64)
  • 采用MQTT协议实现Android APP与阿里云平台的连接

    相信APP+单片机是很多同学毕设或者课设的模式,上学期做课设的时候用到了MQTT协议连接阿里云平台实现数据的通信,也是根据网上大佬的经验做的,中间也踩了很多坑。本文将介绍Android APP 通过MQTT协议与阿里云云平台连接的内容,希望对大家能有所帮助。 MQTT(Message Que

    2024年02月04日
    浏览(37)
  • .NET MAUI Android 对接商米移动手持终端打印JAVA SDK

    因甲方需求,需要对现项目进行升级,需要增加移动手持终端进行巡检,巡检时还需要对商品进行抽检并打印热敏不干胶标签进行贴到抽样样品上。在这样的背景下便在JD进行了采样,进行技术性研究。本文章将一步一步教大家如何使用.NET MAUI 来集成java printerx 来实现使用M

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包