首页 > 其他分享 >MQTT 3.1.1,值得升级的6个新特性

MQTT 3.1.1,值得升级的6个新特性

时间:2023-05-21 14:08:57浏览次数:63  
标签:特性 发送 MQTT 3.1 服务器 标识符 客户端


前言

以前看英文文章或资料,看完之后,摘要或者忘记。这一次选择感兴趣的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个字节,毕竟成为业界标准,需要兼容大量的遗留设备和基础设施。

其它小改变

  1. CONNECT消息可变头部协议名称MQIsdp被改为MQTT,语义更准确
  2. 所有字符串明确规定使用UTF-8编码,包括客户端标识符(Client Identifier)
  3. CONNECT消息可变头部协议版本号,由0x03变成了0x04 QoS 0类型PUBLISH消息DUP标记必须被设置为0
  4. 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:

  1. Eclipse Paho 1.0支持MQTT 3.1.1和MQTT 3.1规范
  2. Eclipse Paho 0.9仅支持 MQTT 3.1规范

包含MQTT 3.1.1和MQTT 3.1的客户端可以混合使用,彼此可以共存于同一个MQTT服务器下,在基本消息传输层面没有多大修改,同样的PUBLISH消息可以在MQTT客户端中自由流转,这个需要服务器端编码支持。

已有的MQTT 3.1客户端可以用着急升级,但升级之后可以从新增特性中收益良多。

 


标签:特性,发送,MQTT,3.1,服务器,标识符,客户端
From: https://blog.51cto.com/u_2700990/6319166

相关文章

  • MQTT协议笔记之连接和心跳
    前言本篇会把连接(CONNECT)、心跳(PINGREQ/PINGRESP)、确认(CONNACK)、断开连接(DISCONNECT)和在一起。CONNECT像前面所说,MQTT有关字符串部分采用的修改版的UTF-8编码,CONNECT可变头部中协议名称、消息体都是采用修改版的UTF-8编码。前面基本上可变头部内容不多,下面是一个较为完整的......
  • 微软推出Windows 11 Insider预览版22621.1255和22623.1255
    您好,WindowsInsider,今天我们将向Beta频道发布Windows11Insider预览版22621.1255和22623.1255(KB5022918)。Build22623.1255=推送新功能。Build22621.1255=默认情况下关闭新功能。提醒:以前在22622版本上的内部人员将通过启用包自动转移到22623版本。启用包人为地增加了新功能推出......
  • Java编程进阶:掌握这五个高级特性让编码更得心应手
    当今,在软件开发中最流行和使用最广泛的语言之一是Java。Java不仅是一种面向对象的编程语言,还可以用于Web开发、移动应用程序编程、云计算和大数据处理。如果你是一个初学者,或者是想要进一步了解Java编程的高级特性,那么这篇文章会帮助你更好地了解Java编程。一、使用lambda表达式在J......
  • 威纶通HMI通过MQTT和和利时ioTDA连接
    1.1ioTDA新建产品1.2 模型定义 2.1注册设备 2.2 自动生成接入凭证  3.1 打开Epro软件,开启MQTT功能进行通信设置 3.2接口格式$oc/devices/ff67d1b8a5a815bd5249d15bde1afbcc_e17961e8c3df4cee9adea8199ae2263d/sys/gateway/sub_devices/properties......
  • 通过MQTT.fx接入和利时互联平台( mqtt协议测试 )
    1.1新建产品  1.2 模型定义 2.1注册设备 2.2 自动生成接入凭证   3.1打开MQTT.fx进行通讯配置   平台端设备也会先显示在线;  3.2MQTT.fx发布接口和数据格式  $oc/devices/ff67d1b8a5a815bd5249d15bde1afbcc_e17961e8c3df4......
  • closeSocket:fail task not found, uniapp 微信小程序连接不上mqtt!!!
    原来使用的mqttjs版本为4.3.7,连接一直报错,closeSocket:failtasknotfound。降低mqtt.js版本使用4.1.0。引入mqtt的方式使用importmqttfrom'mqtt/dist/mqtt.js'!!!使用constmqtt=require('mqtt'),require方式也提示无法连接!!!......
  • mqtt资料收集链接
    1:https://www.cloudmqtt.com/docs-api.html 2:  https://github.com/bluerhinos/phpMQTT 3:  https://blog.risingstack.com/getting-started-with-nodejs-and-mqtt/ 4:  https://github.com/saikath/Mqtt-Example-using-javascript-nodejs 5:  https://githu......
  • 基于Microsoft SEAL 同态加密场景特性
    基于MicrosoftSEAL同态加密场景特性参考MicrosoftSEALMicrosoftSEALGithub通过SEAL实现同态加密......
  • 用Go语言连接和使用MQTT协议的设备
    在物联网领域,设备之间的通信是至关重要的。MQTT(MessageQueuingTelemetryTransport)作为一种轻量级的通信协议,被广泛应用于物联网设备之间的消息传输。本文将介绍如何使用Go语言连接和使用MQTT协议的设备,并提供一个使用Go语言编写的示例代码。Go语言作为一门高效、并发性强的编......
  • C# 特性
    usingSystem.ComponentModel.DataAnnotations; //特性是个类,继承自Attribute//系统自带特性//自定义特性classAccountViewModel{[Required][Display(Name="邮箱")][Define("这是第一个特性的创建!")]publicstringEmail{get;set;}}///<summary>///......