MQTT协议及推送服务(二)
MQTT简介
MQTT全称叫做Message Queuing Telemetry Transport,意为消息队列遥测传输,是IBM开发的一个即时通讯协议。由于其维护一个长连接以轻量级低消耗著称,所以常用于移动端消息推送服务开发。
MQTT特性
MQTT具有如下特性:
使用发布/订阅消息模式,提供一对多消息发布;
对负载内容屏蔽的消息传输;
使用TCP/IP进行网络连接;
主流的MQTT是基于TCP进行连接的,同样也有UDP版本的MQTT,但是不太常用,叫做MQTT-SN。
具有三种消息发布服务质量选项;
1.“至多一次”,通常app的推送使用的就是这种模式。也就是说,如果移动设备在消息推送的时候没有联网,那么再次联网就不会收到通知了;
2.“至少一次”,可以确保消息收到,但消息可能会重复;
3.“只有一次”,确保消息到达一次,比如计费系统, 如果出现消息重复或者丢失会导致系统结果不正确的问题。
小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量;
这就是为什么MQTT能以轻量级低消耗著称,所以MQTT特别适用于低开销、低宽带占用的即时通讯场景。
通知有关各方客户端异常中断的机制。
MQTT协议实现方式

image
在MQTT协议中有三种身份:
发布者(Publish)。发布者其实是客户端,可以进行发布消息;
代理(Broker)。代理指的是服务器,比较有名的是eqmtt,当前,你也可以用其他成熟的框架去搭建MQTT服务;
订阅者(Subscribe)。一般指的是客户端,不过,发布者同时也可以是订阅者。
MQTT客户端
一般来说,客户端可以实现一下功能:
给其他客户端发布订阅的信息;
订阅其他客户端发布的信息;
退订和订阅主题;
断开服务器连接。
MQTT服务端
MQTT服务端也称为消息代理,经常你会听到broker这个词。它可以实现一下功能:
接收来自客户端的网络连接;
接受客户发布的应用信息;
处理来自客户端主题订阅和退订请求;
向订阅的客户端转发应用程序消息。
MQTT协议中的方法
MQTT和HTTP一样,也定义了一些动作,来表示对确定资源进行操作。
Connect,等待于服务器建立连接;
Disconnect,等待客户端完成所做的工作,并与服务器断开TCP/IP会话;
Subscribe,主题订阅;
UnSubscribe,主题取消订阅;
Publish,发送消息。
移动端推送服务
消息推送服务目前已经是app开发中必备的一个功能了,及时地将消息推送给用户,可以使得用户不会错过重大新闻或者重要事件通知。一般,推送服务有三种实现方式:
轮询方式。客户端不断的查询服务器,检索新内容。这种方式的缺点十分明显,如果轮询频率过快,会大量消耗网络带宽和电池;
长连接方式。客户端和服务端维持一条TCP/IP长连接,服务端向客户端push数据。这种方式可以避免轮询方式带来的性能问题,但是长连接依然会带来耗能问题。目前苹果的APNS和谷歌的GCM都是基于此方案来实现推送服务的;
SMS方式。当服务端有新内容的时候,会发送一条类似短信的指令传给客户端,客户端收到后从服务端下载新内容。由于运营商并没有免费开放这种指令,使用需要向运营商缴纳部分费用,所以并没有大量运用起来,但是这种方式非常的高效和及时。
iOS和Andorid推送的实现差异
之前我们说过,目前移动端的推送服务实现都是基于长连接方式实现的。服务端和客户端之间需要存在一条长连接来维持,当服务端主动推送内容给客户端时,客户端可以接收到该内容。
iOS推送服务
在iOS系统中,这个长连接是由系统去维护,iOS上所有应用的推送都是先将推送推到苹果推送服务器(APNs)上,应用需要推送功能时,需要先注册推送服务。其流程图如下所示:

推送注册流程图
首先,苹果会下发deviceToken,这是apns推送实现的基础。APNs推送能够实现就是基于deviceToken来推送的,只有正确的deviceToken才会被APNs接受,一般第三方推送商就是来收集deviceToken来进行推送的。
当开始进行推送内容的时候,服务端会将内容先推到APNs,然后,剩下的就都交给APNs去做了,其推送内容流程如下:

推送注册流程图
苹果这么做,不管是给用户还是开发者,带来的好处都是实实在在的:
由于是系统级别的长连接,所以不会出现被杀死而不发推送的现象;
省电。不用每个app都去各自维护一个自己的长连接;
安全可靠。为了能够使用推送服务,必须先在开发者账号注册推送功能,这就大大降低了长连接滥用的场景。
对于开发来说,实现起来十分容易,服务端只要将正确的deviceToken和推送内容发送给APNs,然后客户端进行推送注册和逻辑处理就行了。
Android推送服务
Android系统上,Google也推出了和APNS类似的服务,叫做GCM。但是由于国情原因(你懂得),导致该服务在中国无法使用。所以,国内Andorid的普遍做法是自己维护一条长连接,和自己的推送服务器或者第三方推送商对接。
其实现原理APNs没有本质区别,但是由于一个设备通常需要维持多个长连接,所以在耗能这块,Andorid这块处理就不尽人意,并且,由于后台可以常驻,所以安全性这块也得不到保障。
除了类似APNs的实现,在Android上,也可以采用轮询方式,也可以简单实现推送功能。
MQTT实现消息推送
iOS端实现
对于iOS端使用MQTT来实现消息推送服务,比较常见的做法就是采用离线消息的方式去做,服务端发送推送消息,发送到APNs上,然后APNs通知客户端收到通知消息,客户端去服务端拉取最新消息列表,然后展示的界面上并处理相关逻辑。
Android端实现
由于并不是做Android开发,并且Android方面采用方式五花八门,了解的做法是类似iOS的实现,利用MQTT将服务端和客户端建议一个长连接,然后服务端将消息直接推倒客户端上,客户端收到推送消息后,去服务端拉取最新的消息列表。
总结
对于移动设备来说,MQTT以低开销、低带宽著称,十分适合搭建推送服务。目前方案也比较成熟,希望未来MQTT的应用会越来越广!
MQTT协议及推送服务(二)的更多相关文章
- MQTT协议及推送服务
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建 ...
- 转 互联网推送服务原理:长连接+心跳机制(MQTT协议)
http://blog.csdn.net/zhangzeyuaaa/article/details/39028369 目录(?)[-] 无线移动网络的特点 android系统的推送和IOS的推送有什么 ...
- 互联网推送服务原理:长连接+心跳机制(MQTT协议)
互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...
- Mosquitto搭建Android推送服务(一)MQTT简介
总体概要: MQTT系列文章分为4部分 1.MQTT简介 2.mosquitto服务器搭建 3.编写Mosquitto的可视化工具 4.使用Mosquitto完成Android推送服务 文章钢要: 对 ...
- 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)
1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...
- Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- Netty_Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- 【netty】Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- SSM项目使用GoEasy 实现web消息推送服务
一.背景 之前项目需要做一个推送功能,最开始我用websocket实现我的功能.使用websocket的好处是免费自主开发,但是有几个问题:1)浏览器的兼容问题,尤其是低版本的ie:2)因为是推送 ...
随机推荐
- Struts2(四)
以下内容是基于导入struts2-2.3.32.jar包来讲的 1.struts2配置文件加载的顺序 struts2的StrutsPrepareAndExecuteFilter拦截器中对Dispatc ...
- CDN问题
名称解释:正反向解析 主辅服务器 domain zone 记录:SOA.NS.A.CNAME.PRT.MX DNS配置文件中各字段作用,如TTL DNS端口号? TCP53和UDP53使用场合 Lin ...
- AdminLTE 框架应用(一 )- 插件介绍
原AdminLTE中的插件让我大部分都移除了,第一是占地方,需要的时候再引入也不迟,第二就是有些插件已经过时了,有比较好的插件可以替代.附上项目插件截图 1.bootstrap-addTabs 提供多 ...
- 【.Net】vs2017 自带发布工具 ClickOnce发布包遇到的问题
一.遇到的问题 在安装了vs2017 社区版(Community)之后 想打包安装程序(winform) 还是想用之前的 installshield来打包 发现居然打不了,在官网查了 ins ...
- HDU4788_Hard Disk Drive
水题. 但是我写挫了一个地方,Wa了三发.好吧,不能忍了. 还有,本屌不知道如何用printf输出%,哪位学过C++的大仙知道这是什么情况? 告诉我一声啊. #include <iostrea ...
- linux系统常见命令以及操作
2.安装xshell,安装完打开,配置回话,输入名称(随便).SSH.主机(打开linux,点击右上角电脑图标system etho进行联网,打开终端输入ifconfig回车,找到inet add地址 ...
- 【题解】AC自动机题解合集
最近貌似大家都在搞字符串?很长一段时间都没有写博客了……还是补一补坑吧. 感觉AC自动机真的非常优美了,通过在trie树上建立fail指针可以轻松解决多模匹配的问题.实际上在AC自动机上的匹配可以看做 ...
- 【刷题】BZOJ 2142 礼物
Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店 ...
- 20135239 益西拉姆 linux内核分析 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
https://drive.wps.cn/preview#l/759e32d65654419cb765da932cdf5cdc 本次直接在wps上写的,因为不能连同图片一起粘贴过来,一个一个粘比较费时 ...
- linux设置开机自动启动
有很多中方法,这里只取最简单的一种: 把启动命令放到/etc/rc.d/rc.local文件里这样就可以每次启动的时候自动启动服务了, 注意给rc.local执行权限