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

[原]采用MQTT协议实现Android消息推送

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

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.csdn.net/joshua_yu/article/details/6563587
看了上面这些文章的内容,完成上面的例子,
然后看看源码,应该明白一些了。

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

总结一下,机制就是使用一个代理服务器message broker,
客户端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版本,已经加入了安全验证机制,不要怕啦。
据国外网友说,facebook在2011年8月就是用的mqtt v3.1做的应用哦。

到这里MQTT学习资料整理差不多了,下篇,mqtt v3.1版本服务器的测试使用。

时间: 2024-10-31 18:41:24

采用MQTT协议实现Android消息推送的相关文章

基于xmpp openfire smack开发之Android消息推送技术原理分析和实践[4]

前面几篇给大家系统讲解的有关xmpp openfire smack asmack相关的技术和使用,大家如果有所遗忘可以参考 基于xmpp openfire smack开发之openfire介绍和部署[1] 基于xmpp openfire smack开发之smack类库介绍和使用[2] 基于xmpp openfire smack开发之Android客户端开发[3]   顺便也一起回顾下xmpp的历程 xmpp协议起源于著名的Linux即时通讯服务服务器jabber,有时候我们会把xmpp协议也叫j

消息接收-Android消息推送与接收

问题描述 Android消息推送与接收 亲们,问一个问题.就是,有两个应用程序分别装在两个手机上,如何实现其中一端呼叫,另一端会有反应.而且另一端时刻准备着接受前一端的呼叫.这是用什么实现的? 解决方案 socket通讯,可以通过一台公共服务器中转,如果你想用消息推送,可以用腾讯信鸽或百度推送,做一个后台推送服务,一个手机需要告知另一个时,调用一下后台发送接口,另一个收到后,处理 解决方案二: 建议楼主看一下MQTT,这个开源的项目,应该可以实现楼主的需求.

android消息推送-Android消息推送干什么用呀?

问题描述 Android消息推送干什么用呀? Android的消息推送干什么用呀?是从服务器推送过来的么?还是服务器有更新之后,手机端解析了数据之后,在用户打来软件的时候再推送? 解决方案 服务器调用第三方的接口,推送到你手机上,提醒你某个业务有新动作了,即使app不启动,也是可以推送的,微信,qq你总该用过吧 解决方案二: android消息推送Android消息推送Android中的消息推送 解决方案三: 信鸽和JPush都挺好用的

Android消息推送:手把手教你集成小米推送(附demo)_Android

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo概况 目录说明: DemoApplication类 继承自Application类,其作用主要是:设置App的ID & Key.注册推送服务 DemoMessageReceiver类 继承自

Android消息推送实现程序

1.消息推送机制 服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭. 我想到了一句话:don't call me,i will call you! qq今天在右下角弹出了一个对话框:"奥巴马宣布本拉登挂了-",正是如此. 自作聪明,就会带点小聪明,有人喜欢就有人讨厌. 2.独立进程 无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务. 我们需要一个独立进程的后台服务. 在androidmanifest.xml中注册s

工信部放大招:将统一 Android 消息推送标准

由于一些特殊的原因,在国内的用户无法享受到谷歌安卓系统提供的 GMS 消息推送服务,不少国产安卓软件接收消息依靠后台服务存在,也由此出现了用户反映的耗电以及占用内存问题,不过未来这一问题有望得到全面解决. 据工信部旗下泰尔终端实验室发布消息称,各个终端厂商的系统级推送通道不可避免的存在差异性,因此,开发者同时接入.维护多条推送通道存在着一定的困难.在此背景下,泰尔终端实验室联合包括华为.OPPO.vivo.小米.三星.魅族.金立.努比亚.谷歌.百度.阿里巴巴.腾讯.个推.极光等国外内主要相关企业

Android消息推送:手把手教你集成小米推送(附demo)

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo概况 目录说明: DemoApplication类 继承自Application类,其作用主要是:设置App的ID & Key.注册推送服务 DemoMessageReceiver类 继承自

Android应用中消息推送完美方案分享

1.消息推送基础 消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术.推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间.它根据用户的兴趣来搜索.过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息 当我们开发需要和服务器交互的移动应用时,基本上都需要和服务器进行交互,包括上传数据到服务器,同时从服务器上获取数据. 一般情况下,客户端与服务器之间通讯客户端是主动的,但这就存在一个问题就是一旦服务器数据有更新或者服务器要下发通知给客户端只能等客户端连接的

android 个推的消息推送

问题描述 android 个推的消息推送 我要实现的是收到个推的通知之后更新UI界面,但是通知要点击之后才会触发receiver,这个怎么解决? 解决方案 Android消息推送android消息推送Android消息推送