ESP32-C3模组上跑通MQTT(4)

接前一篇文章:ESP32-C3模组上跑通MQTT(3)

本文内容参考:

《ESP32-C3 物联网工程开发实战》

特此致谢!

上一回讲到了MQTT的消息格式,讲解了MQTT控制报文中的固定头中的控制报文的类型、消息质量等级和标志位。本回继续讲解MQTT消息格式的更多内容。

四、MQTT消息格式

在MQTT协议中,MQTT控制报文固定头(Fixed Header)可变头(Variable Header)消息体(Payload)三部分组成。

1. 固定头

固定头存在于所有MQTT控制报文中。MQTT控制报文固定头说明见下表:

Bit76543210
第1个字节控制报文的类型用于指定控制报文的标志位
第2个字节剩余长度

(1)控制报文的类型

(2)消息质量等级

(3)标志位

(4)剩余长度

第2个及以后的字节表示剩余长度,表示当前控制报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度字段使用一个可变长度的编码方案,对小于128的值使用单字节编码。更大的值按以下方式处理:低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节。因此,每个字节可以编码128个数值和一个延续位。剩余长度字段最大为4B(4个字节)。剩余长度字节数如下表所示:

字节最小值最大值
10(0x00)127(0x7F)
2128(0x80 0x01)16383(0xFF 0x7F)
316384(0x80 0x80 0x01)2097151(0xFF 0xFF 0x7F)
42097152(0x80 0x80 0x80 0x01)268435455(0xFF 0xFF 0xFF 0x7F)

2. 可变头

某些MQTT控制报文包含一个可变报头部分,它在固定包头和负载之间,可变报头的内容根据控制报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在于多种类型的控制报文中,如PUBLISH(QoS>0时)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK。

3. 有效载荷

消息体位于MQTT数据报的第三部分,包含了CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE、PUBLISH五种类型的消息。

1)CONNECT

消息体内容主要是客户端的ClientID、订阅的Topic、Message以及用户名和密码。

2)SUBSCRIBE

消息体内容是一系列要订阅的主题以及QoS。

3)SUBACK

消息体内容是服务器对于SUBSCRIBE所申请的主题以及QoS进行的确认和回复。

4)UNSUBSCRIBE

消息体内容是要取消订阅的主题。

5)PUBLISH

消息体内容是发布的应用消息,可以是零长度的。

五、协议对比

TCP、UDP、HTTP和CoAP等协议除了用于本地控制,还能用于远程控制。那么MQTT与这些协议相比,区别和联系如何呢?

1. MQTT协议与TCP协议的对比

MQTT协议是基于TCP协议的应用协议,两者都可以进行远程数据通信。对于套接字,TCP协议需要用户自行开发上层的应用协议,自行开发的应用协议使用场景很有限,不适合当下物联网万物互联的大环境。而MQTT是一个标准的物联网轻量级协议,目前大部分的云服务器,如阿里云、亚马逊云都使用MQTT协议,有利于产品的对接。

2. MQTT协议与HTTP协议的对比

HTTP协议和MQTT协议一样,采用的都是客户端/服务器端模型,都是基于TCP协议的应用协议。但HTTP协议报文开销比MQTT协议大很多而且HTTP协议一般很难实现服务器向客户端主动推送数据,无法满足物联网远程控制的需求。如果设备只是单纯地上报数据,则可以使用HTTP协议。

3. MQTT协议与CoAP协议的对比

CoAP协议与HTTP协议类似,模仿HTTP协议的REST模型,服务器端以URI方式创建资源,客户端可以通过GET、PUT、POST、DELETE方法访问这些资源,并且协议风格也和HTTP协议极为相似,它比HTTP协议需要更少的设备资源与网路开销,非常适合物联网协议,但CoAP协议不适合远程控制。如果智能手机发送控制命令进行远程控制,则CoAP协议可能需要CoAP+Web+DataBase+App的架构。使用CoAP协议时,控制命令必须经过DataBase才能转给设备,因为CoAP协议是无连接的,智能手机发送控制命令时,服务器会先将控制命令存储到DataBase,设备会通过GET方法请求服务器端是否有控制命令,然后选择是否需要操作设备。而MQTT协议是面向连接的,服务器端会将智能手机发送的控制命令转发给每个订阅的设备,存储控制命令不是必需的,只需要MQTT客户端+MQTT服务器+App就能实现,在部署方面MQTT协议更具优势。

至此,MQTT理论基础部分的内容就讲完了,下一回结合官方例程进行代码分析及实际操作。

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

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

相关文章

基于51单片机的智能导盲手杖—超声波测距

基于51单片机的智能导盲手杖 (仿真+程序原理图+PCB设计报告) 功能介绍 具体功能: 1.显示前方障碍物距离。 2.实时测量距离,并通过蜂鸣器提醒距离过短,蜂鸣器蜂鸣发出预警。 3.可以通过按键调…

吴恩达机器学习笔记:第 9 周-17大规模机器学习(Large Scale Machine Learning)17.1-17.2

目录 第 9 周 17、 大规模机器学习(Large Scale Machine Learning)17.1 大型数据集的学习17.2 随机梯度下降法 第 9 周 17、 大规模机器学习(Large Scale Machine Learning) 17.1 大型数据集的学习 如果我们有一个低方差的模型,增加数据集的规模可以帮助你获得更好…

ubantu安装rabbbitmq

ubantu安装rabbbitmq 安装Erlang1、在linux下直接安装2、上传Erlang文件后解压 安装rabbitmq开启web管理接口创建用户及修改guest密码,删除guest默认账号 安装Erlang 1、在linux下直接安装 #运行以下命令直接安装: sudo apt-get install erlang#可运行…

【代码随想录】回溯问题之组合

前言 更详细的在大佬的代码随想录 (programmercarl.com) 本系列仅是简洁版笔记,为了之后方便观看 解决的类型问题 组合无序,排列有序 组合切割子集排列(强调元素的顺序)棋牌问题(n皇后,数独&#xff0…

postgres 查看全部数据库

在 PostgreSQL 中,要查看所有的数据库,你可以使用 psql 命令行工具并执行一个特定的命令。以下是查看所有数据库的步骤: 打开终端: 首先,打开你的终端或命令行界面。 连接到 PostgreSQL: 使用 psql 连接到…

jsbsim 调 pid 记录

1.先调俯仰角 pitch 俯仰角不能超过 xml 文件里定义的爬升角 高度不对,调 pitch 角的 pid,俯仰角 理论上调pid: 响应快了,P调小;响应慢了,P调大 I消除稳态误差,I调大 D防止震荡,震…

AWS Lambda 第一个例子Hello (JAVA)

什么是Serverless(无服务器计算) 行业通常所说的Serverless,主要是指“无服务器计算(Serverless Computing)”。无服务器计算,并不是真的不需要服务器,而是说,对于用户,…

Hadoop3:HDFS的Shell操作(常用命令汇总)

一、简介 什么是HDFS的Shell操作? 很简单,就是在Linux的终端,通过命令来操作HDFS。 如果,你们学习过git、docker、k8s,应该会发现,这些命令的特点和shell命令非常相似 二、常用命令 1、准备工作相关命令…

全球科技早参丨皮查伊:智能手机将是AI创新的核心平台、科学家研制出超纯硅 | 最新快讯

每经记者:文巧 每经编辑:兰素英 |2024年5月10日 星期五| NO.1 Neuralink首例人类脑机接口手术后设备出现问题 Neuralink最新宣布,在今年1月实施首例人类手术后,植入受试病患的设备遭遇了一系列机械故障。…

2024年5月发布的SparkyLinux 8使用的是Debian 13 trixie 的更新源

2024年5月发布的SparkyLinux 8使用的是Debian 13 trixie 的更新源,然后我改了清华对应的更新源,更新成功。纯粹是测试,具体应以官网信息为主。

Elasticsearch 索引、类型、文档、分片与副本等核心概念介绍

🐇明明跟你说过:个人主页 🏅个人专栏:《洞察之眼:ELK监控与可视化》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Elasticsearch简介 2、分布式搜索引擎的工作原理…

AlphaFold3(AF3)简单介绍:预测各种生物分子结构和它们之间相互作用的深度学习模型

参考: 文章地址: https://www.nature.com/articles/s41586-024-07487-w https://blog.google/technology/ai/google-deepmind-isomorphic-alphafold-3-ai-model/ AlphaFold3体验官网: https://golgi.sandbox.google.com/ 《Accurate structure prediction of biomolecula…

太极(ROOT)宣布永久停更

2024年5月9日,太极root的开发者在自己的博客宣布永久停更。 以下是原文: 亲爱的小伙伴们,太极问世至今已逾六年,这段时间里我们留下了许多美好的回忆。然而,旅程总有一天会迎来终点,现在是时候与大家道别…

xxe漏洞漏洞详解

XXE漏洞概念 XXE(XML External Entity Injection) XML外部实体注入。 重点: XML 外部实体 注入 这三部分搞清楚 XML是一种类似于HTML(超文本标记语言)的可扩展标记语言,是用于标记电子文件使其具有结构性 的标记语言,可…

C语言中 #include<>与 include ““的区别

一. C语言中 #include<> 与 include "" 的区别 1. 头文件 C语言中头文件以 .h为后缀 的文件&#xff0c;头文件中包含了函数的声明和宏定义&#xff0c;头文件可以被多个源文件引用。 在C语言中有两种类型的头文件&#xff0c;一种是编译器自带的头文件&a…

Github 2024-05-10 Java开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10C++项目2JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache License 2.0Star数量:140773 个…

一栈走天下:使用HBuilderX高效搭建Uni-App微信小程序开发环境

一栈走天下&#xff1a;使用HBuilderX高效搭建Uni-App微信小程序开发环境 Uni-App与HBuilderX简介Uni-App基础HBuilderX介绍 环境搭建步骤步骤1&#xff1a;安装HBuilderX步骤2&#xff1a;创建Uni-App项目步骤3&#xff1a;配置微信小程序平台步骤4&#xff1a;预览与发布 代码…

Nvidia docker 验证HSOpticalFlow

前情提要&#xff1a; docker是dotCloud 公司为了数据库研发的&#xff0c;所以仅支持CPU和数据交换的部分&#xff0c;nvidia公司觉得这是个好东西&#xff0c;自己派人研发了GPU相关的部分&#xff0c;取名为NVIDIA Container Toolkit&#xff0c;我们可以理解为dockerGPU插…

队列和二叉树

本文主要探讨队列和二叉树的相关知识。 队列 队列结构:队头指针指向队头元素,队尾指针指向队尾元素(链表形式或数组形式) 队列特特点:先进先出,对头插入&#xff0c;队尾出队 双端队列:对头队尾都可插入和出队 二叉树 二叉树:包含根节点和子节点,一个三角组内…

设计模式——解释器模式(Interpreter)

解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子。这种模式主要用来描述如何使用面向对象语言构成一…