如何采用mqtt协议实现android消息推送

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何采用mqtt协议实现android消息推送相关的知识,希望对你有一定的参考价值。

使用一个代理服务器message broker,客户端client连接上这个服务器,然后告诉服务器,可以接收哪些类型的消息,同时client也可以发布自己的消息,这些消息根据协议的内容,可以别的client获取。这样就实现了消息推送。
消息推送是通过一定的技术标准或协议,在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。
如果想要使用消息推送,推荐使用深圳极光的消息推送系统。深圳极光是国内首个为移动应用开发者提供专业、高效的消息推送服务的产品。品牌成长的过程,就是与客户肩并肩迈向成功的过程。极光将以市场为导向,以创新为动力,以技术为支持,不断用心努力,为每一位尊贵的客户提供极致的服务。

参考技术A   MQTT是一项消息传递技术,由IBM再2001年发布。

  总结一下,机制就是使用一个代理服务器messagebroker,
  客户端client连接上这个服务器,然后告诉服务器说,我可以接收哪些类型的消息,
  同时,client也可以发布自己的消息,这些消息根据协议的内容,可以被其他client获取。
  只要手机客户端,连上服务器,然后就可以接收和发布消息了,不用自己写socket什么了,

  低带宽,低耗电量,代码量也少,很简单吧。

  package com.pig.test.mqtt;

  import com.ibm.mqtt.MqttClient;

  import
  com.ibm.mqtt.MqttException;
  import com.ibm.mqtt.MqttSimpleCallback;

  public class SubscribeClient
  private final static String
  CONNECTION_STRING = "tcp://192.168.1.60:1883";
  private final static boolean
  CLEAN_START = true;
  private final static short KEEP_ALIVE =
  30;//低耗网络,但是又需要及时获取数据,心跳30s
  private final static String CLIENT_ID =
  "client1";
  private final static String[] TOPICS =
  
  "Test/TestTopics/Topic1",
  "Test/TestTopics/Topic2",
  "Test/TestTopics/Topic3",
  "tokudu/client1"
  ;
  private
  final static int[] QOS_VALUES = 0, 0, 2,
  0;
  
  //////////////////
  private MqttClient mqttClient =
  null;
  
  public SubscribeClient(String i)
  try
  mqttClient =
  new MqttClient(CONNECTION_STRING);
  SimpleCallbackHandler
  simpleCallbackHandler = new
  SimpleCallbackHandler();
  mqttClient.registerSimpleHandler(simpleCallbackHandler);//注册接收消息方法
  mqttClient.connect(CLIENT_ID+i,
  CLEAN_START, KEEP_ALIVE);
  mqttClient.subscribe(TOPICS,
  QOS_VALUES);//订阅接主题
  
  /**
  *
  完成订阅后,可以增加心跳,保持网络通畅,也可以发布自己的消息
  */
  mqttClient.publish(PUBLISH_TOPICS, "keepalive".getBytes(), QOS_VALUES[0],

  true);
  
   catch (MqttException e)
  // TODO Auto-generated
  catch block
  e.printStackTrace();
  
  

  /**
  * 简单回调函数,处理client接收到的主题消息
  * @author pig
  *
  
  */
  class SimpleCallbackHandler implements MqttSimpleCallback

  /**
  * 当客户机和broker意外断开时触发
  * 可以再此处理重新订阅
  
  */
  @Override
  public void connectionLost() throws Exception
  //
  TODO Auto-generated method
  stub
  System.out.println("客户机和broker已经断开");
  

  /**
  * 客户端订阅消息后,该方法负责回调接收处理消息
  */
  @Override
  public void
  publishArrived(String topicName, byte[] payload, int Qos, boolean retained)
  throws Exception
  // TODO Auto-generated method
  stub
  System.out.println("订阅主题: " +
  topicName);
  System.out.println("消息数据: " + new
  String(payload));
  System.out.println("消息级别(0,1,2): " +
  Qos);
  System.out.println("是否是实时发送的消息(false=实时,true=服务器上保留的最后消息): " +
  retained);
  
  
  
  
  /**
  * 高级回调
  * @author pig
  
  *
  */
  class AdvancedCallbackHandler implements MqttSimpleCallback

  @Override
  public void connectionLost() throws Exception
  //
  TODO Auto-generated method stub
  
  

  @Override
  public void publishArrived(String arg0, byte[] arg1, int
  arg2,
  boolean arg3) throws Exception
  // TODO Auto-generated
  method stub
  
  
  
  
  
  /**
  * @param args
  
  */
  public static void main(String[] args)
  // TODO Auto-generated
  method stub
  new SubscribeClient("" + i);

  

  

  broker服务器,MQTT的jar包,记得下载啊,没有就消息我咯~

  到这里,如果完成IBM的MQTT协议实现push消息的实例的,
  都会有个问题,好像没考虑到安全问题,如果客户端连上来作乱怎么办呢?

  上面用的broker时rsmb的,mqtt的简单服务器。
  IBM已经推出了MQTT V3.1版本,已经加入了安全验证机制,不要怕啦。

  转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦本回答被提问者和网友采纳

互联网推送服务原理:长连接+心跳机制(MQTT协议)

互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢:

 

 

  在写之前,我们首先了解一下为什么Android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给

服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手,这个握手是让双方都知道他们之间的连接是没有断开,客户端是在线

的。如果超过一个时间的阈值,客户端没有收到服务器的应答,或者服务器没有收到客户端的心跳,那么对客户端来说则断开与服务器的连接重新建立一个

连接,对服务器来说只要断开这个连接即可。那么在智能手机上的长连接心跳和在Internet上的长连接心跳有什么不同的目的呢?原因就在于智能手机使用的

是移动无线网络,那么我们在讲长连接之前我们首先要了解无线移动网络的特点。

1.无线移动网络的特点:

        当一台智能手机连上移动网络时,其实并没有真正连接上Internet,运营商分配给手机的IP其实是运营商的内网IP,手机终端要连接上Internet还必须通过运营

商的网关进行IP地址的转换,这个网关简称为NAT(NetWork Address Translation),简单来说就是手机终端连接Internet 其实就是移动内网IP,端口,外网IP之间

相互映射。相当于在手机终端在移动无线网络这堵墙上打个洞与外面的Internet相连。原理图如下:(来源网络)

 

        GGSN(GateWay GPRS Support Note 网关GPRS支持节点)模块就实现了NAT功能,由于大部分的移动无线网络运营商为了减少网关NAT映射表的负荷,如

果一个链路有一段时间没有通信时就会删除其对应表,造成链路中断,正是这种刻意缩短空闲连接的释放超时,原本是想节省信道资源的作用,没想到让互联网

的应用不得以远高于正常频率发送心跳来维护推送的长连接。这也是为什么会有之前的信令风暴,微信摇收费的传言,因为这类的应用发送心跳的频率是很短的,

既造成了信道资源的浪费,也造成了手机电量的快速消耗。

2.android系统的推送和IOS的推送有什么区别:

        首先我们必须知道,所有的推送功能必须有一个客户端和服务器的长连接,因为推送是由服务器主动向客户端发送消息,如果客户端和服务器之间不存在一

个长连接那么服务器是无法来主动连接客户端的。因而推送功能都是基于长连接的基础是上的。

        IOS长连接是由系统来维护的,也就是说苹果的IOS系统在系统级别维护了一个客户端和苹果服务器的长链接,IOS上的所有应用上的推送都是先将消息推送

到苹果的服务器然后将苹果服务器通过这个系统级别的长链接推送到手机终端上,这样的的几个好处为:1.在手机终端始终只要维护一个长连接即可,而且由于

这个长链接是系统级别的不会出现被杀死而无法推送的情况。2.省电,不会出现每个应用都各自维护一个自己的长连接。3.安全,只有在苹果注册的开发者才能

够进行推送,等等。

       android的长连接是由每个应用各自维护的,但是google也推出了和苹果技术架构相似的推送框架,C2DM,云端推送功能,但是由于google的服务器不在中

国境内,其他的原因你懂的。所以导致这个推送无法使用,android的开发者不得不自己去维护一个长链接,于是每个应用如果都24小时在线,那么都得各自维

护一个长连接,这种电量和流量的消耗是可想而知的。虽然国内也出现了各种推送平台,但是都无法达到只维护一个长连接这种消耗的级别。

3.推送的实现方式:

一:客户端不断的查询服务器,检索新内容,也就是所谓的pull 或者轮询方式

二:客户端和服务器之间维持一个TCP/IP长连接,服务器向客户端push

三:服务器又新内容时,发送一条类似短信的信令给客户端,客户端收到后从服务器中下载新内容,也就是SMS的推送方式

苹果的推送系统和googleC2DM推送系统其实都是在系统级别维护一个TCP/IP长连接,都是基于第二种的方式进行推送的。第三种方式由于运营商没有免费开放

这种信令导致了这种推送在成本上是无法接受的,虽然这种推送的方式非常的稳定,高效和及时。

如果想了解android中各种推送方式请参考这个链接:Android实现推送方式解决方案 这篇博客已经介绍的非常好了。

以上是关于如何采用mqtt协议实现android消息推送的主要内容,如果未能解决你的问题,请参考以下文章

android消息推送,使用MQTT协议,谁有用java写过服务端

android消息推送GCM、XMPP、MQTT三种方案的优劣,越仔细越好,有具体分析更好!

MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制

移动互联网消息推送原理:长连接+心跳机制(MQTT协议)

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

android系统的APP消息推送机制