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的应用会越来越广!

原文地址:https://www.cnblogs.com/kkdn/p/9323168.html

时间: 2024-10-27 19:42:28

MQTT协议及推送服务(二)的相关文章

互联网推送服务原理

本文摘抄自网络,原地标题:互联网推送服务原理:长连接+心跳机制(MQTT协议) 互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢? 在写之前,我们首先了解一下为什么android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心

小米海量数据推送服务技术的功能实现讲解

小米海量数据推送服务技术的功能实现讲解 11.11大促之后,随着移动端业务量的急剧提升,像小米推送这样的基础服务也经受了巨大的考验.11月12日,小米的项目总监汪轩然在微博上宣布,"小米推送服务共发出9.65亿条消息,平均每分钟发送67万条.更值得一提的是,后台监控显示,推送服务后台系统在全天运作非常平稳,没有任何卡顿拥堵现象,让各种促销.返利.订单更新消息第一时间触达用户." 汪轩然,2007年毕业于清华大学计算机系,后加入微软亚洲工程院,曾参与WP7上的浏览器的开发.2010年7月

互联网推送服务原理:长连接+心跳机制(MQTT协议)

互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢: 在写之前,我们首先了解一下为什么Android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给 服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手

转 互联网推送服务原理:长连接+心跳机制(MQTT协议)

http://blog.csdn.net/zhangzeyuaaa/article/details/39028369 目录(?)[-] 无线移动网络的特点 android系统的推送和IOS的推送有什么区别 推送的实现方式 互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连

java后端IM消息推送服务开发——协议

最近在一家saas企业使用Mqtt开发IM消息推送服务,把开发中的一些问题记录下来,项目仍在商用中,完整的消息服务包括4个模块---协议protocol,信令Signal,规则Rule,状态Status,这个主题主要是协议protocol部分. 主要技术涉及到MongoDB,webservice,httpclient,Mqtt等 protocol分为四个模块类来实现,当然这是为了以后的扩展性比较好 首先看一下我们的主类,主要是mqtt基础方法的一个框架 public class MqttProt

基于Qt移动应用的消息推送服务原理与应用

说到移动应用,大家都觉得移动嘛,当然是Java和Object-c来做啦,什么推送啊,各种系统调用啊,其实不然?如果你了解Qt, 你就知道我说的不然,也有所道理. 说道几点 一.目前Android的移动的消息.通知推送 1)轮询(Pull)方式:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等.而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池. 2)SMS(Push)方式:在Android平

【netty】Netty系列之Netty百万级推送服务设计要点

1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发推送服务遇到的各种技术问题. 由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路. 1.2. 推送服务

Netty系列之Netty百万级推送服务设计要点

原文:http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points 1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发

手把手教你配置苹果APNS推送服务|钿畑的博客 | 钿畑的博客

http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. 推送流程 3.1 获取设备device_token阶段 3.2 消息推送过程 3.3 完整流程介绍 4. Push机制类型 5. 正式开工 5.1 准备工作 5.2 证书生成 6. 客户端制作 7. php服务器端配置 8. 测试 8. 附录: 8.1 JSON示例 8.2 检验证书是否正确的方法: