基于MQTT的消息推送
这段时间学习了推送技术,对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库地址:
![](/assets/blank.gif)
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的消息推送相关推荐
- Knative 实战:基于 Kafka 实现消息推送
作者 | 元毅 阿里云智能事业群高级开发工程师 导读:当前在 Knative 中已经提供了对 Kafka 事件源的支持,那么如何基于 Kafka 实现消息推送呢?本文作者将以阿里云 Kafka 产品为 ...
- Activemq MQTT 简单消息推送示例
Activemq MQTT 简单消息推送示例 简介 简单使用 MQTT 连接 Activemq 进行消息推送的示例代码 编写详情 环境准备 使用docker启动Activemq,查看M ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- Android MQTT实现消息推送
飞哥语录:编程说白了就是发送数据,接收数据,处理数据. 1.概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有 ...
- netty多台服务器 推送消息,基于Netty的消息推送服务器集群设计与实现
徐龙光 何顶新 摘 要:消息推送是当前移动应用中十分必要的一项技术,服务者需要使用消息推送以保持用户活跃度,提高应用存留率.为了满足消息推送的需求和增强推送系统的性能,采用Netty网络编程框架并搭建 ...
- 基于Python的消息推送(钉钉、微信、QQ)
文章目录 前言 一.钉钉机器人 1. 新建群聊 2. 添加机器人 3. 设置机器人 4. 程序编写 二.Server酱(微信) 1. 注册登录 2. 获取设置 3. 程序编写 二.Qmsg酱(QQ) ...
- 基于mqtt协议的消息推送服务器,基于 MQTT 协议的推送服务
一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...
- push msg php_基于web-msg-sender进行消息推送
简介 web-msg-sender是一款web长连接推送框架,采用PHPSocket.IO开发,基于WebSocket长连接通讯,如果浏览器不支持WebSocket则自动转用comet推送. 通过后台 ...
- 浏览器WebSocket连接apollo的MQTT实现消息推送(WEB系统微信扫码登录)
序 一直就想搭建消息队列的,因为目前业务发展还没有到这块,一直没有搭建.刚好今天接到的一个需求是web系统实现微信扫码登录,另外我们的微信对接是统一的中台接口对接,所以我们没办法做到回调我们的web业 ...
最新文章
- Latex快速入门, Windows 安装使用编译技巧归纳
- 查询局域网内在线电脑IP
- Nginx服务学习(6)-日志模块
- springboot如何对本地数据库增删改查_SpringBoot整合Mybatis实现数据库增删改查
- Hive 终于等来了 Flink
- 信息学奥赛C++语言:某年某月天数
- mysql 索引的简单使用
- Ubuntu定制live cd
- 机器学习笔记——支持向量机
- HadoopDB GlobalHasher的参数问题
- yum更换国内源、yum下载rpm包 源码包安装
- 修复oracle注册表,老司机修复oracle卸载干净【调解方案】
- mini6410 LED驱动程序及LED测试程序的设计
- 经典策略之Dual Trust策略
- 地理信息系统GIS基础知识
- uiautomatorviewer 双击闪退问题
- 内存规格的解释(Unbuffered DIMM,Registered DIMM和SODIMM)
- pcl opencv ROS_message三者之间点云和图片类型转换总结
- 白话理解java多线程之setDaemon()方法
- ubuntu下命令行禁用笔记本触摸板