这段时间学习了推送技术,对xmpp和mqtt 协议做了下比较。

xmpp基于xml信息传递,所以传输信息量比较大,在保持长链接情况下功耗会比较大。

可能还是比较适合用来做聊天之类的通讯应用,而对于智能和物联低功耗设备的推送来说,感觉比较笨重。

而mqtt协议就是针对网络带宽低,高延时,通信不稳定的环境设计的,特别适合物联设备。低通讯量连接保持,简约轻便。

  • 提供了发布/订阅模式,只要订阅了,即使发布时客户端离线,等再次上线时还能收到消息。
  • 提供了发布反馈,客户端收到消息反馈等机制。
  • 提供了发布质量,比如至多一次,至少一次,只有一次。可以根据不同业务要求进行选择。
  • 提供了心跳机制,可自行设置心跳
  • 提供了鉴权机制

可见,提供的功能已经很完整了。

mqtt 详细协议可见:

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

中文版的:

http://wenku.baidu.com/link?url=eyG24CVjmmA_J5KbR_Y8xzDOkq5YsrChshcHxcZQzav2OcVE9KNxukXr1uix1ACPTw36QIKwHRTmLqjM1Bm7qqPwVQYG9BzIv_BdJvPoU8_

现在有很多基于mqtt的开源实现,包含客户端和服务器端(或者说中间件)。

我做了一个demo,客户选用paho 提供client-mqtt 和 android server库,中间件是apollo。

apollo 下载地址:

http://activemq.apache.org/apollo/download.html

下载完解压按照里面的readme 建立和运行自己的broker,依赖java运行环境。

client-mqtt 和 android server库地址:

http://mvnrepository.com/artifact/org.eclipse.paho
https://www.versioneye.com/java/org.eclipse.paho:org.eclipse.paho.client.mqttv3/1.1.0

可以直接把jar文件导入工程,但是我选择的是把源码放入,因为这样可以根据自己的需要对源码做修改。
在 android studio上:
1.把jar放入很简单:放到model libs目录下,右键 As libraries就可以了。
2. 源码放入,把sources.jar 分别解压,放到对应java目录下。

3. client.mqtt3 里包含了java的.properties 文件, 它们是针对多语言的,这点和android的设计不一样,所以android studio编译时是不能直接把它们打包到class文件里面的。需要单独把它们打包成jar放到lib目录下,这样在运行过程就不会报找不到它们了。

打包很简单,新建org\eclipse\paho\client\mqttv3\internal\nls 目录,把它们都放到这个目录下。

然后在org 目录外执行 jar -cvf  properties.jar ./*  , 之后把properties.jar 放入libs下。

4. 在androidManifest 里面添加

<service android:name="org.eclipse.paho.android.service.MqttService">
</service>

5. 在自己的activity或者service里面通过调用paho.android.service  MqttAndroidClient 类实现发布和订阅。

package com.tww.test;import android.content.ComponentName;
import android.content.Context;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.PowerManager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.android.service.MqttTraceHandler;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttSecurityException;
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;import java.io.IOException;
import java.io.InputStream;import javax.net.ssl.SSLSocketFactory;public class MainActivity extends AppCompatActivity  implements View.OnClickListener,ServiceConnection, MqttCallback, IMqttActionListener,MqttTraceHandler {private static final String TAG = "MainActivity";private Button mButton;private MqttAndroidClient mMqttAndroidClient;private String host = "tcp://192.168.43.224:61613";private String userName = "admin";private String passWord = "password";private IMqttToken mConnectToken;private PowerManager.WakeLock mWakeLock;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mButton = (Button) findViewById(R.id.button);mButton.setOnClickListener(this);mMqttAndroidClient = new MqttAndroidClient(this,host,"123456789",new MqttDefaultFilePersistence(getCacheDir().getAbsolutePath()));mMqttAndroidClient.setCallback(this);mMqttAndroidClient.setTraceEnabled(true);mMqttAndroidClient.setTraceCallback( this);Log.d(TAG,"onCreate");MqttConnectOptions options = new MqttConnectOptions();options.setCleanSession(true);options.setUserName(userName);options.setPassword(passWord.toCharArray());options.setConnectionTimeout(60);options.setKeepAliveInterval(2*60);options.setMqttVersion(3);try {InputStream caInput = getResources().getAssets().open("keystore.bks");if(caInput!=null){Log.d(TAG,"do setSocketFactory");SSLSocketFactory sslSocketFactory = mMqttAndroidClient.getSSLSocketFactory(caInput,"password");options.setSocketFactory(sslSocketFactory);}} catch (IOException e) {e.printStackTrace();Log.e(TAG,"do connect IOException:"+e);}catch (MqttSecurityException e) {e.printStackTrace();Log.e(TAG,"do connect MqttSecurityException:"+e);}try {Log.d(TAG,"do connect");mConnectToken = mMqttAndroidClient.connect(options,this);} catch (MqttException e) {Log.e(TAG,"connect MqttException:"+e);e.printStackTrace();}PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);mWakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, TAG);mWakeLock.setReferenceCounted(false);mWakeLock.acquire();}@Overrideprotected void onDestroy(){super.onDestroy();if(mMqttAndroidClient != null){try {mMqttAndroidClient.disconnect();} catch (MqttException e) {e.printStackTrace();}mMqttAndroidClient.close();}mWakeLock.release();}@Overridepublic void onClick(View v) {if(v.getId()==R.id.button){}}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.d(TAG,"onServiceConnected");}@Overridepublic void onServiceDisconnected(ComponentName name) {Log.d(TAG,"onServiceDisconnected");}@Overridepublic void connectionLost(Throwable throwable) {Log.d(TAG,"connectionLost");}@Overridepublic void messageArrived(String s, MqttMessage mqttMessage) throws Exception {Log.d(TAG,"messageArrived:"+mqttMessage.toString());}@Overridepublic void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {Log.d(TAG,"deliveryComplete");}@Overridepublic void onSuccess(IMqttToken iMqttToken) {if(mConnectToken.equals(iMqttToken)){try {Log.d(TAG,"connect success, do subscribe");mMqttAndroidClient.subscribe("test",1);} catch (MqttException e) {e.printStackTrace();}}}@Overridepublic void onFailure(IMqttToken iMqttToken, Throwable throwable) {if(mConnectToken.equals(iMqttToken)){Log.d(TAG,"onFailure success:"+throwable.toString());}}@Overridepublic void traceDebug(String s, String s1) {Log.d(s,s1);}@Overridepublic void traceError(String s, String s1) {Log.e(s,s1);}@Overridepublic void traceException(String s, String s1, Exception e) {Log.e(s,s1,e);}
}

基于MQTT的消息推送相关推荐

  1. Knative 实战:基于 Kafka 实现消息推送

    作者 | 元毅 阿里云智能事业群高级开发工程师 导读:当前在 Knative 中已经提供了对 Kafka 事件源的支持,那么如何基于 Kafka 实现消息推送呢?本文作者将以阿里云 Kafka 产品为 ...

  2. Activemq MQTT 简单消息推送示例

    Activemq MQTT 简单消息推送示例 简介     简单使用 MQTT 连接 Activemq 进行消息推送的示例代码 编写详情 环境准备     使用docker启动Activemq,查看M ...

  3. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

  4. Android MQTT实现消息推送

    飞哥语录:编程说白了就是发送数据,接收数据,处理数据. 1.概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有 ...

  5. netty多台服务器 推送消息,基于Netty的消息推送服务器集群设计与实现

    徐龙光 何顶新 摘 要:消息推送是当前移动应用中十分必要的一项技术,服务者需要使用消息推送以保持用户活跃度,提高应用存留率.为了满足消息推送的需求和增强推送系统的性能,采用Netty网络编程框架并搭建 ...

  6. 基于Python的消息推送(钉钉、微信、QQ)

    文章目录 前言 一.钉钉机器人 1. 新建群聊 2. 添加机器人 3. 设置机器人 4. 程序编写 二.Server酱(微信) 1. 注册登录 2. 获取设置 3. 程序编写 二.Qmsg酱(QQ) ...

  7. 基于mqtt协议的消息推送服务器,基于 MQTT 协议的推送服务

    一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...

  8. push msg php_基于web-msg-sender进行消息推送

    简介 web-msg-sender是一款web长连接推送框架,采用PHPSocket.IO开发,基于WebSocket长连接通讯,如果浏览器不支持WebSocket则自动转用comet推送. 通过后台 ...

  9. 浏览器WebSocket连接apollo的MQTT实现消息推送(WEB系统微信扫码登录)

    序 一直就想搭建消息队列的,因为目前业务发展还没有到这块,一直没有搭建.刚好今天接到的一个需求是web系统实现微信扫码登录,另外我们的微信对接是统一的中台接口对接,所以我们没办法做到回调我们的web业 ...

最新文章

  1. Latex快速入门, Windows 安装使用编译技巧归纳
  2. 查询局域网内在线电脑IP
  3. Nginx服务学习(6)-日志模块
  4. springboot如何对本地数据库增删改查_SpringBoot整合Mybatis实现数据库增删改查
  5. Hive 终于等来了 Flink
  6. 信息学奥赛C++语言:某年某月天数
  7. mysql 索引的简单使用
  8. Ubuntu定制live cd
  9. 机器学习笔记——支持向量机
  10. HadoopDB GlobalHasher的参数问题
  11. yum更换国内源、yum下载rpm包  源码包安装
  12. 修复oracle注册表,老司机修复oracle卸载干净【调解方案】
  13. mini6410 LED驱动程序及LED测试程序的设计
  14. 经典策略之Dual Trust策略
  15. 地理信息系统GIS基础知识
  16. uiautomatorviewer 双击闪退问题
  17. 内存规格的解释(Unbuffered DIMM,Registered DIMM和SODIMM)
  18. pcl opencv ROS_message三者之间点云和图片类型转换总结
  19. 白话理解java多线程之setDaemon()方法
  20. ubuntu下命令行禁用笔记本触摸板

热门文章

  1. uni-app使用地图功能打包安卓apk注意事项
  2. 慧数汽车纵览:“一口价”新零售购车成趋势
  3. 科普-动量和能量、一维势能曲线
  4. 语音信号分析之FFT变换过程
  5. 优漫动游:UI设计培训课程的内容是什么?UI设计培训多久呢?
  6. 码率自适应---RTCP goog-remb
  7. 土壤水分测量仪分成监测土壤剖面墒情值
  8. Python编程拾遗
  9. java中setattr功能___setattr__: 限制属性类型
  10. Java泛型详解:泛型类、泛型方法使用