采用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 = {0020};
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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值