MQTT 3.1.1,值得升级的6个新特性
前言
以前看英文文章或资料,看完之后,摘要或者忘记。这一次选择感兴趣的MQTT 3.1.1介绍文章资料,引文见文末,作为练手;非完全翻译,去除掉一些广告性描述,若侵权,请告知。
在沉寂了四年之后,QTT 3.1.1规范于2014年10月30号正式发布,与此同时MQTT 3.1.1已成为OASIS(结构化信息标准促进组织)开放物联网消息传递协议标准(连接1 连接2),换种说法就是MQTT 3.1.1已升级为国际物联网标准。
正如HTTP为人们通过万维网分享信息铺平了道路一样,MQTT能将几十亿低成本、嵌入式数据采集遥测设备连接到网络。
与MQTT 3.1(还不是国际物联网标准呢)规范相比,MQTT 3.1.1目标在于消除歧义,尽可能的向后兼容,事实上一些大众所需的新特性被包含在这个版本(更多的是物联网标准推动),因此不仅是一个维护版本,也是一种巨大的进步呢。除了概念的澄清和陈旧规范重写外,有一些很有趣的变化是值得注意的。
会话表示标志(Session Present Flag)
如果一个终端与服务器之间建立一个持久会话连接(假设这个终端没有使用到一个“clean session”标记清除已有回话标志), 一个新增的“Session Present”标志(会话表示标志,逻辑值为true或false)会在CONNACK中出现,表明MQTT服务器已经拥有当前客户端上次连接会话信息,比如订阅的主题,排队信息和其它信息等。
会话表示标志若为true,客户端可减少了一次发送订阅SUBSCRIBLE交互步骤,有助于更有效的数据通信;为false,客户端需要再次发送订阅SUBSCRIBLE消息,不可略过。
新增订阅失败代码反馈
MQTT 3.1.1之前,终端连接之后无法知道其发送的订阅主题是否被MQTT服务器接受与否。此新特性较适用于细粒度权限MQTT主题管理;若无授权,服务器会把错误代码(0x80)附加在SUBACK中,客户端就可以知道订阅失败。
MQTT匿名客户端
需要支持临时或匿名?客户端仅仅需要在发送CONNECT时把客户端标识符( client identifier )置空(零长度)即可,MQTT服务器会为此类请求生成一个随机、唯一客户端标记符。但这要求客户端必须设置Clean Session标记为1,否则服务器端会直接返回包含0x02 (Identifier rejected)代码的CONNACK,同时关闭连接。
可用于后端程序(不需要维护回话状态)向终端发送消息的客户端,MQTT服务器程序可区别对待。
快速发布无等待
这是一个新增的特别有用的特性,客户端可以在发送CONNECT之后,可无须等待MQTT服务器返回的CONNACK,根据需要即刻发送PUBLISH、SUBSCRIBLE、DISCONNEECT等消息,可避免客户端资源等待。此特性也适用于突发模式(burst-mode)客户端需求,只关心数据要尽快的发送出去,而不是去担心是否需要维护一个长连接。
这需要MQTT服务器实现在分发消息之前检查客户端是否有权限发布到这些主题上。
客户端标识符可以变长一些
MQTT 3.1针对客户端标识符( client identifier)限制是23个字节,实际环境下会有所不便,已有遗留系统可能使用UUID作为客户端的标识符,这样服务器端需要做一些彼此之间的MAP映射。 MQTT 3.1.1中上限为65535个字节,毕竟成为业界标准,需要兼容大量的遗留设备和基础设施。
其它小改变
- CONNECT消息可变头部协议名称MQIsdp被改为MQTT,语义更准确
- 所有字符串明确规定使用UTF-8编码,包括客户端标识符(Client Identifier)
- CONNECT消息可变头部协议版本号,由0x03变成了0x04 QoS 0类型PUBLISH消息DUP标记必须被设置为0
- MQTT Over WebSocket 被定义,互联网地址编码分配机构(Internet Assigned Numbers Authority)分配标识符为mqtt。虽在MQTT 3.1规范通篇没有提到WebSocket,但因其二进制属性可以很容易的在WebSocket通道传输。
术语变化
- MQTT代理 -> MQTT服务器(MQTT Broker is now MQTT Server)
- 消息ID -> 包ID(Message ID is now Packet ID)
- 消息类型 -> 包类型(Message Type is now Packet Type)
- 主题路径 -> 主题名称(Subscribe and Unsubscribe take Topic Paths, rather than Topic names)
- 以前在固定头部,现在在包类型中( Flags in the fixed header are now specific to the packet type
- 0字节保留信息需要清除 (A zero byte retained message MUST NOT be stored as a retained message on the Server )
小结
当前MQTT 3.1.1已经在很多活跃开源项目/商业产品得到支持。比如Eclipse Paho,Mosquitto,JBoss A-MQ 6.1, Apache ActiveMQ 5.10-SNAPSHOT,Apache Camel 2.13.0,HiveMQ等。
关于Eclipse Paho:
- Eclipse Paho 1.0支持MQTT 3.1.1和MQTT 3.1规范
- Eclipse Paho 0.9仅支持 MQTT 3.1规范
包含MQTT 3.1.1和MQTT 3.1的客户端可以混合使用,彼此可以共存于同一个MQTT服务器下,在基本消息传输层面没有多大修改,同样的PUBLISH消息可以在MQTT客户端中自由流转,这个需要服务器端编码支持。
已有的MQTT 3.1客户端可以用着急升级,但升级之后可以从新增特性中收益良多。
引用
- 6 facts why it’s worth upgrading to the brand new MQTT 3.1.1 version
- Differences between 3.1.0 and 3.1.1
- other ……
MQTT 3.1.1,值得升级的6个新特性的更多相关文章
- SQL Server 2016最值得关注的10大新特性
全程加密技术(Always Encrypted) 全程加密技术(Always Encrypted)支持在SQL Server中保持数据加密,只有调用SQL Server的应用才能访问加密数据.该功能支 ...
- C# 8.0的三个值得关注的新特性
本文翻译自:https://dzone.com/articles/3-new-c-8-features-we-are-excited-about 转载请注明出自:葡萄城官网,葡萄城为开发者提供专业的开 ...
- Angular4.0.0正式发布,附新特性及升级指南
本文首发地址:Angular4.0.0正式发布,附新特性及升级指南 作者|孙薇 编辑|尾尾 经历了6个RC版本之后,Angular项目组终于发布了新版,即正式版 Angular 4.0.0.新版的 A ...
- Node 12 值得关注的新特性
前言 时隔一年,Node.js 12 如约而至,正式发布第一个 Current 版本. 该版本带来了诸如: V8 更新带来好多不错的特性. HTTP 解析速度提升. 启动速度大幅提升. 更好的诊断报告 ...
- CSS3 值得称赞新特性
Html5和CSS3相信大家现在都已不陌生了吧,但CSS3哪些新特性值得我们去称赞呢? 首先还是让大家来看几张效果图,相信大家看到这些效果图,肯定会说这些效果只用CSS是如何实现的呢? 1.3D正方形 ...
- Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth
Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1 Python 3_x 新特性1 python3.4新特性1 python3.5新特性1 值得关注的新特性1 ...
- PHP 7 值得期待的新特性(上)
这是我们期待已久的 PHP 7 系列文章的第一篇. 或许你已经知道了,我在 PHP 5.0.0 时间轴 提的 RFC (Request For Comments)通过了, PHP 7 成为 PHP 下 ...
- Swift 2.0初探:值得注意的新特性
转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...
- 如何升级laravel5.4到laravel5.5并使用新特性?
如何升级laravel5.4到laravel5.5并使用新特性? 修改composer.json: "laravel/framework": "5.5.*", ...
随机推荐
- Java小故事(一)
import java.util.Date; //导入包 public class Test11 { public static void main(String [] args){ CatFathe ...
- Python学习笔记第十九周
目录: 一.路由系统URL 1.Django请求生命周期 2.创建Django project 3.配置 4.编写程序 二.视图 三.模板 四.ORM操作 内容: 一.URL 1.Django请求生命 ...
- Python学习笔记第四周
目录 一.基础概念 1.装饰器 1.装饰器本质就是函数 2.实现装饰器知识储备 1.函数即变量 2.高阶函数 3.嵌套函数 例子 1.将一个函数名作为实参传递给另外一个函数 2.返回值为函数名 3.函 ...
- 数据结构与算法Java描述 队列
package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...
- skflow 分类与回归接口API 简单测试
skflow也即是 tf.contrib.learn, 是 TensorFlow 官方提供的另外一个对 TensorFlow 的高层封装,通过这个封装,用户可以和使用 sklearn 类似的方法使用 ...
- MyBatis 遍历数组放入in中
必须要遍历出数组的值放入in中 如果直接将"'2','3','4','5','6','7','8'" 字符串放入in中,只会查出 inv_operate_type的值为2的数据,因 ...
- day 023-python 包
包 : 我 们创建的每个文件夹都可以被称之为包. 但是我们要注意, 在python2中规定.中包内必须存在 __init__.py文件. python3可有可无,但一般要求写上.创建包的目的不是为了 ...
- Codeforces 978E:Bus Video System
题目链接:http://codeforces.com/problemset/problem/978/E 题意 一辆公交车,在每站会上一些人或下一些人,车的最大容量为w,问初始车上可能有的乘客的情况数. ...
- Mac下常用工具
MySql--Sequel Pro
- 《DSP using MATLAB》Problem 6.11
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...