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)因为是推送 ...
随机推荐
- [Oracle收费标准]
http://www.oracle.com/us/corporate/pricing/technology-price-list-070617.pdf 1: 数据库 2. 中间件 3. weblogi ...
- 【C++】为多态基类声明virtual析构函数
来自<Effective C++>条款07:为多态声明virtual析构函数 当derived class对象经由一个base class指针被删除,而该base class带着一个non ...
- Day19内容回顾
1,Django请求的生命周期 路由系统-视图函数(获取模板+数据->渲染)->字符串返回给用户 2,路由系统 /index/ 函数或类.as_view() /detail(\d+)/ 函 ...
- [AT2148] [arc063_c] Integers on a Tree
题目链接 AtCoder:https://arc063.contest.atcoder.jp/tasks/arc063_c 洛谷:https://www.luogu.org/problemnew/sh ...
- Java日期格式转换
Java时间格式转换大全 import java.text.*;import java.util.Calendar;public class VeDate {/** * 获取现在时间 * ...
- redis2.8.xx安装配置
一.简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集 ...
- 在 Xamarin.Forms 实现页面全屏显示
NavigationPage.SetHasNavigationBar(this, false); 或者 <ContentPage ... NavigationPage.HasNavigation ...
- Oracle中rank() over, dense_rank(), row_number() 的区别
摘自:http://www.linuxidc.com/Linux/2015-04/116349.htm Oracle 中 rank() over, dense_rank(), row_number() ...
- 用Visual C#开发基于OpenCV的Windows应用程序
http://blog.163.com/wangxh_jy/blog/static/28233883201001581640283/ 关于详细的配置及程序运行截图,请下载:http://downloa ...
- AI技术说:人工智能相关概念与发展简史
作为近几年的一大热词,人工智能一直是科技圈不可忽视的一大风口.随着智能硬件的迭代,智能家居产品逐步走进千家万户,语音识别.图像识别等AI相关技术也经历了阶梯式发展.如何看待人工智能的本质?人工智能的飞 ...