正点原子lwIP学习笔记——MQTT协议

news2024/11/27 0:44:11

1. MQTT简介

MQTT是一种基于客户端服务端架构的发布/订阅模式的消息传输协议。他的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得他对很多场景来说都是很好的选择,尤其是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)

MQTT应用场景

MQTT特点

  1. 消息模式:发布/订阅消息模式,提供一对多的消息发布;
  2. 可靠传输:MQTT是基于TCP连接进行数据推送的;
  3. 服务等级:支持QoS等级,根据消息的重要性设置不同的服务等级;
  4. 轻量级:小型传输,开销很小,协议交换最小化,以降低网络流量;
  5. 遗嘱机制:使用will遗嘱机制来通知客户端异常断线;
  6. 主题机制:基于主题发布/订阅消息,对负载内容屏蔽的消息传输。

MQTT特点总结

MQTT版本

一共是两个主流版本,一个是V3.1.1,另一个是升级版V5。

MQTT版本
MQTT5实在MQTT3.1.1的基础上进行了升级,所以MQTT5是完全兼容MQTT3.1.1的

MQTT协议重要角色

  • 服务端(broker):MQTT信息传输的枢纽,负责数据传递和客户端管理,确保客户端之间的通讯顺畅;(一般是云端)
  • 客户端(Client):“发布”——向服务器发布消息,“订阅”——从服务器收取信息;(有点类似微博的机制,只有关注了该主题,才能获取该主题信息)

客户端的发布和订阅都是围绕“主题”来进行的!!!

同时客户端可以是订阅者也可以是发布者!!!

MQTT传输示例
电脑端订阅了主题“C”,所以在开发板发送了主题“C”的数据之后,电脑端能够接收到信息;而手机端没有订阅,所以不会有接收。

MQTT发布/订阅特性

  • 相互独立:MQTT客户端相互独立,依然可以实现信息交流
  • 空间分离:MQTT客户端和MQTT服务端处于同一个通信网络中
  • 时间异步:MQTT客户端在发送和接收消息时无需同步

QoS服务质量

服务质量是MQTT的一个重要特性。

当我们使用TCP/IP协议时,连接已经在一定程度上受到保护;但是再无线网络中,中断和干扰很频繁,MQTT在这里帮助避免信息丢失及其服务质量水平。这些级别在发布时使用

报文在不可靠的信道上可能存在丢失,于是最直接的解决方案就是重发;服务质量实际就是表示报文要发布几次

  • QoS 0:最多一次 <=1;
  • QoS 1:至少一次 >=1;
  • QoS 2:一次 =1。

QoS0服务质量

发送端一旦发送完消息,就完成任务。发送端不会检查发送的消息能否被正确接收到。(类似UDP)
QoS0示意图

QoS1服务质量

发送端在消息发送完成后,会检查接收端是否已经成功接收到消息。
QoS2服务质量
如果服务端没有返回一个应答的ACK包,就会再次发送报文,直到有接收到应答信号。

QoS2服务质量

发送端需要接收端进行两次消息确认,所以2级MQTT服务质量是最安全的服务级别,也是最慢的服务等级。
QoS2示意图

2. MQTT协议报文结构

MQTT报文结构
固定报头是一定存在的,表示数据包类型以及数据包的标识,最少也会有2个字节;而可变包头和有效负载是可选的,都是根据数据包的类型来决定的。

固定报头

固定报头
固定报头至少2个字节,第1个字节中:
高4位:报文类型;低4位:报文类型相关标志位;
第2个字节以及之后字节(至多4个字节)是剩余数据的长度。

固定报头的报文类型
一共14种报文类型;

CONNECT就是客户端发送到服务端的,表示客户端请求连接服务器;CONNACK是服务端发给客户端的,表示服务端连接报文的确认应答信号;

PUBLISH就是发布消息,如果是QoS1就会有PUBACK应答信号表示发布确认;如果是QoS2,那么会有PUBREC发布收到,PUBREL发布释放以及PUBCOMP发布完成信号;

SUBSCRIBE是客户端发送给服务端的,是一个客户端订阅的请求信号;SUBACK就是服务端发回客户端的服务端订阅确认信号;UNSUBSCRIBE和UNSUBACK就是取消订阅相关信号;

PINGREQ是客户端发给服务端的客户端心跳请求信号,PINGRESP就是服务端的心跳响应信号;

最后还有一个DISCONNECT的客户端发给服务端的断开连接信号。

报文类型标志位
在PUBLISH中,在MQTT3.1.1版本中用到了如下3中标志:

  • DUP:PUBLISH报文的重复传送标志;
  • QoS:PUBLISH报文的服务质量等级;
  • RETAIN:PUBLISH报文的保留标志。

这其中,DUP有如下参数:

  • 0:客户端/服务端第一次尝试发送PUBLISH数据包;
  • 1:可对之前尝试发送的数据包重新发送。

当客户端或服务端尝试重新传递PUBLISH数据包,DUP必须是1;所有的QoS0消息,DUP必须是0。

MQTT可变报头

某些类型的MQTT控制数据包包含可变报头,它位于固定报头和有效负载之间。可变报头的内容根据报文类型决定。例如:CONNECT报文的可变报头有:协议名、协议等级、连接标志和保活间隔等部分。可变报头的报文标识符在几种数据包类型中是通用的。

可变报头结构
是否需要可变报头

MQTT有效负载

有些MQTT控制报文在数据包的最后部分包含有效负载,例如对PUBLISH报文来说,有效负载就可以是应用消息。

是否需要有效负载
包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息需要有效负载:

  1. CONNECT:客户端ID、订阅的Topic、Message以及用户名和密码;
  2. SUBSCRIBE:订阅的Topic以及QoS;
  3. SUBACK:服务端对于SUBSCRIBE所申请的Topic以及QoS进行确认和回复;
  4. UNSUBSCRIBE:取消订阅的Topic。

这四种是必须要Payload的,而PUBLISH是可选择是否需要的。

3. MQTT原理解析

  1. 客户端与代理服务器建立连接
    MQTT连接

首先要通过TCP与代理服务器建立连接,这就需要代理服务器的IP地址和端口号;然后通过MQTT的库配置账号密码还有各种参数,然后调用CONNECT方法请求连接;服务端是一直监听的,建立了TCP连接并接收到CONNECT报文后,会进行数据解析并配置参数,之后发送CONNACK的应答信号;客户端收到信号后解析并成功连接,就进入订阅主题的步骤。

  1. 客户端向代理服务器订阅

订阅主题
通过MQTT的库,通过Subscribe方法发送SUBSCRIBE报文给服务端;服务端解析报文后,会记录客户端的订阅主题,发送SUBACK报文给客户端;客户端接收到应答信号后,就会解析报文并成功订阅,之后监听代理服务器的主体信息。

  1. 客户端向代理服务器发布主题

发布主题
调用MQTT的API来构建发布报文,然后发送PUBLISH报文;服务器解析发送报文,会发送PUBACK返回客户端;客户端解析后,会监听服务器消息;服务器会根据QoS查找相应客户端,找到符合条件的客户端之后,会推送同主题的消息;本客户端就会这样收到订阅消息。

总结

MQTT是很常用的应用层协议,物联网这边很多都是用MQTT完成的联网工作,这一篇主要学习了一下MQTT的命令种类以及相关的数据传输流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1053083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python根据命令行参数动态导入模块或文件

需求 在命令行运行一个 python 文件&#xff0c;同时传入自定义参数&#xff1a; $ python main.py --nodeTable --actioncreate --data"{name: test2, is_sys_obj: False, encoding: UTF8,datconnlimit: -1, variables: []"希望 main.py 接收命令行参数&#xff0…

1.6.C++项目:仿mudou库实现并发服务器之channel模块的设计

项目完整版在&#xff1a; 文章目录 一、channel模块&#xff1a;事件管理Channel类实现二、提供的功能三、实现思想&#xff08;一&#xff09;功能&#xff08;二&#xff09;意义&#xff08;三&#xff09;功能设计 四、代码&#xff08;一&#xff09;框架&#xff08;二…

快速上手 Docker Swarm:构建分布式容器集群、轻松管理节点和服务

什么是Docker Swarm Docker Swarm 是 Docker 的内置编排工具&#xff0c;它允许将多个 Docker 主机组成一个集群&#xff0c;并以统一的方式管理和部署容器化应用程序。Swarm 提供了高可用性、伸缩性和容错能力&#xff0c;使得应用程序能够在集群中弹性地运行和扩展。 Docke…

唤醒手腕 Matlab 游戏编程常用技术知识点详细教程(更新中)

Figure 窗口初始化 figure 使用默认属性值创建一个新的图窗窗口。生成的图窗为当前图窗。f figure(___) 返回 Figure 对象。可使用 f 在创建图窗后查询或修改其属性。figure(f) 将 f 指定的图窗作为当前图窗&#xff0c;并将其显示在其他所有图窗的上面。 figure(n) 查找 Nu…

8、Docker-compose容器编排

一、Docker compose 是什么 Compose 是 Docker 公司推出的一个工具软件&#xff0c;可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml&#xff0c;写好多个容器之间的调用关系。然后&#xff0c;只要一个命令&#xff0c;就能同…

cadence SPB17.4 S032 - 使用room来放置元件

文章目录 cadence SPB17.4 S032 - 使用room来放置元件概述笔记在orcad中设置子原理图的ROOM号码在空的Allegro工程中, 放入板框在allegro中建立room备注补充 - ROOM还得留着END cadence SPB17.4 S032 - 使用room来放置元件 概述 如果在allegro中直接手工或自动放置元件, 放好…

scala基础入门

一、Scala安装 下载网址&#xff1a;Install | The Scala Programming Language ideal安装 &#xff08;1&#xff09;下载安装Scala plugins &#xff08;2&#xff09;统一JDK环境&#xff0c;统一为8 &#xff08;3&#xff09;加载Scala &#xff08;4&#xff09;创建工…

单调队列 - 滑动窗口

154. 滑动窗口 - AcWing题库 O(1)求窗口中的最大值/最小值 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long long ll; typedef long double l…

gdb的使用

目录 gdb工具的使用 代码调试相关指令 运行程序指令 r 显示代码的指令 l 给代码打断点 b 查看断点位置 info b 执行代码到断点处停止 关闭断点 d断点编号 关闭某个断点&#xff0c;但不删除 disable编号 打开某个断点 enable断点编号 逐过程调试代码 n 逐语句调试代码 s 查看…

【外设】拓展坞接入外设一直弹窗报错问题

外设相关&#xff1a;多功能拓展坞安装后使用正常但计算机一直弹窗报错 1.基本配置信息&#xff1a; 拓展坞&#xff1a;绿联6合1 笔记本&#xff1a;lenovo &#xff08;硬件:13^i5;系统&#xff1a;win11&#xff09; 外设&#xff1a;1键1鼠1显示器1硬盘 2.存在的问题&am…

LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize 问题解决

LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize 解决 文章目录 问题背景方法一&#xff1a;使用预编译指令方法二&#xff1a;使用相同的环境 参考链接附录 问题背景 Visual Studio 2019 对 CMakeLists.txt 的支持不是很好&#xff0c;使用 “文…

【单片机】12-串口通信和RS485

1.通信有关的常见概念 区分&#xff1a;串口&#xff0c;COM口&#xff0c;UART&#xff0c;USART_usart和串口区别-CSDN博客 串口、COM口、UART口, TTL、RS-232、RS-485区别详解-CSDN博客 1.什么是通信 &#xff08;1&#xff09;人和人之间的通信&#xff1a;说话&#xff…

java项目之校园餐厅管理(ssm源码+文档)

项目简介 校园餐厅管理实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、商家管理、用户管理、菜系类别管理、校园美食管理、在线下单管理、美食论坛、系统管理。商家前台&#xff1a;首页、校园美食、论坛信息、新闻资讯、我的、跳转到后台、客服。商家&#xff1a;…

第4讲:vue内置命令(文本插值,属性绑定,v-text,v-html)

MVVM 什么是MVVM&#xff1f; MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化&#xff0c;让我们将视图 UI 和业务逻辑分开。 View层&#xff1a; 视图层 在我们前端开发中&#xff0c;通常就是 DOM 层。 主要的作用是…

Error: Activity class {xxx.java} does not exist

git切换到不同的branch之后&#xff0c;报下面的错误&#xff1a; Error: Activity class {xxx.java} does not exist 解决方案&#xff1a; 首先clean 然后会删除build目录 然后点击&#xff1a;Invalidate Caches Android Studio重启&#xff0c;然后重新build即可。

四、2023.9.30.C++面向对象end.4

文章目录 49、 简述一下什么是常函数&#xff0c;有什么作用&#xff1f;50、 说说什么是虚继承&#xff0c;解决什么问题&#xff0c;如何实现&#xff1f;51、简述一下虚函数和纯虚函数&#xff0c;以及实现原理&#xff1f;52、说说纯虚函数能实例化吗&#xff0c;为什么&am…

Python实验二

1&#xff1a;编程计算 1&#xff5e;100 偶数的和。 要求&#xff1a;输出结果为整数&#xff0c;宽度为 8&#xff0c;居中对齐&#xff0c;空白处填充符号“*”。 提示&#xff1a; range(2,101,2)生成的整数列表从 2 开始到 100 结束&#xff0c;步长为 2&#xff0c;即 …

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Linux管理面板mdserver-web

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署Linux管理面板mdserver-webl 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点 二、mdserver-web介绍2.1 mdserver-web简介2.2 mdserver-web特点2.3 主要插件介绍 三、本次实践介绍…

高数:第二章:一元函数微分学

文章目录 一、导数与微分1.导数的概念(1)导数的定义(2)左右导数(3)定理&#xff1a;可导与左右导数的关系(4)可导三要素(5)用导数定义判断可导性 2.微分的概念(1)微分的定义(2)微分与可导的关系 3.导数与微分的几何意义(1)导数 f ′ ( x 0 ) f(x_0) f′(x0​)的几何意义&#x…

【LLM】Windows10环境部署阿里通义千问大模型(Qwen-14B-Chat-Int4)

文章目录 环境文件准备项目代码模型相关文件 运行准备工作运行demo Tips 环境 系统版本&#xff1a;Windows 10 企业版 版本号&#xff1a;20H2 系统类型&#xff1a;64 位操作系统, 基于 x64 的处理器 处理器&#xff1a;Intel Core™ i7-13700K CPU 3.40GHz 机带 RAM&#…