当前位置: 首页 > java >正文

MQTT:构建高效物联网通信的轻量级协议

MQTT – 轻量级物联网消息推送协议

MQTT(Message Queuing Telemetry Transport)是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器到机器”(M2M)或物联网(IoT)世界的连接设备,以及带宽和电池功率非常高的移动应用的理想选择。例如,它已被用于通过卫星链路与代理通信的传感器、与医疗服务提供者的拨号连接,以及一系列家庭自动化和小型设备场景。它也是移动应用的理想选择,因为它体积小,功耗低,数据包最小,并且可以有效地将信息分配给一个或多个接收器。  
在这里插入图片描述

特点

  • 开放消息协议,简单易实现
  • 发布订阅模式,一对多消息发布
  • 基于TCP/IP网络连接,提供有序,无损,双向连接。
  • 1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。
  • 消息QoS支持,可靠传输保证

应用

MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。

  • 物联网M2M通信,物联网大数据采集
  • Android消息推送,WEB消息推送
  • 移动即时消息,例如Facebook Messenger
  • 智能硬件、智能家具、智能电器
  • 车联网通信,电动车站桩采集
  • 智慧城市、远程医疗、远程教育
  • 电力、石油与能源等行业市场

工作原理

Mqtt的工作原理可以概括为:MQTT 通过其两个主要组件来实现发布/订阅模型:客户端和代理

• 客户端(client)是发布或订阅消息的设备或应用程序,分别使它们成为所谓的发布者或订阅者。客户端可以向主题发布消息,主题是消息发送到的逻辑通道。订阅者可以是一个或多个客户端,接收发布到主题的消息。客户端也可以同时充当发布者和订阅者。

• 另一方面,代理端(broker)是在客户端之间路由消息的中间服务器。代理通过跟踪订阅和向订阅的客户端发布消息来管理客户端之间的消息分发。MQTT 客户端可以用多种编程语言实现,可以在各种硬件平台上运行,从低功耗微控制器到功能强大的服务器。代理可以部署在云端或本地,并且可以水平扩展以支持每秒数百万的设备和消息。阿里云、华为云、AWS 或 Azure 等超大规模应用程序都围绕其服务提供 MQTT 包装器,对 MQTT 协议提供不同级别的支持。

在这里插入图片描述

消息通过使用 MQTT 的代理与其他设备或软件共享。每条消息都有一个主题(Topic),Broker 可以根据该主题进一步处理消息。此外,每条消息都包含一个消息内容,即所谓的有效负载(payload)。MQTT 负载不绑定特定结构,可以自由设计。然而,为消息内容指定一个特定的结构是有帮助的,这样它就可以被其他设备或软件读取。潜在的消息结构可以是 JSON、XML 或 OPC UA。只要所有设备和软件都使用相同的结构进行通信,定义的结构就可以实现顺畅的内部通信
当订阅客户端失去与代理的连接时,代理可以 根据用例和实现 - 保留任何旨在发送给订阅者的消息,然后在订阅者重新连接时立即传递它们。这确保订阅者不会错过任何消息并以正确的顺序接收它们,在国内简称遗嘱机制。

MQTT协议特点

轻量、简单、开放,是低开销、低带宽占用的即时通讯协议。使用场景有:机器与机器(M2M)、物联网(IoT)。MQTT协议当前版本为:2014年发布的MQTT v3.1.1。除标准版外,还有一个简化版MQTT-SN,该协议主要针对嵌入式设备,这些设备一般工作于TCP/IP网络,如ZigBee。

使用的发布/订阅消息模式,它提供了一对多消息分发,以实现与应用程序的解耦。对负载内容屏蔽的消息传输机制。

对传输消息有三种服务质量(QoS):

  • QoS 0:最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1
  • QoS 1:最少一次(承诺消息将至少传送一次给订阅者),这一级别会确保消息到达,但消息可能会重复。即:>=1
  • QoS 2:只有一次(承诺消息仅传送到目的地一次),确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别

参考

https://blog.csdn.net/admans/article/details/137508355

https://www.cnblogs.com/wuyongyin/p/16178060.html

https://www.cnblogs.com/emqx/p/18535347

https://cloud.tencent.com/developer/article/2520461?frompage=seopage&policyId=20240001

QTMQTT

开源地址 https://code.qt.io/qt/qtmqtt.git
从上述地址拉取下来,然后根据当前使用的QT版本切换到对应的分支。

在这里插入图片描述

工程构建

打开工程文件:qtmqtt.pro

编译中可能会出错: “QtMqtt/qmqttglobal.h”: No such file or directory

将mqtt包里面src源码文件夹下所有头文件复制一份到 QT安装包目录下include/mqtt文件夹即可解决。

编译中可能会出错:perl.exe未安装找不到。
根据提示下载该文件或者本地查找是否有perl.exe程序,将路径配置到环境变量中使用即可。

环境配置

构建成功后

  1. 将mqtt包 构件目录里面的 lib中的文件全部复制到对应QT编译器的lib文件夹中

在这里插入图片描述

  1. 将mqtt包 构件目录里面的bin文件夹下的文件 复制到对应QT编译器的bin文件夹中

在这里插入图片描述

  1. 将mqtt包 构件目录里面的mkspecs文件夹下的modules或者modules-inst 文件夹下的文件复制到QT编译器对应的目录下

在这里插入图片描述

  1. 将mqtt包里面的 examples\mqtt\simpleclient文件夹复制一份到工程目录(即复制一份来实验),找开后,添加mqtt模块。将pro文件里面东西改成这样。执行qmake没有报错即可。

在这里插入图片描述

  1. 测试,打开example目录中的simpleClient测试程序。

在这里插入图片描述

官方提供了 test.mosquitto.org 和 broker.hivemq.com 两个测试地址),也可以使用自己的地址。下面进行一些测试:

State Change0 表示等待中

State Change2 表示已连接上。

在这里插入图片描述

  1. 接下来就可以构建自己的mqtt工程了。
http://www.xdnf.cn/news/14348.html

相关文章:

  • Python实战项目 贪吃蛇 源码分享 毕业设计
  • 自动驾驶系统研发系列—激光雷达干扰实战:自动驾驶安全的隐形陷阱
  • (LeetCode 动态规划(基础版)) 518. 零钱兑换 II (动态规划dp)
  • Python训练营打卡 Day54
  • ONLYOFFICE 协作空间 企业版使用秘籍-5.企业电子文件如何管理?便于查找、访问和协作,轻松提升效率
  • 操作系统八股文
  • Python密码加密与校验详解
  • python profiling
  • (十六)GRU 与 LSTM 的门控奥秘:长期依赖捕捉中的遗忘 - 更新机制对比
  • ShardingSphere 全面学习路径
  • 编译链接实战(31)再论静态库的本质是啥
  • LeetCode 2300.咒语和药水的成功对数
  • leetcode复盘(1)
  • 【项目实训】【项目博客#08】HarmonySmartCodingSystem系统前后端知识图谱与可视化实现(5.12-6.1)
  • 深入理解Redis五种基本数据类型
  • (LeetCode 动态规划(基础版)) 279. 完全平方数 (动态规划dp)
  • java复习 14
  • 深度学习入门知识
  • DP刷题练习(二)
  • 【学习笔记】深入理解Java虚拟机学习笔记——第7章 虚拟机类加载机制
  • 关于layui select option莫名多一行的问题
  • EventSourcing.NetCore:基于事件溯源模式的 .NET Core 库
  • 内部代理服务器单点故障导致后端服务概率性失败
  • 算法的几大模块
  • SpringBoot入门 springboot模版注入问题
  • 单例模式的好处
  • 火山引擎解码生态型增长铁律
  • QMI8658A 六轴惯性测量单元的应用介绍
  • Tomcat配置学习
  • 剑指offer26_顺时针打印矩阵