美文网首页
MQTT在Android中的使用

MQTT在Android中的使用

作者: 妖苔 | 来源:发表于2018-05-14 17:29 被阅读66次

首先要明白,MQTT通信是客户端和客户端之间的相互订阅,MQTT中只存在一个服务器,作为消息的中转站,其余客户端之间通过订阅对应的Topic来扮演客户端和服务端的角色,服务器的搭建比较麻烦,有兴趣的可以了解下

public class Client {
private static final String HOST = "tcp://119.11.111.111:1111";//服务器地址,自己搭建
private String TOPIC;//订阅的主题
private String CLIENT_ID;

public Client(String clientId, String topic) {
    this.CLIENT_ID = clientId;
    this.TOPIC = topic;
}

private String username = "admin";
private String password = "123456";

public void start() {
    try {
        //MqttAsyncClient
        MqttClient mqttClient = new MqttClient(HOST, CLIENT_ID, new MemoryPersistence());
        MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
        // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,设置为true表示每次连接到服务器都以新的身份连接
        mqttConnectOptions.setCleanSession(false);
        mqttConnectOptions.setUserName(username);
        mqttConnectOptions.setPassword(password.toCharArray());
        mqttConnectOptions.setConnectionTimeout(10);
        // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
        mqttConnectOptions.setKeepAliveInterval(20);
        mqttClient.setCallback(new MyMqttCallback());
        MqttTopic topic = mqttClient.getTopic(TOPIC);
        //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
        //遗嘱
        // options.setWill(topic, "close".getBytes(), 2, true);
        mqttClient.connect(mqttConnectOptions);
        int[] Qos = {2};//消息等级最高2最低1
        String[] topic1 = {TOPIC};
        Log.e("xxx", "topic1[0]=" + topic1[0] + "Qos=" + Arrays.toString(Qos));
        mqttClient.subscribe(topic1, Qos);
    } catch (MqttException e) {
        Log.e("xxx", "createClientError" + e.getMessage());
        e.printStackTrace();
    }
}
}

以上是客户端,需要注意的是不要重复订阅,订阅之前先判断Top是否为空,不为空且则订阅

下面是服务端

class Service {
private static final String HOST = "tcp://119.11.111.111:1111";
private static final String TOPIC = "192.111.1.1111";//发布到那个主题,所有订阅该主题的客户端都能收到
private String CLIENT_ID;

private MqttMessage message;

private MqttClient client;
private MqttTopic topic11;
private Service service = null;


Service(String clientId) throws MqttException {
    this.CLIENT_ID = clientId;
    client = new MqttClient(HOST, clientId, new MemoryPersistence());
    connect();
}

private void connect() {
    MqttConnectOptions options = new MqttConnectOptions();
    options.setCleanSession(false);
    String username = "admin";
    options.setUserName(username);
    String password = "123456";
    options.setPassword(password.toCharArray());
    // 设置超时时间
    options.setConnectionTimeout(20);
    // 设置会话心跳时间
    options.setKeepAliveInterval(10);
    try {
        client.setCallback(new MyMqttCallback());
        client.connect(options);
        //创建MQTT相关的主题
        topic11 = client.getTopic(TOPIC);
        Log.e("xxx", "topic11=" + topic11);
    } catch (Exception e) {
        Log.e("xxx", e.getMessage());
        e.printStackTrace();
    }
}

private void publish(MqttTopic topic, MqttMessage mqttMessage) throws MqttException {
    Log.e("xxx", "topic=" + topic);
    MqttDeliveryToken token = topic.publish(mqttMessage);
    token.waitForCompletion();
    Log.e("xxx", "消息发布成功" + token.isComplete());
}

void startService() {
    new Thread(() -> {
        Service service;
        try {
            service = new Service(CLIENT_ID);
            service.message = new MqttMessage();
            service.message.setQos(2);
            //设置是否在服务器中保存消息体
            service.message.setRetained(true);
            int cc = 0;
            //noinspection InfiniteLoopStatement
            while (true) {
                cc++;
                String s = "这是推送消息的内容" + cc;
                Log.e("xxx", "准备发送消息" + s);
                service.message.setPayload(s.getBytes());
                Log.e("xxx", "service=" + service + "message=" + service.message);
                service.publish(service.topic11, service.message);
                Log.e("xxx", "Retained状态=" + service.message.isRetained());
                Thread.sleep(3000);
            }
        } catch (MqttException | InterruptedException e) {
            e.printStackTrace();
        }
    }).start();
}

下面是回调,注册监听就好了

public class MyMqttCallback implements MqttCallback {
@Override
public void connectionLost(Throwable throwable) {
    Log.e("xxx", "connectionLost:" + throwable.getMessage());
}

@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
    Log.e("xxx", "消息主题=" + s + "=======接收消息Qos=" + mqttMessage.getQos() + "=======接受消息内容=" + new String(mqttMessage.getPayload()));
}

@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
    Log.e("xxx", "deliveryComplete:" + iMqttDeliveryToken.isComplete());

}

}

具体演示的话建一个Activity 加量按钮,一个发,一个收就好了。其他的没啥了重复订阅会造成一开始就一定会受到消息。还有需要注意的是Qos级别根据需求设置我这里都是2。

相关文章

  • MQTT在Android中的使用

    首先要明白,MQTT通信是客户端和客户端之间的相互订阅,MQTT中只存在一个服务器,作为消息的中转站,其余客户端之...

  • MQTT在Android中的使用

    MQTT简介 MQTT 是一种基于发布订阅模型的即时通讯协议,主要应用于物联网设备中 配置 添加依赖在projec...

  • Android客户端通过Paho MQTT和Broker建立SS

    MQTT是物联网时代的基础通讯协议。Paho Mqtt Client是android应用开发中广泛使用的Mqtt ...

  • Flutter通过Mqtt消费ActivieMQ

    Flutter通过mqtt消费activemq,在android端主要使用插件的方式进行 处理流程 Android...

  • Android 中MQTT协议的使用

    前言 项目中有用到mqtt,碰巧没人负责这一块,所以毛遂自荐就看了一波,下面是一些简单的使用记录,写得不好,仅供参...

  • MQTT在 iOS工程中的使用

    1、MQTT MQTT 是轻量的(Lightweight)、发布订阅模式(PubSub) 的物联网消息协议。 两种...

  • 使用Node.js实现mqtt协议

    记录一下自己学习mqtt的过程,如何从零开始使用Node.js实现mqtt协议,实现一个web页面向android...

  • Android使用MQTT协议

    MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。jar包下载地址:...

  • Android使用MQTT通讯

    前言 主要讲下Android如何使用MQTT通讯。用到的软件或者框架有: EMQ:https://www.emqx...

  • MQTT协议学习与在Java(Android通用)中的使用

    写在前面 最近有需求要了解一下各个推送的协议,目前了解到实现推送的三个主要方式:MQTT、XMPP和Google ...

网友评论

      本文标题:MQTT在Android中的使用

      本文链接:https://www.haomeiwen.com/subject/lxwruxtx.html