基于MQTT协议推送Android消息

本文探讨了不同消息推送方案,并详细介绍了使用IBM的MQTT协议实现推送消息的技术细节,包括客户端如何连接服务器、订阅主题及处理消息等。

对于消息推送,一开始还真不知道什么方式比较好,一头雾水,现在回顾总结下资料。

http://zheye.org/asks/4d99a1aafd503c41d700000a
通过上面者也里面的回复,得到一些信息。
1.官方的C2DM,但是只支持android2.2及以上平台的,而且使用的google的服务器。
对于google服务器的问题,网友应该都清楚,天朝的大中华区局域网总是让它不时的给你断一下。

2.第三方的androidpn,和C2DM一样,都是基于XMPP扩展的,是一个开源的项目,据说不错。
http://sourceforge.net/projects/androidpn/
但是是基于长连接的,如果客户端数量大,特别像手机这种都是长期在线的设备,
会有两个问题,(1)服务器压力,(2)手机的电池不够用啊,电量卡卡卡的被你耗光了(需要优化网络机制)。

3.使用IBM 的MQTT协议实现push消息
地址:http://tokudu.com/2010/how-to-implement-push-notifications-for-android/
这是一个非常理想的解决方案,是基于tcp协议的,低带宽通信,而且国外友人已经测试,耗电量很多哦~

都是E文的,不习惯看E文的,也没关系,有一前辈给整理了一个中文的:
《Android推送通知指南》http://blog.youkuaiyun.com/joshua_yu/article/details/6563587
看了上面这些文章的内容,完成上面的例子,
然后看看源码,应该明白一些了。

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

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

只要手机客户端,连上服务器,然后就可以接收和发布消息了,不用自己写socket什么了,

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

001package com.pig.test.mqtt;
002
003import com.ibm.mqtt.MqttClient;
004import com.ibm.mqtt.MqttException;
005import com.ibm.mqtt.MqttSimpleCallback;
006
007public 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, boolean retained) 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}

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

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

上面用的broker时rsmb的,mqtt的简单服务器。
IBM已经推出了MQTT V3.1版本,已经加入了安全验证机制,不要怕啦。
据国外网友说,facebook在2011年8月就是用的mqtt v3.1做的应用哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值