之前我曾写过在MQTT消息中的topic可能会对发布的数据量产生较大影响。从那之后,MQTT已经发布了第5版标准并且诞生了第一个实现。当然,Qt MQTT也随之跟进,这篇文章将介绍Qt for Automation模块是如何应用新标准的。

在这篇文章中,我们不会详细介绍新标准,而是展示最新版本的一些亮点特性和好处。

Topic别名

请注意消息的topic始终作为字节流的一部分并且以明文形式未加任何压缩地发送。例如,报告温度值的传感器网络可以采用如下层次结构的topic

sensors/Europe/2af89b42-d2a6-11e8-a8d5-f2801f1b9fd1/Temperature

因此,消息的字节布局如下所示:

每个消息总共最多71个字节,其中4个字节包含了请求信息。

在之前的文章中,我们谈到了如下的方法

减少topic长度

组合多个传感器的值以优化额外开销的比值。

MQTT5引入了topic别名,允许为某个topic分配ID。

在连接握手期间,客户端和服务器就topic别名是否可用以及topic别名的最大数量达成一致。当ID可分配时可以将它们分配给各个topic。此分配过程是在消息发布期间完成的。新的发布消息同时设置topic别名的字节布局如下所示:

对于第一条消息,数据大小为74字节,比传统发布大三倍多。但是,第二次发布消息时,将从这一设计中受益

消息大小已减少到11个字节,只需将topic与ID交换并保持topic字符串为空即可。从第二条消息开始将大量的减少所需带宽。

请务必注意,一个连接仅需要设置一次topic别名的分配。关于此topic的其他订阅者,尤其是不使用topic别名的订阅者,将收到包含完整topic的消息。或者,这些连接可以创建自己的topic别名匹配。服务器负责使用完整topic或其他别名进行topic的转发。

此外,topic别名不是静态不变的,一个别名是可以重新分配给另一个topic的。

让我们继续展示如何在Qt MQTT中使用此功能吧。Qt MQTT和Qt for Automation 5.12增加了对MQTT v5的支持。

使用topic别名连接

要为连接客户端设置topic别名支持,需要在连接到服务器之前更新QMqttClient

1

2

3

4

5

6

7

8

9

10

11

const int userMaxTopicAlias = 9;

QMqttConnectionProperties userProperties;

userProperties.setMaximumTopicAlias(userMaxTopicAlias);

client.setConnectionProperties(userProperties);

[…]

client.connectToHost();

验证服务器是否支持别名

连接服务器时,查询服务器是否也支持topic别名

1

2

3

const auto serverProperties = client.serverConnectionProperties();

const quint16 serverMaxAlias = serverProperties.maximumTopicAlias();// Returns the number of available aliases

一个连接最多可以使用的别名数量取决于客户端和服务器topic别名的数量上限。

设置topic别名的同时发布消息

1

2

3

4

5

6

7

const QMqttTopicName topic(QLatin1String( "sensors/Europe/2af89b42-d2a6-11e8-a8d5-f2801f1b9fd1/Temperature" ));

QMqttPublishProperties aliasProperties;

aliasProperties.setTopicAlias(2);

client.publish(topic, aliasProperties, msgContent, 1);

Qt MQTT模块会在内部存储分配结果以简化后续消息的发布。

发布后续的消息

1

client.publish(topic, msgContent, 1);

除非需要重新分配ID,否则无需为后续调用添加属性。

在用户不指定的情况下,Qt MQTT尝试自动使用topic别名。在建立连接并且Qt MQTT识别到对使用topic别名的支持后,它会把传统的发布消息方式“转换为”使用topic别名的方式,除非所有可用的别名都被分配掉了。为实现这个功能,它使用内部缓存机制,可以使用上面的QMqttPublishProperties来进行控制。

该缓存中没有包含启发式方法,因此我们仍建议手动使用topic别名。这要根据具体项目来确定哪些topic经常使用从而使用别名来实现最高的效率。

作为结束语,Qt MQTT还负责关于topic别名的取消订阅。该过程是相同的,服务器指定topic和别名匹配。然后Qt MQTT会跟踪此关系并将QMqttMessage内的完整topic字符串传递给没有指定topic的用户。

如果用户想知道topic是否具有指定的别名,可以从QMqttMessage的发布属性中获取此信息。

各种属性

您可能已经从上文中了解了发布过程中的属性类的用法。这体现了MQTT 5引入的新的概念。在保持协议精简、易用的同时,我们还花了不少精力去创建更灵活的结构。

属性可以嵌入到现有命令中,但不是必须的。默认值涵盖了最常用的场景,同时确保了与MQTT 3.1.1的行为兼容,提供了一个零字节表示没有属性被设置。

下面列出了所有可用属性及其适用的命令

对于每个命令,都在5.12版本中加入了一个新的属性类。请查看相关文档,以了解更多详细的信息。

安全

身份验证的方式已经更新,在MQTT 5.0中这是一个重要的趋势,为了扩展它引入了新的命令AUTH。当客户端向服务器发送连接请求之后,服务器可能会要求进一步的身份验证信息。这是通过发送包含了Continue reason code的AUTH命令来实现。在客户端提供了身份验证数据后,才能连接成功,如果认证失败,服务器会要求更多认证数据,或者由于身份验证失败而关闭连接。身份验证步骤的尝试次数是没有限制的。

用于身份验证的实际方法是在服务器端决定的。这可以是OAuth或者在服务器端集成的任何其他功能。

在Qt MQTT中,QMqttClient具有authenticationRequested  和authenticationFinished  信号来表示来自服务器的通知。此外它还引入了 authenticate函数将认证数据发送到服务器。

还有什么?

描述性参数可用于提供有关消息内容的更多详细信息。更进一步,现在还允许服务器向客户端提供错误消息。这在客户端和服务器之间实现通信协议时非常有用。标准过去在发现无效行为后会要求断开连接。现在也一样,但那时现在一台服务器可以包含错误代码甚至错误字符串作为客户端或开发人员的指导。

自然地,所有这些都已经反映在Qt MQTT中了。

我们希望更多地了解您对此模块的使用情况,以及你最需要哪些功能来更快的完成您的项目。如果您有任何意见,请随时通过评论或者直接通过电子邮件与我们联系

apollo mqtt linux qt,MQTT第5版更新,以及如何应用到Qt MQTT模块中相关推荐

  1. wpsarm64linux,WPS Office 2019 For Linux 11.1.0.9080版发布下载,附更新介绍和安装

    版本号为11.1.0.9080的WPS Office 2019 For Linux发布了,提供有64位Rpm格式包.64位Deb格式包下载,兼容X64.MIPS.ARM计算机,该版本发布时间是2020 ...

  2. qt creator 32位linux,Qt Creator下载mac版-Qt Creator Mac版下载 V4.14.2-PC6苹果网

    Qt Creator是一个跨平台的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收购后推出的一款新的轻量级集成开发环境(IDE).此 IDE 能够跨平台运行,支持的系统包括 Lin ...

  3. Qt Creator预览版

    Qt Creator预览版 预览版 在桌面上预览 在设备上预览 在浏览器中预览 预览版 您可以使用QML实时预览在台式机以及Android和嵌入式Linux设备上预览QML文件或整个UI.在预览中,您 ...

  4. c gui qt 4编程第二版_一本专门学习PyQt5 GUI编程的书

    Python作为一个开源的解释型编程软件,在教学.科研.实际项目中用得越来越多.Python易学易用,程序资源丰富,在编程解决一些科学计算问题时比较实用,但是Python自带的Tkinter包设计GU ...

  5. mingw版本下qt与HTML,QT5.10开发(2) 在Windows 10下使用MinGW编译 静态Qt 5.10 release版 详细过程...

    Qt建议安装动态链接Dbug版和编译安装静态链接release版 前提: 先安装动态链接Dbug版,方法:QT5.10开发(1)安装QT5.10 地址:http://blog.csdn.net/qq_ ...

  6. Linux 字体微调 - windows 效果版

    2019独角兽企业重金招聘Python工程师标准>>> Linux 字体微调 - windows 效果版 作者:quanliking 转载请注明:来自 http://www.linu ...

  7. Magic Linux 1.2 最终官方版 发布!

    Magic Linux 1.2 最终官方版 发布! Submitted by connermo on Sun, 03/20/2005 - 02:58. 大家等这个消息可能等了一年了.在这难熬的一年里, ...

  8. Qt 6.0正式版2020-12-08发布

    Qt 6.0正式版2020-12-08发布 链接下载online 安装工具进行在线安装: https://download.qt.io/official_releases/online_install ...

  9. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

最新文章

  1. python 文件操作 open()与with open() as的区别(打开文件)
  2. shell脚本游戏之:剪刀石头布
  3. android BitMap回收
  4. PWA(Progressive Web App)入门系列:(五)Web Worker
  5. 电脑SSH登陆树莓派Raspberry的两种方式
  6. 软件工程导论团队项目
  7. 【系统架构设计师】软考高级职称,一次通过,2017年下半年系统架构设计师考试论文真题(论软件架构风格)
  8. (转)Java任务调度框架Quartz入门教程指南(三)任务调度框架Quartz实例详解深入理解Scheduler,Job,Trigger,JobDetail...
  9. python开发飞船游戏
  10. caffe使用预训练的模型进行finetune
  11. [No0000F5]C# 类(Class)
  12. CDR9 X4 才是最稳定的经典版本,但是汉字文本对齐方面还是有点欠缺
  13. FPGA零基础学习:按键控制LED
  14. 【每日一题】一起冲击蓝桥杯吧——Day5【蓝桥真题一起练】
  15. 正运动技术CAD导图软件配合控制器的使用方法
  16. vue—递归组件(vue组件name的作用之一)
  17. 计算机的虚拟接口,怎样设置计算机的虚拟目录和虚拟端口
  18. windows10桌面_如何让Windows 10系统桌面变得更好看?
  19. e3是合法浮点数吗_下列哪些是不合法的浮点数的选项是 123 2e4.2 .e5 -e3 .234 ......
  20. QQ相关(一)【导出所有QQ好友】

热门文章

  1. Control.Invoke和Control.BeginInvoke
  2. php session获取不到的解决方法
  3. 解决PLSQL 查询后显示中文为问号(???)问题
  4. office2016word 每次打开都有进度条问题 解决方式
  5. java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonProcessingException(Spring使用json的异常处理)
  6. ios端 input输入框遮挡问题解决
  7. 安装了低版本Jdk后eclipse无法打开的终极解决方法
  8. Too many open files问题解决
  9. 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法
  10. 解决git clone慢问题