MQTT建立连接

MQTT 连接由客户端向服务器端发起,当客户端与服务器建立网络连接后, 需要先发送一个 CONNECT 数据包给服务器。 服务器收到 CONNECT 包后会回复一个 CONNACK 给客户端, 客户端收到 CONNACK 包后表示 MQTT 连接建立成功。 如果客户端在超时时间内未收到服务器的 CONNACK 数据包, 就会主动关闭连接。
大多数场景下, MQTT 通过 TCP/IP 协议进行网络传输, 但是 MQTT 同时也支持通过 WebSocket 或者 UDP 进行网络传输。

连接地址
MQTT 的连接地址通常包含 : 服务器 IP 或者域名、 服务器端口、 连接协议。
基于 TCP 的 MQTT 连接
mqtt 是普通的 TCP 连接, 端口一般为 1883。
mqtts 是基于 TLS/SSL 的安全连接, 端口一般为 8883。
比如 mqtt://broker.emqx.io:1883 是一个基于普通 TCP 的 MQTT 连接地址。
基于 WebSocket 的连接
ws 是普通的 WebSocket 连接, 端口一般为 8083。
wss 是基于 WebSocket 的安全连接, 端口一般为 8084。
客户端 ID(Client ID)
MQTT 服务器使用 Client ID 识别客户端, 连接到服务器的每个客户端都必须要有唯一的 Client ID。 Client ID 的长度通常为 1 至 23 个字节的 UTF-8 字符串。
如果客户端使用一个重复的 Client ID 连接至服务器, 将会把已使用该 Client ID 连接成功的客户端踢下线。
用户名与密码(Username & Password)
MQTT 协议可以通过用户名和密码来进行相关的认证和授权, 但是如果此信息未加密, 则用户名和密码将以明文方式传输。 如果设置了用户名与密码认证, 那么最好要使用 mqtts 或 wss 协议。
大多数 MQTT 服务器默认为匿名认证, 匿名认证时用户名与密码设置为空字符串即可。
连接超时(Connect Timeout)
连接超时时长, 收到服务器连接确认前的等待时间, 等待时间内未收到连接确认则为连接失败。
保活周期(Keep Alive)
保活周期, 是一个以秒为单位的时间间隔。 客户端在无报文发送时, 将按 Keep Alive 设定的值定时向服务端发送心跳报文, 确保连接不被服务端断开。
在连接建立成功后, 如果服务器没有在 Keep Alive 的 1.5 倍时间内收到来自客户端的任何包, 则会认为和客户端之间的连接出现了问题, 此时服务器便会断开和客户端的连接。

清除会话(Clean Session)
false 时表示创建一个持久会话, 在客户端断开连接时, 会话仍然保持并保存离线消息, 直到会话超时注销。 为true时表示创建一个新的临时会话, 在客户端断开时, 会话自动销毁。
持久会话避免了客户端掉线重连后消息的丢失, 并且免去了客户端连接后重复的订阅开销。 这一功能在带宽小, 网络不稳定的物联网场景中非常实用。
注意: 持久会话恢复的前提是客户端使用固定的 Client ID 再次连接, 如果 Client ID 是动态的,那么连接成功后将会创建一个新的持久会话。
服务器为持久会话保存的消息数量取决于服务器的配置, 比如 EMQ 提供的免费的公共 MQTT 服务器设
置的离线消息保存时间为 5 分钟, 最大消息数为 1000 条, 且不保存 QoS 0 消息。
遗嘱消息(Last Will)
遗嘱消息是 MQTT 为那些可能出现意外断线的设备提供的将遗嘱优雅地发送给其他客户端的能力。设置了遗嘱消息消息的 MQTT 客户端异常下线时, MQTT 服务器会发布该客户端设置的遗嘱消息。
意外断线包括: 因网络故障, 连接被服务端关闭; 设备意外掉电; 设备尝试进行不被允许的操作而被服务端关闭连接等。
遗嘱消息可以看作是一个简化版的 MQTT 消息, 它也包含 Topic、 Payload、 QoS、 Retain 等信息。

  • 当设备意外断线时, 遗嘱消息将被发送至遗嘱 Topic;
  • 遗嘱 Payload 是待发送的消息内容;
  • 遗嘱 QoS 与普通 MQTT 消息的 QoS 一致
  • 遗嘱 Retain 为 true 时表明遗嘱消息是保留消息。 MQTT 服务器会为每个主题存储最新一条保留消息, 以方便消息发布后才上线的客户端在订阅主题时仍可以接收到该消息。

协议版本
使用较多的 MQTT 协议版本有 MQTT v3.1、 MQTT v3.1.1 及 MQTT v5.0。 目前, MQTT 5.0 已成为绝大多数物联网企业的首选协议, 我们建议初次接触 MQTT 的开发者直接使用该版本。

MQTT 5.0 新增连接参数
Clean Start & Session Expiry Interval
MQTT 5.0 中将 Clean Session 拆分成了 Clean Start 与 Session Expiry Interval。
Clean Start用于指定连接时是创建一个全新的会话还是尝试复用一个已存在的会话。 为 true 时表示必须
丢弃任何已存在的会话, 并创建一个全新的会话; 为 false 时表示必须使用与 Client ID 关联的会话来恢复
与客户端的通信(除非会话不存在) 。
Session Expiry Interval 用于指定网络连接断开后会话的过期时间。 设置为 0 或未设置, 表示断开连接时
会话即到期; 设置为大于 0 的数值, 则表示会话在网络连接关闭后会保持多少秒; 设置为 0xFFFFFFFF 表
示会话永远不会过期。
详见:
Clean Start 和 Session Expiry Interval

连接属性(Connect Properties)
MQTT 5.0 还新引入了连接属性的概念, 进一步增强了协议的可扩展性
详见:
MQTT5.0连接属性

如何建立一个安全的 MQTT 连接

虽然 MQTT 协议提供了用户名、 密码、 Client ID 等认证机制, 但是这对于物联网安全来说还远远不够。基于传统的 TCP 通信使用明文传输, 信息的安全性很难得到保证, 数据也会存在被窃听、 篡改、 伪造、冒充的风险。

SSL/TLS 的出现很好的解决了通信中的风险问题, 其以非对称加密技术为主干, 混合了不同模式的加密方式, 既保证了通信中消息都以密文传输, 避免了被窃听的风险, 同时也通过签名防止了消息被篡改。

不同 MQTT 服务器启用 SSL/TLS 的步骤都各有不同, EMQX 内置了对 TLS/SSL 的支持, 包括支持单/双向认证、 X.509 证书、 负载均衡 SSL 等多种安全认证。

单向认证是一种仅通过验证服务器证书来建立安全通信的方式, 它能保证通信是加密的, 但是不能验证客户端的真伪, 通常需要与用户名、 密码、 Client ID 等认证机制结合。

双向认证是指在进行通信认证时要求服务端和客户端都提供证书, 双方都需要进行身份认证, 以确保通信
中涉及的双方都是受信任的。 双方彼此共享其公共证书, 然后基于该证书执行验证、 确认。 一些对安全性
要求较高的应用场景, 就需要开启双向 SSL/TLS 认证。
SSL/TLS 协议
SSL/TLS 介绍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 79. 单词搜索

心路历程: 做完这道题才发现是回溯,一开始想的是递归,判断完第i个字符后,只需要挨个判断第i1个字符在不在第i个字符的邻域。后来发现由于不能重复使用元素,所以需要维护一个visited列表,并且在遍历所有可能…

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——自适应大邻域算法(ALNS)

基于python语言,采用经典自适应大邻域算法(ALNS)对 需求拆分车辆路径规划问题(SDVRP) 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整3. 求解结果4. 代码片段参考 往期优质资源 经过一年多的创作,目前…

Aigtek超声功率放大器产品介绍

超声功率放大器是一种特殊类型的功率放大器,专门用于增强和放大超声信号的功率。它在医疗、工业和科学领域中得到广泛应用。 一、超声功率放大器的基本概述 超声功率放大器是一种能够将低功率超声信号放大到更高功率水平的设备。它是超声系统的关键组成部分&#xf…

力扣1. 两数之和

思路:用一个map存放 已遍历过的元素和下标; 若当前元素是nums[i], 且该元素的另一半 target-nums[i] 在已遍历过的map里面,则返回两个元素的下标; class Solution {public int[] twoSum(int[] nums, int target) {int[] ans new…

腾讯云服务器多少钱1个月?2024一个月收费阿济格IE吧

2024腾讯云服务器多少钱一个月?5元1个月起,腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月,8核32G22M配置115元一个月、345元3个月,腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

数据结构:详解【顺序表】的实现

1. 顺序表的定义 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。动态顺序表与数组的本质区别是——根据需要动态的开辟空间大小。 2. 顺序表的功能 动态顺序表的功能一般有如下几个: 初始化顺序表打印顺序…

PlantUML Integration 编写短信服务类图

PlantUML Integration 写一个类图,主要功能为 1、编写一个serviceSms短信服务类; 2、需要用到短信的地方统一调用基建层的服务即可; 3、可以随意切换、增加短信厂商,不需要更改场景代码,只需要更改application.yml 里面…

Redis数据结构对象中的对象共享、对象的空转时长

对象共享 概述 除了用于实现引用计数内存回收机制之外,对象的引用计数属性还带有对象共享的作用。 在Redis中,让多个键共享同一个值对象需要执行以下两个步骤: 1.将数据库键的值指针指向一个现有的值对象2.将被共享的值对象的引用计数增一 目前来说…

【Godot4.2】2D导航01 - AStar2D及其使用方法

概述 对于2D平台跳跃或飞机大战,以及一些直接用键盘方向键操控玩家的游戏,是根本用不到寻路的,因为只需要检测碰撞就可以了。 但是对于像RTS或战棋这样需要操控玩家到地图指定位置的移动方式,就绝对绕不开寻路了。 导航、碰撞与…

微信小程序接口请求出错:request:fail url not in domain list:xxxxx

一、微信小程序后台和开发者工具配的不一样导致了这个错误 先说结论: 开发者工具配置了https://www.xxx.cn/prod-api/ 微信后台配置了 https://www.xxx.cn 一、最开始 开发者工具配置了https://www.xxx.cn:7500 微信后台配置了 https://www.xxx.cn 报错:reques…

代码随想录算法训练营第53天 | 1143.最长公共子序列 ,1035.不相交的线 ,53. 最大子序和

动态规划章节理论基础: https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 1143.最长公共子序列 题目链接:https://leetcode.cn/problems/longest-common-subsequence/description/ 思路&…

ASP .Net Core ILogger日志服务

🐳简介 ILogger日志服务是.NET平台中的一个内置服务,主要用于应用程序的日志记录。它提供了灵活的日志记录机制,允许开发者在应用程序中轻松地添加日志功能。以下是其主要特点和组件: ILogger接口:这是ILogger日志服…

电脑数据安全新利器:自动备份文件的重要性与实用方案

一、数据安全的守护神:自动备份文件的重要性 在数字化时代,电脑中的文件承载着我们的工作成果、个人回忆以及众多重要信息。然而,数据丢失的风险无处不在,无论是硬件故障、软件崩溃,还是恶意软件的攻击,都…

JupytetNotebook常用的快捷键

Jupyter Notebook 中常用的快捷键: 切换到命令模式:按 Esc 键。切换到编辑模式:按 Enter 键。运行当前单元格并选择下面的单元格:按 Shift Enter。运行当前单元格并插入新的单元格在下面:按 Alt Enter。删除当前单元…

【Vue3】Vue3中的编程式路由导航 重点!!!

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

test测试类-变量学习

test测试类 作用:标记到类上成为测试类,标记到方法上成为测试方法 变量:测试类的变量,在测试类括号中应用 1、invocationCount变量 意思是这个方法应该被调用的次数。 在测试框架中,特别是当使用参数化测试或数据驱动…

HarmonyOS(鸿蒙)快速入门

一:下载开发工具 鸿蒙的开发工具叫DevEco 下载点击 其他部分都一直next 就行,这个页面出现的install 建议都点击install 然后单独选择安装目录 可能存在的问题 就是之前安装nodejs(比如自己开发web或者RN等情况)版本低 等情况 所以建议你单独安装一次 …

Avalon总线学习

Avalon总线学习 avalon总线可以分为: Avalon clock interface Avalon reset interface Avalon Memory mapped interface Avalon iterrupt interface Avalon streaming interface Avalon tri-state conduit interface Avalon conduit interface 1、Avalon c…

杨氏矩阵的查找(复杂度<O(N))

题目: 解释:时间复杂度小于O(N)即不要一个一个的去遍历查找。 思路: 一个33的二维数组如图所示: 一:先找到一个最关键的数字,3(下标为0,2) 关键数的关键之处在于(处于…

SpringBoot + MyBatisPlus分页查询

文章目录 1.思路分析2.分页查询后端实现1.com/sun/furn/config/MybatisConfig.java 注入MyBatisPlus分页拦截器2.com/sun/furn/controller/FurnController.java 添加方法3.postman测试 3.分页查询前端实现1.src/views/HomeView.vue 引入分页导航条组件2.src/views/HomeView.vue…
最新文章