Mqtt通信协议详解

2023-11-11

1. 简介mqtt

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。

2.mqtt协议实现

  • mqtt实现:需要客户端和服务端,不同的客户端通过服务端来获取消息,服务端相当于是个中转站,与各个客户端相连
    在这里插入图片描述

  • 实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
    MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
    (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
    (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

  • 不同的客户端在连接中转站MqttBroker 之后,每个客户端都可以发布和订阅主题,主题就是客户端发布内容的名称,如A客户端发布主题名 11,内容为 nihao , 客户端就可以B订阅A的主题名11来获取A发布的内容 nihao,同理B也可以订阅A的主题获取内容。

3.Mqtt数据包

一个MQTT协议数据包由固定头(Fixed header),可变头(Variable Header),消息体(Payload)三部分组成。
1
. 固定头
:固定头存在于所有的MQTT数据包中,表示数据包类型及数据包的分组类标识。其结构如下:
在这里插入图片描述
1.1 mqtt数据包类型:位于Byte1的第7~4位
在这里插入图片描述
1.2 标识位:位于Byte1的第3~0位,在不使用标识位的消息类型中,标识位被做为保留位。如果收到无效的标志时,接收端必须关闭网络连接。
在这里插入图片描述
DUP:

发布消息的副本。用来在保证消息的可靠传输,如果设置为1,则在下面的变长中增加Messageld,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。

QoS:

发布消息的服务质量,即:保证消息传递的次数。

RETAIN:

发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。

1.3 剩余长度(Remaining Length)

固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为 1时,表示长度不足,需要使用二个字节继续保存。

2 可变头
可变头存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。它驻位于固定的头和负载之间。
3.消息体
消息体存在于部分的MQTT数据包中,表示客户端收到的具体内容。
Payload消息体位MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:
CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。

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

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

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

4. QoS等级

有三种消息发布服务质量:
QoS 是消息的发送方(Sender)和接受方(Receiver)之间达成的一个协议:

  • QoS0: “至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。Sender 发送的一条消息,Receiver 最多能收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,也就算了;
    如下:Sender向Receiver发送一个包含消息数据的PUBLISH包,然后不管结果如何,丢掉已发送的PUBLISH包,一条消息的发送完成。
    在这里插入图片描述

  • QoS1: “至少一次”,确保消息到达,==所以有一个应答的机制。==但消息重复可能会发生。Sender 发送的一条消息,Receiver 至少能收到一次,也就是说 Sender 向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,但是因为重传的原因,Receiver 有可能会收到重复的消息;
    如下图:Sender向Receiver发送一个带有数据的PUBLISH包,并在本地保存这个PUBLISH包;Receiver收到PUBLISH包以后,向Sender发送一个PUBACK数据包,PUBACK数据包没有消息体(Payload),在可变头中有一个包标识(Packet Identifier),和它收到的PUBLISH包中的Packet Identifier一致。Sender收到PUBACK之后,根据PUBACK包中的Packet Identifier找到本地保存的PUBLISH包,然后丢弃掉,一次消息的发送完成。

在这里插入图片描述
问题:

  • 如果Sender在一段时间内没有收到PUBLISH包对应的PUBACK,它将该PUBLISH包的DUP标识设为1(代表是重新发送的PUBLISH包),然后重新发送该PUBLISH包。
  • Receiver可能会重复收到消息,需自行去重。

QoS2: “只有一次”,确保消息到达一次。Sender 发送的一条消息,Receiver 确保能收到而且只收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,同时保证 Receiver 不会因为消息重传而收到重复的消息。
如下:

  1. Sender发送QoS为2的PUBLISH数据包,数据包 Packet Identifier 为 P,并在本地保存该PUBLISH包;
  2. Receiver收到PUBLISH数据包后,在本地保存PUBLISH包的Packet Identifier P,并回复Sender一个PUBREC数据包,PUBREC数据包可变头中的Packet Identifier为P,没有消息体(Payload);
  3. 当Sender收到PUBREC,它就可以安全的丢弃掉初始Packet Identifier为P的PUBLISH数据包。同时保存该PUBREC数据包,并回复Receiver一个PUBREL数据包,PUBREL数据包可变头中的Packet Identifier为P,没有消息体;
  4. 当Receiver收到PUBREL数据包,它可以丢掉保存的PUBLISH包的Packet Identifier P,并回复Sender一个可变头中 Packet Identifier 为 P,没有消息体(Payload)的PUBCOMP数据包;
  5. 当Sender收到PUBCOMP包,那么认为传输已完成,则丢掉对应的PUBREC数据包;
    在这里插入图片描述
    上面是一次完整无误的传输过程,然而传输过程中可能会出现以下情况:
  • 情况1:Sender发送PUBLISH数据包给Receiver的时候,发送失败;
  • 情况2:Sender已经成功发送PUBLISH数据包给Receiver了,但是Receiver发送PUBREC数据包失败;
  • 情况3:Sender已经成功收到了PUBREC数据包,但是PUBREL数据包发送失败;
  • 情况4:Receiver已经收到了PUBREL数据包,但是发送PUBCOMP数据包时发送失败

针对上述的问题,较为详细的处理方法如下:

  • 不管是情况1还是情况2,因为Sender在一定时间内没有收到PUBREC,那么它会把PUBLISH包的DUP标识设为1,重新发送该PUBLISH数据包;
  • 不管是情况3还是情况4,因为Sender在一定时间内没有收到PUBCOMP包,那么它会重新发送PUBREL数据包;
  • 针对情况2,Receiver可能会收到多个重复的PUBLISH包,更加完善的处理如下:
    Receiver在收到PUBLISH数据包之后,马上回复一个PUBREC数据包。并会在本地保存PUBLISH包的Packet Identifier P,不管之后因为重传多少次这个Packet Identifier 为P的数据包,Receiver都认为是重复的,丢弃。同时Receiver接收到QoS为2的PUBLISH数据包后,并不马上投递给上层,而是在本地做持久化,将消息保存起来(这里需要是持久化而不是保存在内存)。
  • 针对情况4,更加完善的处理如下:
    Receiver收到PUBREL数据包后,正式将消息递交给上层应用层,投递之后销毁Packet Identifier P,并发送PUBCOMP数据包,销毁之前的持久化消息。之后不管接收到多少个PUBREL数据包,因为没有Packet Identifier P,直接回复PUBCOMP数据包即可。

注意:
QoS是Sender和Receiver之间的协议,而不是Publisher和Subscriber之间的协议。换句话说,Publisher发布了一条QoS1的消息,只能保证Broker能至少收到一次这个消息;而对于Subscriber能否至少收到一次这个消息,还要取决于Subscriber在Subscibe的时候和Broker协商的QoS等级。

5. mqtt传输安全保证

5.1 应用层

MQTT还提供客户标识(Client Identifier)以及用户名密码,在应用层验证设备,通过在mqttbroker 设置用户名和密码,客户端连接时需要输入相应的用户名和密码

5.2 传输层

传输层:传输层使用SSL/TLS加密是确保安全的一个好手段,可以防止中间人攻击(Man-In-The-Middle Attack)。客户端证书不但可以作为设备的身份凭证,还可以用来验证设备。使用 SSL(升级版本 TLS)对网络数据进行加密(这与 MQTT 协议本身是无关的,会增加网络开销
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

  • 以下是设置MQTT的TLS加密的基本步骤:
  1. 生成或获取MQTT代理的服务器证书和私钥。

  2. 配置MQTT代理以使用服务器证书和私钥。

  3. 为每个MQTT客户端生成或获取客户端证书和私钥。

  4. 配置MQTT客户端以使用客户端证书和私钥。

  5. 配置MQTT代理以要求所有客户端连接使用TLS加密。

  6. 配置MQTT客户端以使用TLS加密连接到代理。

5.2.1 TLS安全协议

由于TLS对交互信息的时序有规定,所以下层协议必须能够提供这种时序服务,因此TLS不能使用UDP来传输。
TLS 1.3协议层级架构:
在这里插入图片描述
同样在TLS协议内部也是基于分层架构,分为两层:下层为记录层协议,为TLS上层子协议为传送提供分片、消息加密及加密后报传输,同时对接收到的数据进行验证、解密、重新组装,然后提交给高层的应用层;上层包含4种子协议:==握手协议(Handshake Protocal)、警报协议(Alert Protocol)、应用数据协议(Application Protocol)及Change_cipher_spec。==其中change_cipher_spec只是为了兼容性存在,其余每个子协议都具有特定的作用,组合起来实现完整的协议功能。

  • 握手协议
    握手协议如字面所言,是在加密通信之前,对于加密使用的算法套件及加密密钥进行协商。
    1、 通过ClientHello及ServerHello完成了随机数、加密算法包及证书格式的协商,重点完成了密钥参数的传输

    2、 通过Certificate及CertificateVerify应用证书体系及数字签名完成身份认证

    3、 通过AEAD对称加密算法,完成握手消息中数据加密

  • Alert Protocol
    报警协议也如字面含义所示,是用来指示关闭信息和错误信息的,相应的主要包含两大类:关闭警报和错误警报。
    在这里插入图片描述

  • Record Protocol
    如上面综述所言,记录层位于TLS内部下层,主要负责验证、分片/重组、加密/解密的任务。

    a) 加密/解密:这个就比较显而易见了,不做过多解释;
    b) 分片/重组:这里的分片不是由于下层协议的帧长度限制的,而是因为解密方需要收完整个record,才能解密。长度过长会增大延迟,因此TLS协议规定length必须小于 2^14字节;
    c) 验证:这部分内容涉及比较多,包括报文时序是否满足协议规定,AEAD中的消息认证是否正确,填充是否正确等内容。

5.3 网络层

网络层:有条件可以通过拉专线或者使用VPN来连接设备与MQTT代理,以提高网络传输的安全性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mqtt通信协议详解 的相关文章

  • centos系统有什么好处?

    CentOS是一种基于开源代码的Linux操作系统 它有以下几个优势 1 稳定性 CentOS是一种非常稳定的操作系统 它的代码经过了严格的测试和审查 因此它非常适合作为服务器操作系统使 用 2 安全性 由于CentOS是基于开源代码的操作
  • 掌握内网渗透之道,成为实战高手,看《内网渗透实战攻略》就够了

    文末送书 文末送书 今天推荐一本网络安全领域优质书籍 内网渗透实战攻略 文章目录 前言 如何阅读本书 目录 文末送书 前言 当今 网络系统面临着越来越严峻的安全挑战 在众多的安全挑战中 一种有组织 有特定目标 长时间持续的新型网络攻击日益猖
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问

    文章目录 1 前言 2 Imagewheel网站搭建 2 1 Imagewheel下载和安装 2 2 Imagewheel网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar临时数据隧道
  • HPE Aruba Networking:五大网络现代化策略助力实现校园数字化转型

    作者 Aruba中国区技术销售总监 俞世丹 全球数字化进程日益加深 科技已成为加速教育行业发展的重要驱动力 人工智能 大数据 云计算 物联网 虚拟现实等新兴技术的快速发展 正在深刻改变着教育的形态和模式 为了更好地满足学校师生个性化教育教学
  • 国外拨号VPS指南:开启你的全球网络之旅

    在当今数字化时代 互联网已经成为了我们生活的一部分 而要在全球范围内畅通无阻地访问互联网 拥有一个可靠的国外拨号VPS是非常重要的 无论您是为了工作 学习还是娱乐 国外拨号VPS都可以为您提供更广泛的网络体验 本文将为您提供国外拨号VPS的
  • 为什么我强烈推荐大学生打CTF!

    前言 写这个文章是因为我很多粉丝都是学生 经常有人问 感觉大一第一个学期忙忙碌碌的过去了 啥都会一点 但是自己很难系统的学习到整个知识体系 很迷茫 想知道要如何高效学习 这篇文章我主要就围绕两点 减少那些罗里吧嗦的废话 直接上干货 CTF如
  • 【无标题】

    大家都知道该赛项的规程和样题向来都是模棱两可 从来不说具体的内容 导致选手在备赛时没有头绪 不知道该怎么训练 到了赛时发现题目和备赛的时候完全不一样 那么本文将以往年信息安全管理与评估赛项经验来解读今年2023年国赛的规程 帮助选手们指明方
  • 高防服务器什么意思

    高防服务器什么意思 为什么要用高防服务器 小编为您整理发布高防服务器什么意思的解读 高防服务器是指具备较高防御能力的服务器 能够抵御DDoS CC等网络攻击 高防服务器通常用于保护游戏 APP 金融 电商等业务 这些领域因为其业务特性 容易
  • 2023下半年软考「单独划线」合格标准公布

    中国计算机技术职业资格网发布了 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告 2023下半年软考单独划线地区合格标准各科目均为42分 01 官方通告 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告
  • 网工内推 | 上市公司同程、科达,五险一金,年终奖,最高12k*15薪

    01 同程旅行 招聘岗位 网络工程师 职责描述 1 负责职场 门店网络规划 建设 维护 2 负责网络安全及访问控制 上网行为管理和VPN设备的日常运维 3 负责内部相关网络自动化和系统化建设 4 优化与提升网络运行质量 制定应急预案 人员培
  • 【安全】网络安全态势感知

    文章目录 一 态势感知简介 1 概念 2 形象举例 3 应具备的能力 二 为什么要态势感知 为什么网络安全态势感知很重要 三 态势感知系统的功能 四 如何评估态势感知的建设结果 五 什么是态势感知的三个层级 四 业界的态势感知产品 1 安全
  • 网络安全行业热门认证证书合集

    网络安全认证证书 就和学历一样是敲门砖 拿到了可以用不到 但不能没有 技术大牛可以没有证书 但普通人不能没有 1 初级入门 就像学历在职场上展示一个人的基本素养一样 网络安全认证证书可以展示一个人在网络安全领域具备的基本知识和技能 它为初学
  • Cumulocity smarREST 响应模板

    我正在尝试设置 Cumulocity smartREST 响应模板以提供应用程序存储的设备对象的信息 我认为这是不可能的 但我想确认一下 因为文档很简短而且不清楚 我之前已经成功实现了测量发布模板 但我现在正在尝试执行库存获取 我已经在设备
  • MQTT:如何知道 puback 是针对哪条消息的?

    我正在尝试设置一个 MQTT 服务器 它将客户端发送的消息保存到本地数据库中 每条消息都有一个 成功接收 标志 当接收客户端为收到的每条消息 QOS 1 返回 puback 时 我想翻转该标志 问题是 当我发布消息时 服务器正确接收从接收客
  • React Native 上的 MQTT?

    将 MQTT 添加到我的反应原生项目时 我很难找到正确的方法 该项目需要在 iOS 和 Android 上运行 因此理想情况下 MQTT 可以在 javascript 端处理 我意识到移动节点和经典节点的网络巢穴是不同的 所以我开始沿着分叉
  • OPC-UA 的替代方案 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 作为访问由各种 PLC 组成的系统的过程数据的解决方案 是否有 OPC UA 的合适替代方案 独立于平
  • 当代理关闭并启动时,Node JS mqtt 客户端未收到订阅的消息

    我创建了一个 mqtt Node js 客户端 我的连接选项如下 mqttOptions clientId 100 keepAlive 1000 clean false reconnectPeriod 1000 will willMessa
  • AWS 将 MQTT 消息存储到 DynamoDB

    我构建了一个定期发送 MQTT 消息的 python 脚本 这是发送到后端的 JSON 字符串 Id 1234 Ut 1488395951 Temp 22 86 Rh 48 24 在后端 我想将 MQTT 消息存储到 DynamoDB 表中

随机推荐

  • Java垃圾回收器

    Java垃圾回收器 1 GC分类与性能指标 1 1 垃圾回收器概述 1 2 垃圾回收器分类 1 2 1 按照线程分 1 2 2 按照工作模式分 1 2 3 碎片处理方式分 1 2 4 工作的内存区间分 1 3 评估GC的性能指标 1 4 吞
  • 另一个Kubernetes(k8s)指南

    从头开始学习Kubernetes Photo by Bobby Burch on Unsplash 近年来 Kubernetes k8s 的受欢迎程度激增 如果您要部署许多容器化的应用程序 那么无论在私有云还是公共云环境中 k8无疑都是当前
  • easyx图形库-----贴图技巧之双缓冲消除闪屏(BeginBatchDraw 与 EndBatchDraw)

    目录 前言 案例1 作图时闪屏 案例2 贴图时闪屏 双缓冲解决闪屏问题 原理 前言 学了easyx图形库的朋友们都知道 我们可以在easyx图形库上面画出连续运动的图片 或者通过贴图的方式把每一帧图片连起来达到动态效果 但是我们每次贴完图片
  • 【react从入门到精通】React父子组件通信方式详解(有示例)

    文章目录 人工智能福利文章 前言 React技能树 通过 props 实现父子组件通信 通过 state 实现父子组件通信 通过回调函数实现父子组件通信 使用 React Context 实现组件通信 总结 写在最后 人工智能福利文章 分享
  • 参考文献期刊首字大写_干货

    解读论文写作与发表策略 助您成功发表 关注 在论文的写作过程中 参考文献必不可少 参考文献的引用体现作者对所研究领域的熟悉程度 作者的学术眼光以及对他人学术成果的尊重 根据GB T 7714 2015 信息与文献 参考文献著录规则 参考文献
  • 给大家排个雷,ensp中nat不成功原因

    用ensp做网络设计 nat一直不成功 内网ping外网能通 但是抓包显示地址没有转换成功 检查了所有配置没问题 最后将Router换成了AR1 配置不变 实验成功 建议大家以后做实验不要用Router
  • Docker中搭建FastDFS文件系统(多图)

    关于FastDFS FastDFS 是以 C 语言开发的一项开源轻量级分布式文件系统 他对文件进行管理 主要功能有 文件存储 文件同步 文件访问 文件上传 下载 等 特别适合以文件为载体的在线服务 如 图片网站 视频网站等 外话 FastD
  • 一种排序方法 C#

    int array new int 10 3 2 4 90 50 20 34 22 49 int newArray new int array Length int Min 100000000 for int i 0 i lt array
  • 【习题之Python篇】习题4

    1 输入一个字符串 内容是个带小数的实数 例如123 45 输出是两个整数变量x和y x是整数部分123 y是小数部分45 s input 输入带小数的数字 s s split print int s 0 是整数部分 int s 1 是小数
  • 大模型技术实践(三)|用LangChain和Llama 2打造心灵疗愈机器人

    上期文章我们实现了Llama 2 chat 7B模型的云端部署和推理 本期文章我们将用 LangChain Llama 2 的架构打造一个定制化的心灵疗愈机器人 有相关知识背景的读者可以直接阅读 实战 部分 01 nbsp 背景 1 1 微
  • Linux高性能服务器编程|阅读笔记:第1章 - TCP/IP协议族

    简介 Hello 非常感谢您阅读海轰的文章 倘若文中有错误的地方 欢迎您指出 昵称 海轰 标签 程序猿 C 选手 学生 简介 因C语言结识编程 随后转入计算机专业 获得过国家奖学金 有幸在竞赛中拿过一些国奖 省奖 已保研 学习经验 扎实基础
  • 基于matlab的矩阵奇异值(SVD)分解

    目录 1 计算原理 1 1求解V 1 2求解D 1 3求解U 2 MATLAB程序 2 1 注意 1 计算原理 设矩阵A的大小m n m gt n A UD 1 1求解V 首先求出的特征值及特征值 对应的正交单位特征向量 将的特征值从大到小
  • 小米在建IoT护城河Vela NuttX

    MIDC 2020小米开发者大会刚刚过去 整场大会下来 几个印象比较深刻的点是 雷军宣布扩招5000名工程师 最新伸缩式大光圈镜头技术 小爱同学5 0发布 当然了 还有一个更加值得被提及的重点是 首次亮相的Xiaomi Vela物联网软件平
  • 本地系统盘放到服务器上,如何将本地盘映射在云服务器上

    如何将本地盘映射在云服务器上 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 云服务器组是对云服务器的一种逻辑划分 云服务
  • 人工智能AI 全栈体系(三)

    第一章 神经网络是如何实现的 一个神经网络用不同的数据做训练 就可以识别不同的东西 那么神经网络究竟是怎么训练的 三 神经网络是如何训练的 1 小朋友如何认识小动物 小时候 每当看到一个小动物时 妈妈就会告诉我这是什么动物 见得多了 慢慢地
  • Docker 安装mysql8

    基础命令 docker stop start restart 停止 启动 重启 查看当前运行镜像 docker ps 查看所有镜像 docker ps a 删除镜像 docker rmi f强制删除 image docker安装MySQL
  • [面向对象]

    学习大纲 什么是面向对象 JS中的内置类 专业叫法 构造函数 自定义类 普通函数执行和构造函数执行的区别 原型 原型链查找机制 Function Object 之间的爱恨情仇 面试题 Number方法重构 Object prototype
  • Linux中_使用stat_命令_显示文件或文件系统的详细信息状态

    文章目录 一 stat命令 一 stat命令 stat指令 显示文件 文件系统的状态 详细信息显示 stat命令主要用于显示文件或文件系统的详细信息 该命令的语法格式如下 用法 stat 选项 文件 参数 必选参数对长短选项同时适用 L d
  • 用好React,你必须要知道的事情

    容器性组件 container component 和展示性组件 presentational component 使用React编写组件时 我们需要有意识地将组件划分为容器性组件 container component 和展示性组件 pr
  • Mqtt通信协议详解

    文章目录 1 简介mqtt 2 mqtt协议实现 3 Mqtt数据包 4 QoS等级 5 mqtt传输安全保证 5 1 应用层 5 2 传输层 5 2 1 TLS安全协议 5 3 网络层 1 简介mqtt MQTT Message Queu