Mqtt从服务端到Android客户端搭建(Android客户端搭建)

一、简介

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。

此处不再引入官方文字描述,以个人开发认识浅谈一下

本文分为两部分:

1. MQTT基于window服务端的建立;

2. MQTT Android客户端的实现。

二、 Android客户端搭建

以我在github上的MQTT做详解, 链接:https://github.com/alanjuster/MQTT可以先跑起来,再往下看,同样你可以先下载预览在github基础上的apk或扫码预览。

Mqtt从服务端到Android客户端搭建(Android客户端搭建)_第1张图片
1549006103.png

在app下的build.gradle dependencies 下引入依赖资源

compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

同时在AndroidMainfest.xml 中注册依赖Service及必要的权限

创建mqttservice对象实例:


mqttService =new MyMqttService.Builder()

//设置自动重连

.autoReconnect(true)

//设置清除回话session  true(false) 不收(收)到服务器之前发出的推送消息

.cleanSession(true)

//唯一标示 保证每个设备都唯一就可以 建议 imei

.clientId(imei)

.userName("admin")

.passWord("password")

//mqtt服务器地址 格式例如:

//  tcp://iot.eclipse.org:1883

.serverUrl("tcp://192.168.1.31:61613")

//心跳包默认的发送间隔

.keepAliveInterval(20)

.timeOut(10)

//构建出EasyMqttService 建议用application的context

.bulid(this.getApplicationContext());

发起连接 ,在连接成功后订阅主题

 /**
     * 连接Mqtt服务器
     */
    private void connect() {
        mqttService.connect(new IEasyMqttCallBack() {
            @Override
            public void messageArrived(String topic, String message, int qos) {
                //推送消息到达
                Log.e(TAG, "message= " + message);
                rece.setText("收到消息:" + message +'\n' +"主题--> " + topic);

            }
            @Override
            public void connectionLost(Throwable arg0) {
                //连接断开
                try {
                    Log.e(TAG + "connectionLost", arg0.toString());
                    Toast.makeText(MainActivity.this, "connectionLost", Toast.LENGTH_SHORT).show();
                } catch (Exception e) {

                } finally {

                }
            }
            @Override
            public void deliveryComplete(IMqttDeliveryToken arg0) {
                Log.e(TAG + "@deliveryComplete", "发送完毕" + arg0.toString());
                Toast.makeText(MainActivity.this, "deliveryComplete", Toast.LENGTH_SHORT).show();
            }
            @Override
            public void connectSuccess(IMqttToken arg0) {
                Toast.makeText(MainActivity.this, "connectSuccess", Toast.LENGTH_SHORT).show();
                Log.e(TAG + "@@@@@connectSuccess", "success");
                subscribe();
            }
            @Override
            public void connectFailed(IMqttToken arg0, Throwable arg1) {
                //连接失败
                Log.e(TAG + "@@@@@connectFailed", "fail" + arg1.getMessage());
                Toast.makeText(MainActivity.this, "connectFailed", Toast.LENGTH_SHORT).show();
            }
        });
    }

主题订阅

/**
     * 订阅主题
     */
    private void subscribe() {
        String[] topics = new String[]{"test"};
        //主题对应的推送策略 分别是0, 1, 2 建议服务端和客户端配置的主题一致
        // 0 表示只会发送一次推送消息 收到不收到都不关心
        // 1 保证能收到消息,但不一定只收到一条
        // 2 保证收到切只能收到一条消息
        int[] qoss = new int[]{0};
        mqttService.subscribe(topics, qoss);
    }

发布消息:

/**
     * 发布消息
     */
    private void publish(String msg, String topic, int qos, boolean retained) {
        mqttService.publish(msg, topic, qos, retained);
    }

从MQTT服务端建立到客户端连接过程就是这样,其实在应用过程中都是客户端之间的通讯,服务端也就是一个类似数据转发的功能。

你可能感兴趣的:(Mqtt从服务端到Android客户端搭建(Android客户端搭建))