美文网首页
Android:MQTT协议推送消息之机顶盒项目(TV)

Android:MQTT协议推送消息之机顶盒项目(TV)

作者: ruancw | 来源:发表于2018-05-18 17:09 被阅读41次

前言:由于公司是做家校安全方面的,所以就有了学生考勤的需求,并要求可进行内外网进行切换。服务器端接收到学生的考勤刷卡信息后采用MQTT协议推送消息到客户端,客户端(TV)接收到推送消息后获取消息内容,将学生考勤刷卡信息展示到TV上。消息推送方式有持久连接(XMPP协议,MQTT,C2DM等)和轮询等方式。本文将介绍基于Paho的轻量级的MQTT协议在Android客户端的实现方式。

原理:MQTT:Message Queuing Telemetry Transport(队列消息遥测传输),MQTT协议是一个轻量级的消息发布/订阅协议,服务器端和客户端通过心跳包的方式进行连接,当服务器端有消息时,客户端通过订阅的相关主题(topic)接收服务器端传输的消息进行处理。

1.导入依赖

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0' 
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.0'

2.自定义MQTTService

MQTTService继承自Service(四大组件都需在清单文件中配置,稍后再说),重写onStartCommand、onBind等方法

(1)onStartCommand中初始化相关操作

private void init() {
  Log.d("", "clientId:" + clientId);
  // 服务器地址(协议+地址+端口号)
  //String uri = AppConstant.host;  String uri = AppConstant.getHost();
  Log.d("", "uri:" + uri);
  //基于paho的mqtt的MqttAndroidClient(实际上它继承自BroadcastReceiver并实现了IMqttAsyncClient)
  client = new MqttAndroidClient(this, uri, clientId);
  SpUtil.getInstance(Utils.getContext()).putClientId(clientId);
  // 设置MQTT监听并且接受消息
  client.setCallback(mqttCallback);
   //mqtt连接的参数设置
  conOpt = new MqttConnectOptions();
  // 清除缓存
  conOpt.setCleanSession(true);
  // 设置超时时间(单位:秒)
  conOpt.setConnectionTimeout(10);
  // 心跳包发送间隔(单位:秒)
  conOpt.setKeepAliveInterval(20);
  //设置用户名及密码
  if (!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(passWord)) {   
        conOpt.setUserName(userName);   
        conOpt.setPassword(passWord.toCharArray());
  }      
  //连接
  doClientConnection();
}

注:clientId可以用时间戳也可以用MqttClient.generateClientId()获取
2.mqttCallBack的监听接口

// MQTT监听并且接受服务器传来的消息
  private MqttCallback mqttCallback = new MqttCallback() {
        @Override
        public void messageArrived(String topic, MqttMessage message) throws Exception {
            String str1 = new String(message.getPayload());
            Log.i(TAG, "===========messageArrived:" + str1);
            MQTTMessage msg = new MQTTMessage();
            //topic 订阅的主题
            msg.setTopic(topic);
            //服务器传递的数据
            msg.setMsg(str1);
            //EventBus实现事件的传递
            EventBus.getDefault().post(msg);   
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken arg0) {

        }

        @Override
        public void connectionLost(Throwable arg0) {
            // 重连机制   
            doClientConnection();
      }
 }

3.连接MQTT服务器(doClientConnection)

private void doClientConnection() {
    //判断当前client及网络是否连接
    if (!client.isConnected() && netIsConnect()) {
         try  {
         //iMqttActionListener监听服务器及客户端是否订阅成功
         client.connect(conOpt, null, iMqttActionListener);    
         } catch (MqttException e) {
             e.printStackTrace();    
        }
    }
}

4.iMqttActionListener

// MQTT是否与服务器连接成功 
private IMqttActionListener iMqttActionListener = new IMqttActionListener() {
    @Override
    public void onSuccess(IMqttToken arg0) {
        Log.i(TAG, "连接成功 ");
        EventBus.getDefault().post(new MQTTConnStatus(true));
    }

    @Override
    public void onFailure(IMqttToken arg0, Throwable arg1) {
        arg1.printStackTrace();
        // 连接失败,重连
        EventBus.getDefault().post(new MQTTConnStatus(false));
  }
}

5.定义客户端订阅(subscribe)主题(topic)的相关方法

//主题订阅 
public static boolean subscribe(String[] topic) {
    int[] qosArray = new int[topic.length];
    for (int i = 0; i < qosArray.length; i++) {
        //VALUE_QOS为连接次数,默认为1次
        qosArray[i] = VALUE_QOS;
    }
    return subscribe(topic, qosArray); }
/**  
* 主题订阅 
* @param topic 主题  
* @param qos 连接次数  
* @return   
*/ 
public static boolean subscribe(String[] topic, int[] qos) {
    try {
        //调用client的方法订阅主题及设置每次连接的次数
        client.subscribe(topic, qos);
    } catch (MqttException e) {
        e.printStackTrace();
       return false;  
    }
    return true; }

3.AndroidMaifest配置

四大主件(Activity、Service、ContentProvider、BroadcastReceiver)在使用时均需在清单文件中进行配置,不然运行时会报错。

配置:

<!-- paho的MqttService -->
<service android:name="org.eclipse.paho.android.service.MqttService" />
<!-- 自定义的service --> 
<service android:name=".MQTTService" />

4.Activity中使用

(1)开启服务(startService)

startService(serviceIntent = new Intent(this, MQTTService.class));

(2)订阅主题(subscribe)

private void sub(String[] topic) {
    if (MQTTService.subscribe(topic)) {
        Log.d("", "订阅成功");
    } else {
        Log.d("", "订阅失败");
    }
}

Paho的官网地址:http://www.eclipse.org/paho/

基于Paho的MQTT协议推送消息的Android端就实现了,不足之处,欢迎斧正!!!

相关文章

  • Android:MQTT协议推送消息之机顶盒项目(TV)

    前言:由于公司是做家校安全方面的,所以就有了学生考勤的需求,并要求可进行内外网进行切换。服务器端接收到学生的考勤刷...

  • Android 网络(五) 推送

    互联网推送服务原理:长连接+心跳机制(MQTT协议)Android推送技术研究Android实现推送方式解决方案a...

  • Android消息推送-Mqtt

    Android及时通讯和消息推送 这里先简单说下两者区别 A → B 消息推送(在APP端,消息推送可以作为即时通...

  • 消息推送标准协议:MQTT

    随着物联网(Internet of Things,IoT)的兴起,机器之间(Machine-to-Machine,...

  • iOS MQTT协议笔记之消息推送

    前言 接到任务项目需要用MQTT来写消息推送,经过一段时间在网上查看资料后写下这篇文章,文章内容大都来自互联网,在...

  • MQTT协议

    MQTT轻量级物联网消息推送协议 1.概念 MQTT是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一...

  • 使用 Arduino 通过 MQTT 协议连接 HomeAssi

    前言 如果对于 MQTT 协议有一点了解的话,应该知道设备既可以推送消息给 MQTT 代理,也可以从 MQTT 代...

  • MQTT在Android上的二次封装

    MQTT在物联网上的运用十分的广泛,目前移动端的消息推送服务,数据直连服务等都是基于MQTT消息协议进行。阅读了很...

  • Android环境下 MQTT+Protocol Buffers

    Android环境下 MQTT+Protocol Buffers实现消息推送 ​ 曾记否,大学初识Androi...

  • Android消息推送MQTT实战

    1 前言 年初做了一款Android TV 应用,用到了MQTT。主要实现的是类似一些景区利用大屏幕实时显示景点人...

网友评论

      本文标题:Android:MQTT协议推送消息之机顶盒项目(TV)

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