Android:通过MQTT实现用户端与服务器数据双向传输

Posted Z|Star

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android:通过MQTT实现用户端与服务器数据双向传输相关的知识,希望对你有一定的参考价值。

android版本更新很快,很多MQTT开发的demo无法运行,找了很多资料终于实现了数据传输这一功能,特此记录一下。

一、MQTT基本概念

简单来说,MQTT是一个基于TCP/IP的协议,比较轻量化,广泛应用于物联网设备和服务器的数据传输。

主题:相当于人与人之间的共同话题。只有当客户端与服务端确定共同主题时,才能进行数据传输。(否则,牛头不对马嘴)

以服务器端接收消息为例,服务器端需订阅/zstar(举个例子)这个主题,客户端需要设置发布zstar这个主题,这样,就可以将数据传输到服务器。

发布消息反之,原理一样。

二、搭建测试用的MQTT服务器

为了实验程序是否有效,需要搭建一台MQTT服务器用作测试。这里,建议购买一周时间的阿里云服务器,¥10左右,性价比不错。

具体步骤参见我的上一篇博客
利用阿里云搭建MQTT服务器

三、下载依赖

使用MQTT必然需要导入相应依赖。
这里是MQTT依赖下载的官网
下载传送门
我下载的是1.2.0版本

四、核心代码

4.1MQTT初始化

 private void Mqtt_init()
    {
        try {
            //host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
            client = new MqttClient(host, mqtt_id, new MemoryPersistence());
            //MQTT的连接设置
            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);
            //设置回调
            client.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable cause) {
                    //连接丢失后,一般在这里面进行重连
                    System.out.println("connectionLost----------");
                    //startReconnect();
                }
                @Override
                public void deliveryComplete(IMqttDeliveryToken token) {
                    //publish后会执行到这里
                    System.out.println("deliveryComplete---------" + token.isComplete());
                }
                @Override
                public void messageArrived(String topicName, MqttMessage message)
                        throws Exception {
                    //subscribe后得到的消息会执行到这里面
                    System.out.println("messageArrived----------");
                    Message msg = new Message();
                    msg.what = 3;   //收到消息标志位
                    msg.obj = topicName + "---" + message.toString();
                    handler.sendMessage(msg);    // hander 回传
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4.2连接与重连

private void Mqtt_connect() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    if(!(client.isConnected()) )  //如果还未连接
                    {
                        client.connect(options);
                        Message msg = new Message();
                        msg.what = 31;
                        handler.sendMessage(msg);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    Message msg = new Message();
                    msg.what = 30;
                    handler.sendMessage(msg);
                }
            }
        }).start();
    }
    private void startReconnect() {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                if (!client.isConnected()) {
                    Mqtt_connect();
                }
            }
        }, 0 * 1000, 10 * 1000, TimeUnit.MILLISECONDS);
    }

4.3发送消息

 private 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();
        }
    }

五、使用说明

由于仅是测试功能,界面设计自然越简单越好。
在这里插入图片描述
第一个TextView用来显示接收到的消息。
第二个控件用来发送消息,点击发送"message"到服务器。

服务器后台效果:
在这里插入图片描述

六、完整源码

已经整个工程文件上传到我的资源
点击跳转下载

七、参考资料

7天Java0基础速成安卓开发】Day4 MQTT Jar包的导入和物联网调试

以上是关于Android:通过MQTT实现用户端与服务器数据双向传输的主要内容,如果未能解决你的问题,请参考以下文章

Android使用MQTT订阅及发布消息(初步了解Mqtt以及实现Android操作mqtt服务)

MQTT与Mosquitto服务器搭建以及Android推送MQTT简介

node-red实现MQTT通讯

MQTT简单介绍与实现

android mqtt 使用踩坑与本地调试(含完整demo)

怎么实现服务器给android客户端主动推送消息