采用MQTT协议实现android消息推送

发布时间:2016-12-11 17:59:53 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"采用MQTT协议实现android消息推送",主要涉及到采用MQTT协议实现android消息推送方面的内容,对于采用MQTT协议实现android消息推送感兴趣的同学可以参考一下。

MQ 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如,但不仅限于此: 网络代价昂贵,带宽低、不可靠。在嵌入设备中运行,处理器和内存资源有限。 该协议的特点有: 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。对负载内容屏蔽的消息传输。使用 TCP/IP 提供网络连接。有三种消息发布服务质量: “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。“至少一次”,确保消息到达,但消息重复可能会发生。“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制 MQTT最简单的使用包括两种,一种是发消息,一种是订阅消息。 发消息就是向一个固定IP地址的某个主题发送消息(publish) 订阅消息是向服务器端订阅某些主题,当其他客户端向服务器的这个主题广播消息时,那么所有订阅这个主题的客户端就都能收到了 MQTT是一项消息传递技术,由IBM再2001年发布。 总结一下,机制就是使用一个代理服务器message broker, 客户端client连接上这个服务器,然后告诉服务器说,我可以接收哪些类型的消息, 同时,client也可以发布自己的消息,这些消息根据协议的内容,可以被其他client获取。 只要手机客户端,连上服务器,然后就可以接收和发布消息了,不用自己写socket什么了, 低带宽,低耗电量,代码量也少,很简单吧。 package com.pig.test.mqtt; 002   003 import com.ibm.mqtt.MqttClient; 004 import com.ibm.mqtt.MqttException; 005 import com.ibm.mqtt.MqttSimpleCallback; 006   007 public class SubscribeClient { 008  private final static String CONNECTION_STRING = "tcp://192.168.1.60:1883"; 009  private final static boolean CLEAN_START = true; 010  private final static short KEEP_ALIVE = 30;//低耗网络,但是又需要及时获取数据,心跳30s 011  private final static String CLIENT_ID = "client1"; 012  private final static String[] TOPICS = { 013   "Test/TestTopics/Topic1", 014   "Test/TestTopics/Topic2", 015   "Test/TestTopics/Topic3", 016   "tokudu/client1" 017  }; 018  private final static int[] QOS_VALUES = {0, 0, 2, 0}; 019    020  ////////////////// 021  private MqttClient mqttClient = null; 022    023  public SubscribeClient(String i){ 024   try { 025    mqttClient = new MqttClient(CONNECTION_STRING); 026    SimpleCallbackHandler simpleCallbackHandler = new SimpleCallbackHandler(); 027    mqttClient.registerSimpleHandler(simpleCallbackHandler);//注册接收消息方法 028    mqttClient.connect(CLIENT_ID+i, CLEAN_START, KEEP_ALIVE); 029    mqttClient.subscribe(TOPICS, QOS_VALUES);//订阅接主题 030      031    /** 032     * 完成订阅后,可以增加心跳,保持网络通畅,也可以发布自己的消息 033     */ 034   035    mqttClient.publish(PUBLISH_TOPICS, "keepalive".getBytes(), QOS_VALUES[0], true); 036      037   } catch (MqttException e) { 038    // TODO Auto-generated catch block 039    e.printStackTrace(); 040   } 041  } 042   043  /** 044   * 简单回调函数,处理client接收到的主题消息 045   * @author pig 046   * 047   */ 048  class SimpleCallbackHandler implements MqttSimpleCallback{ 049   050   /** 051    * 当客户机和broker意外断开时触发 052    * 可以再此处理重新订阅 053    */ 054   @Override 055   public void connectionLost() throws Exception { 056    // TODO Auto-generated method stub 057    System.out.println("客户机和broker已经断开"); 058   } 059   060   /** 061    * 客户端订阅消息后,该方法负责回调接收处理消息 062    */ 063   @Override 064   public void publishArrived(String topicName, byte[] payload, int Qos, booleanretained) throws Exception { 065    // TODO Auto-generated method stub 066    System.out.println("订阅主题: " + topicName); 067    System.out.println("消息数据: " + new String(payload)); 068    System.out.println("消息级别(0,1,2): " + Qos); 069    System.out.println("是否是实时发送的消息(false=实时,true=服务器上保留的最后消息): " + retained); 070   } 071     072  } 073    074  /** 075   * 高级回调 076   * @author pig 077   * 078   */ 079  class AdvancedCallbackHandler implements MqttSimpleCallback{ 080   081   @Override 082   public void connectionLost() throws Exception { 083    // TODO Auto-generated method stub 084      085   } 086   087   @Override 088   public void publishArrived(String arg0, byte[] arg1, int arg2, 089     boolean arg3) throws Exception { 090    // TODO Auto-generated method stub 091      092   } 093     094  } 095    096  /** 097   * @param args 098   */ 099  public static void main(String[] args) { 100   // TODO Auto-generated method stub 101    new SubscribeClient("" + i); 102   103  } 104   105 } 来自:http://www.open-open.com/lib/view/open1352431806309.html

上一篇:关于load average
下一篇:数据结构(2)——队

相关文章

相关评论