mqttxieyi

2023-11-19

Mqtt概述

Mqtt开发最初是用于卫星通讯监控输油管道的项目。一种用于嵌入式设备的通讯协议,这种通讯协议必须满足以下条件:

  • 易于实现
  • 数据传输的服务质量可控
  • 占用带宽小
  • 传输数据内容不可预知
  • 设备连接状态可知
    MQTT 从诞生之初就是专为低带宽、高延迟或不可靠的网络而设计的。历经几十年的更新和变化,以上这些特点仍然是MQTT协议的核心特点。并从嵌入式系统应用拓展到开放的物联网(IoT)领域

MQTT主流版本有两个 MQTT3.1.1和MQTT5。MQTT3.1.1是在2014年10月发布的,而MQTT5是在2019年3月发布的。在此文档编写时间(2021年7月)MQTT3.1.1仍然主流版本。
MQTT5是在MQTT3.1.1的基础上添加了更多的功能补充完善MQTT协议。

MQTT 通信协议和其他MQ协议类似有三个重要角色,客户端,服务端,主题。和其他具有发布订阅的通信协议一样。通过这三个角色来实现,生产者消费者模型,并通过主题来完成信息隔离,资源分离等功能。只是MQTT协议在设计时报文更加精简。

Mqtt 协议基础

mqtt报文示例

MQTT运行于TCP层之上并以明文方式传输,这就相当于HTTP的明文传输,使用Wireshark可以完全看到MQTT发送的所有消息,消息指令如下。
通过此示例可以了解一个初步印象,下面将分别讲述这些报文的含义

mqtt 消息格式

每条MQTT命令消息由固定报文头 | 可变报文头 | 负荷 这三部分组成

  • 固定报文头(Fixed Header)
    MQTT固定报文头最少有两个字节,第一字节包含消息类型(Message Type)和QoS级别等标志位。第二字节开始是剩余长度字段,该长度是后面的可变报文头加消息负载的总长度,该字段最多允许四个字节。

  • 可变报文头(Variable Header)
    可变报文头主要包含协议名、协议版本、连接标志(Connect Flags)、心跳间隔时间(Keep Alive timer)、连接返回码(Connect Return Code)、主题名(Topic Name)等。也算mqtt的协议的主要部分

  • 有效负荷(Payload)
    实际上可以理解为消息主体(body)。当MQTT发送的消息类型是CONNECT(连接)、PUBLISH(发布)、SUBSCRIBE(订阅)、SUBACK(订阅确认)、UNSUBSCRIBE(取消订阅)时,则会带有负荷。

MQTT的消息类型(Message Type)

MQTT协议拥有14种不同的消息类型,可简单分为连接及终止、发布和订阅、QoS 2消息的机制以及各种确认ACK。类型类型是0-15的数字,
每个消息数字与其对应的消息类型含义如下:

    public final static int MQTT_CONNECT = 1;        //请求连接
    public final static int MQTT_CONNACK = 2;        //请求应答
    public final static int MQTT_PUBLISH = 3;        //发布消息
    public final static int MQTT_PUBACK  = 4;        //发布应答
    public final static int MQTT_PUBREC  = 5;        //发布已接收,保证传递1
    public final static int MQTT_PUBREL  = 6;        //发布释放,保证传递2
    public final static int MQTT_PUBCOMP = 7;        //发布完成,保证传递3
    public final static int MQTT_SUBSCRIBE = 8;         //订阅请求
    public final static int MQTT_SUBACK = 9;            //订阅应答
    public final static int MQTT_UNSUBSCRIBE = 10;      //取消订阅
    public final static int MQTT_UNSUBACK = 11;       //取消订阅应答
    public final static int MQTT_PINGREQ = 12;        //ping请求
    public final static int MQTT_PINGRESP = 13;        //ping响应
    public final static int MQTT_DISCONNECT = 14;       //断开连接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mqttxieyi 的相关文章

  • Vmware安装后,没有VMnet0

    安装虚拟机之后 发现只有VMnet1和VMnet8 没有VMnet0 后来了解到桥接不是添加一个VMnet0虚拟网卡 而是添加网络服务 下面是VMware虚拟网卡的说明 网络类型 网络适配器名 Bridged VMnet0 NAT VMne
  • 图像二值化

    文章目录 1 图像二值化 2 图像二值化方法及Python实现 2 1 简单二值法 2 2 平均值法 2 3 双峰法 2 4 OTSU法 3 opencv python中二值化方法的应用 3 1 简单阈值分割 Simple Threshol
  • Shell脚本开发:printf和test命令的实际应用

    目录 Shell printf 命令 打印简单文本 Shell test 命令 1 文件测试 2 字符串比较 3 整数比较 逻辑运算 Shell printf 命令 当你使用Shell中的printf命令时 它可以帮助你格式化和输出文本 打
  • 【在centos7.6上配置编译环境的时候,输入make menuconfig 报错】

    Build dependency Please install ncurses Missing libncurses so or ncurses h Prerequisite check failed Use FORCE 1 to over
  • 移远EC800N开发板驱动安装卡死

    开发板 移远EC800N开发板 EC800X QuecPython EVB V1 0 系统 Windows 10 驱动 Quectel ASR Series UMTS LTE Windows10 USB Driver Customer V1
  • vector与list的比较

    本博客只作为自己笔记使用 vector和list的相同点 都是STL中的序列式容器 vector和list的不同点 1 底层结构 vector是一段连续的空间 用动态顺序表实现 而list是一个带头结点的双向链表 2 是否支持随机访问 ve
  • tensorflow人工智能项目-鸟类识别系统

    介绍 Python作业 机器学习 人工智能 模式识别课程 鸟类识别检测系统 这是一个鸟类识别项目 基于tensorflow 使用卷积神经网络实现对200种鸟类进行识别 在数据集中收集了200中鸟类图片 每种鸟类都有着40 60张图片 通过对
  • Mysql Replication与Connector/J原理(四)

    十九 Connector与Failover协议 Mysql Connector J支持failover协议 即Client链接失效时 将会尝试与其他host建立链接 这个过程对application是透明的 Failover协议是 Mult
  • json请求 post vue_vue基础之使用get、post、jsonp实现交互功能示例

    本文实例讲述了vue基础之使用get post jsonp实现交互功能 分享给大家供大家参考 具体如下 一 如果vue想做交互 引入 vue resouce 二 get方式 1 get获取一个普通文本数据 window nl ad func
  • C++:类对象的初始化,构造函数:无参、拷贝构造函数,类中const 成员的初始化,对象的构造顺序

    类的对象 类对象的初始化 构造函数 无参构造函数 拷贝构造函数 类中const 成员的初始化 对象的构造顺序 类对象的初始化 include
  • 解决Jenkins插件不能下载安装的问题

    安装到这一步 显示无法下载Jenkins插件 安装中升级站点 如果你还在安装过程中 遇见这个问题 你可以打开一个新的网页 输入网址http localhost 8080 pluginManager advanced 在最下面的升级站点 把其
  • wimax与anroid的困惑

    我要加入wimax组 研究wimax 但是 为什么是anroid平台呢 wimax和android有关系吗 我们是做wimax芯片的呀 难道wimax芯片上跑anroid系统 好像不太可能 经过分析 应该是xx公司要使用我们的wimax芯片
  • PR-RL:Portrait Relighting via Deep Reinforcement Learning

    文章目录 Title PR RL Portrait Relighting via Deep Reinforcement Learning 1 Article 1 1 Abstract and Introduction 1 2 Conclus
  • thttpd源码分析

    由于最近要自己实现一个嵌入式web服务器 所以开始了对嵌入式web服务器的相关学习 为了使自己对服务器了解更加深入 便找到了开源的服务器进行了相关学习 首先学习的是 thttpd thttpd 是一个小型的 HTTP 服务器 官方网址 ht
  • Elasticsearch 7.13.2启动成功,但无法访问?

    今天在linux服务器上配置了es环境 已经成功运行 如下 原因 elasticsearch出于安全策略考虑 默认仅开启了本地访问 需要额外配置远程访问 备注 生产环境请设置密码 且不要直接开放0 0 0 0 解决 在elasticsear
  • 图像的FFT变换

    一 实验设备 计算机 matlab软件 二 实验目的 1 理解并掌握图像的FFT变换的原理 2 学习使用matlab对图像进行FFT变换 三 实验原理 图像fft变换可以将图像空间域变为频率域 进而对频率域图像进行操作 这样会使操作变得简单
  • vue_cli4遇到的问题及解决

    vue cli4遇到的问题及解决 vue cli4遇到的问题及解决 新建项目时报错 vue cli4遇到的问题及解决 新建项目时报错 新建项目代码 vue create project name 报错信息图 解决办法 检查node版本与np
  • 嵌入式系统C语言编程小心使用局部变量

    问题 今天同事在写一个STM32上的程序时 总是遇到内存溢出的错误 结果发现是因为使用了一个局部变量导致的 因为C语言的局部变量被编译器自动放到栈区的空间 全局变量需要手动申请并释放空间 嵌入式系统的栈区本来就很小 而且要放进去的变量是一个
  • 使用CSS在浏览器中绘制虚拟仪表盘(2020-12-30更新)

    效果
  • 【idea】idea无法打开,常规报错的原因和解决方法

    2020 07 29 更新 mac下因破解无法打开的解决方案 删除 Users 你的名字 Library Preferences IntelliJIdea2019 3 idea vmoptions 添加的内容即可 原因一 老版本的idea没

随机推荐

  • b01lers CTF web 复现

    warmup 按照提示依次 base64 加密后访问 可以访问 flag txt 也就是 Li9mbGFnLnR4dA from base64 import b64decode import flask app flask Flask na
  • Spring基础3——AOP,事务管理

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 AOP简介 1 1 AOP概念 作用 方式
  • 【Qt】智能指针

    https zhuanlan zhihu com p 364014571 ivk sa 1024320u 代码中出现一个bug 最终发现是由于在某个特殊情况下出现了使用垂悬指针 造成了程序崩溃 进而学习了解了Qt的智能指针机制 一 悬垂指针
  • 【力扣经典题目】链表的回文结构,赶快收藏起来

    题目描述 对于一个链表 请设计一个时间复杂度为O n 额外空间复杂度为O 1 的算法 判断其是否为回文结构 给定一个链表的头指针A 请返回一个bool值 代表其是否为回文结构 保证链表长度小于等于900 测试样例 1 gt 2 gt 2 g
  • Windows10 2004无线网卡电源管理消失 电源计划只有平衡

    问题 升级到了Windows10 2004 发现每次睡眠后QQ和微信消息都收不到了 去网卡的属性界面却找不到电源管理面板 并且电源计划中也只能创建平衡的电源计划 在网上找了很多解决办法 最多的是关于一个改注册表中的更改注册表HKEY LOC
  • 9 变量进阶

    变量进阶 变量的引用 可变和不可变类型 局部变量和全局变量 1 变量的引用 变量和数据都是保存在内存中的 在 python 中 函数 的参数传递以及返回值都是靠引用传递的 引用的概念 在 python 中 变量和数据是分开存储的 数据保存在
  • 应用层、传输层、网络层、数据链路层

    应用层 包括 应用服务 FTP FileTransfer Protocol 文件传输协议 和DNS Domain NameSystem 域名系统 发送HTTP请求 DNS域名解析系统 提供通过域名 www baidu com 查找IP地址
  • 劳务派遣员工转正制度是什么

    一 劳务派遣员工转正制度是什么 要根据不同的单位来看 因为具体的制度还是要看用工单位的相关规定 比如大部分银行每年都会有一定的转正名额 公务员和事业单位的转正机会则较少 想要成为正式员工还是要参加招聘考试 银行招聘的时候会以劳务派遣的方式招
  • DDK&WDM学习 - HelloWDM,WDM驱动加载,INF文件

    转自 http www itstudy net html 200911 30 20091130234443 htm 第十五章 驱动程序的安装 方便的 自动的和容易的安装一个设备驱动程序对于用户来说是一个重要的步骤 对于提供给用户容易的设备管
  • 解决存储vuex数据,页面刷新后vuex数据被清空了的问题

    1 vuex刷新后数据会被清除 2 可以监听用户是否手动刷新页面 刷新之前先把vuex的数据存储在localStorage里面 页面加载时读取localStorage里的状态信息给vuex赋值 赋值后再清空localStorage 打开ap
  • 一篇文章看懂自动引用计数和循环引用到底是怎么回事

    ARC Swift中的ARC Automatic Reference Counting 自动引用计数 是一种内存管理机制 用于跟踪和管理应用程序中的对象引用计数 确保内存中的对象只在需要的时候存在 当对象的引用计数为0时就会被系统析构掉 A
  • 【双流(1)|原理】flink 双流join原理(1)Interval Join:state过大? 回撤现象出现时,sink如何处理,还有如何优化回撤?数据出现shuffle时join是如何处理的?

    先思考几个问题 双流join的基本原理是什么 双流join的分类有哪些 具体的实现是什么 双流join产生的问题 回撤的情况以及优化的可能性 多流join数据倾斜与性能优化思路 多流join的可能性 文章目录 一 流的join和表的join
  • 校验是否是金额或者小数或者数字,是否是数字

    校验是否是金额或者小数或者数字 是否是数字 param val return bool static function isValidMoney val pattern d d 1 5 if preg match pattern val r
  • c++工程模式+配置文件+动态调用类

    前言 主函数 SimpleFactoryRefactor cpp include
  • JVM和Android虚拟机知识点总结

    文章目录 1 JVM Dalvik Art虚拟机的区别 1 1 JVM和Dalvik的区别 1 2 Dalvik和Art的区别 2 Class文件和dex文件的区别 3 基于寄存器的Android虚拟机和基于栈的JVM 3 1 栈和栈帧 3
  • 算法基础/递归回溯

    1 17 电话号码的字母组合 题目描述 示例 示例 1 输入 digits 23 输出 ad ae af bd be bf cd ce cf 示例 2 输入 digits 输出 示例 3 输入 digits 2 输出 a b c 解答描述
  • JSON.stringify()

    JSON stringify 将一个JavaScript值 对象或者数组 转换为一个 JSON字符串 如果指定了replacer是一个函数 则可以选择性的替换值 或者如果指定了replacer是一个数组 可选择性的仅包含数组指定的属性 语法
  • 粤嵌GEC6818开发板-入门感慨篇(续一)

    触摸屏的事件 include
  • Sql几种删除的区别

    Drop drop可用于删除数据库 drop database 数据库名称 删除数据表 use 数据库名称 drop table 数据表1名称 数据表2名 或删除数据表字段 use 数据库名称 alter table 数据表名称 drop
  • mqttxieyi

    Mqtt概述 Mqtt开发最初是用于卫星通讯监控输油管道的项目 一种用于嵌入式设备的通讯协议 这种通讯协议必须满足以下条件 易于实现 数据传输的服务质量可控 占用带宽小 传输数据内容不可预知 设备连接状态可知 MQTT 从诞生之初就是专为低