[2]MQTT基础知识

news2025/4/17 7:06:48

MQTT(消息队列遥测传输)是一个客户端服务端架构的发布/订阅模式的消息传输协议。

 

MQTT协议最初版本是在1999年建立的。该协议的发明人是的Andy Stanford-Clark和Arlen Nipper。

MQTT协议是当今世界上最受欢迎的物联网协议,广泛应用于车联网、智能家居、即时聊天应用和工业互联网等领域。

MQTT协议基本原理

MQTT服务端MQTT服务端通常是一台服务器。它是MQTT信息传输的枢纽,负责将MQTT客户端发送来的信息传递给MQTT客户端。MQTT服务端还负责管理MQTT客户端。确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。

MQTT客户端MQTT客户端可以向服务端发布信息,也可以从服务端收取信息

MQTT主题:MQTT服务端在管理MQTT信息通讯时,就是使用“主题”来控制的。

MQTT通讯的核心是MQTT服务端,有了服务端对MQTT信息的接收、储存、处理和发送,客户端在发布和订阅信息时,可以相互独立,且在空间上可以分离,时间上可以异步。(特点:相互独立、空间可分离、时间可异步

客户端订阅主题,服务端发布主题

MQTT服务端在管理MQTT信息通讯时,使用“主题”来控制

 注意:MQTT客户端在通讯时,往往角色不上单一的,它既可以作为信息发布者也可以同时作为信息订阅者。

相互独立:MQTT客户端是一个个独立的个体。它们无需了解彼此的存在,依然可以实现信息交流。比如以上实例中汽车客户端在发布“汽车速度”信息时,汽车客户端本身可以完全不知道有多少个MQTT客户端订阅了“汽车速度”这一主题。而订阅了“汽车速度”主题的手机和电脑客户端也完全不知道彼此的存在。大家只要订阅了“汽车速度”主题,MQTT服务端就会在每次收到新信息时,将信息发送给订阅了“汽车速度”主题的客户端。

空间可分离MQTT客户端在通讯时必要条件是连接到了同一个MQTT通讯网络,这个网络可以是互联网或者局域网。只要客户端联网,无论他们远在天边还是近在眼前,都可以实现彼此间的通讯交流。

时间可异步:MQTT客户端在发送和接收信息时无需同步。这一特点对物联网设备尤为重要。有时物联网设备会发生意外离线的情况。我们使用以上实例二的场景来作为示例。当我们的汽车在行驶过程中,可能会突然进入隧道,这时汽车可能会断开与MQTT服务端的连接。假设在此时我们的手机客户端向汽车客户端所订阅的“空调温度”主题发布了信息,而汽车恰恰不在线。这时,MQTT服务端可以将“空调温度”主题的新信息保存,待汽车再次上线后,服务端再将“空调温度”信息推送给汽车。

连接MQTT服务端

MQTT客户端之间要想实现通讯,必须要通过MQTT服务端,因此MQTT客户端无论是发布信息还是订阅信息,首先都要连接MQTT服务端

MQTT客户端连接服务器一共有两步:1.客户端向服务端发送连接请求;2.服务端向客户端发送连接确认。

MQTT客户端要想连接服务端,首先要向服务端发送connect报文(所谓报文就是一个MQTT数据包,这个 数据包中包含多个信息。,如果connect报文的格式或内容不符合MQTT规范,则服务器会拒绝客户端的连接请求

connect报文所包含的信息:

  1. clientID        客户端ID,每个客户端的clientID是相互独立的
  2. cleanSession       清除会话,如果需要服务端保存重要报文,光设置cleanSession 为false是不够的,还需要传递的MQTT信息QoS级别大于0。对于不重要的MQTT客户端,它们在向服务器发送连接请求时,CONNECT报文中的cleanSession通常设置为true。原因是这类不重要的MQTT客户端即使丢失信息也不会影响整体系统运行。因此服务端在看到客户端的cleanSession为true时,就不会保存发送给它们的信息。
  3. keepAlive     心跳时间间隔,keepAlive用于服务端了解客户端连接情况

connack--确认连接请求

connack报文包括两个信息,一个是returncode(连接返回码),另一个是session pressent(当前会话)

返回码返回码描述
0成功连接
1连接被服务端拒绝,原因是不支持客户端的MQTT协议版本
2连接被服务端拒绝,原因是不支持客户端标识符的编码。
可能造成此原因的是客户端标识符编码是UTF-8,但是服务端不允许使用此编码。
3连接被服务端拒绝,原因是服务端不可用。
即,网络连接已经建立,但MQTT服务不可用。
4连接被服务端拒绝,原因是用户名或密码无效。
5连接被服务端拒绝,原因是客户端未被授权连接到此服务端。

 sessionpresent--当前会话,当重要客户端连接服务端时,服务端可能保存着没有得到确认的报文。如果是这样的话,那么客户端在连接服务端时,就会通过sessionPresent来了解服务端是否有之前未能确认的信息

如果connect报文中的cleanSession设置为true,这种情况下,客户端是不需要服务端保存任何报文的,那么服务端发送的确认连接connect报文中,sessionpresent肯定是false,也就是服务端没有保存任何报文。

CONNACK报文的sessionPresent与CONNECT报文的cleanSession相互配合。其作用是客户端发送连接请求时,服务端告知客户端有没有保存报文信息。

MQTT服务端连接操作

使用阿里云服务器,使用MQTTX调试工具

使用MQTTX进行连接之前,需要知道地址以及端口号等信息。

需要Broker Address,账号密码等都是通过他们进行获得。

 Broker Address格式为:$ {ProductKey}.iot-as-mqtt.$ {region}.aliyuncs.com

 使用MQTT.fx接入物联网平台 (aliyun.com)

参数
ProductKeya1***
DeviceNamedevice1
DeviceSecretf35***d9e
clientIda1***.device1|securemode=2,signmethod=hmacsha256,timestamp=2524608000000|
usernamedevice1&a1***
passwd86761***21d
mqttHostUrla1***.iot-as-mqtt.cn-shanghai.aliyuncs.com
port1883

采用技小新MQTT工具进行配置。可以根据三元组信息生成MQTT需要连接的信息

  • mqttClientId:格式中| |内为扩展参数。
  • clientId:表示客户端ID,可自定义,长度不可超过64个字符。建议使用设备的MAC地址或SN码,方便您识别区分不同的客户端。
  • securemode:表示目前安全模式,可选值有2(TLS直连模式)和3(TCP直连模式)。
  • signmethod:表示签名算法类型。支持hmacmd5,hmacsha1和hmacsha256,默认为hmacmd5。
  • timestamp:表示当前时间毫秒值,可以不传递。
  • mqttPassword:sign签名需把提交给服务器的参数按字典排序后,根据signmethod加签。签名计算示例,请参见MQTT连接签名示例。
  • content的值为提交给服务器的参数(productKey、deviceName、timestamp和clientId),按照参数名称首字母字典排序, 然后将参数值依次拼接。

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

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

相关文章

自学Python学习经验分享

学编程语言有个小秘诀,直接上项目就是干,做完之后你就是Pythoner了。 不要怕没基础,边做边学边查,进步很快的。 因人而异,一周或一个月就能基本入门,当然也需要你百分百的投入。 以前我也觉得收集资料、钻…

一个新工具引发IT巨变:程序员在转行,不懂编程的人却成了程序员

编程一定需要代码吗?我看未必。 科技进步可谓日新月异,无代码开发在近几年,俨然被越来越多的人所熟知。这是一场解放码农的运动,让不懂编程的人也能进行软件开发。 我在发文前,看到了一则信息,更加坚定了…

【MySQL】MySQL初级笔记

MySQL1、初识MySQL(了解)1.1、为什么学习数据库1.2、什么是数据库1.3、什么是DBMS1.4、MySQL简介1.7 连接数据库1.8 基本操作2、操作数据库2.1、结构化查询语句分类2.2、数据库操作2.3、数据值和列类型数值类型字符串类型日期和时间型数值类型NULL值2.4、数据字段属性(重点)UnS…

SpringBoot配置文件的加载顺序

一、引言 如果我们了解SpringBoot配置文件的加载顺序,对项目的开发和部署会有很大的帮助。举个工作中的例子,我们的项目是微服务架构模式,用Nacos做注册中心(可以配置每个微服务),所有服务请求需要通过网关…

解决PageHelper版本不匹配,结果可能全部返回问题

1.问题: 使用 pagehelper ,如果和mybatis版本不匹配,就会出现返回结果错误问题,比如:本来想返回pageNum:1,pageSize:1的数据,但却是全部返回。自己的代码没问题的情况下&#xff0c…

无向图以及图的java代码实现

1. 图的定义 定义:图是由一组顶点和一组能够将两个顶点相连的边组成的 1.1特殊的图 自环:即一条连接一个顶点和其自身的边;平行边:连接同一对顶点的两条边; 1.2图的分类 按照连接两个顶点的边的不同,可…

含文档+PPT+源码等]精品基于SSM的图书管理系统[包运行成功]

博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 含文档PPT源码等]精品基于SSM的图书管理系统[包运行成功] 系统介绍 《基于SSM框架图书管理系统开发与设计》 该项目含有源码、配套开发软件、软件安…

Pytest用例运行及先后顺序

温馨提示 本篇约1600字,看完需3-5分钟,学习学半小时,加油! 先看普通函数运行顺序 import pytestdef test_one():print("我是清安")def test_02():print("--02--")def test_a():print("--a--")de…

老生常谈的一个问题,转行学习编程,是自学还是报班

1、自学 a、优点: 1、自我分析问题和自我解决问题的能力比较的强: 自学要自己的找学习资料,学习要自己的摸索学习,学习中遇到的问题要自己去分析,自己去解决。 通过自学成功的人往往自我分析问题和自我解决问题的能…

Android实现戴口罩人脸检测和戴口罩识别(附Android源码)

Android实现戴口罩人脸检测和戴口罩识别(附Android源码) 目录 Android实现戴口罩人脸检测和戴口罩识别(附Android源码) 1.戴口罩识别的方法 (1)基于多类别目标检测的戴口罩识别方法 (2)基于人脸检测戴口罩分类识别方法 2.戴…

【Javassist】快速入门系列05 当有指定方法调用时替换方法调用的内容

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 文章目录系列文章目录前言引入Javassist jar包当有指定方法调用时替换方法…

1. 位1的个数

文章目录题目解法一:右移统计解题思路代码实现复杂度分析解法二:清除最低位解题思路代码实现复杂度分析解法三:分治解题思路代码实现复杂度分析解法四:JDK Integer.bitCount(int i)代码实现题目 编写一个函数,输入是一…

DPU02:国产USB转UART的桥接控制器兼容替代CP2102

目录DPU02芯片特性USB配置数据和序列号设置DPU02应用领域DPU02是高度集成的USB转UART的桥接控制器芯片,可将RS-232设计更新为USB设计,并简化PCB组件空间。DPU02包括了一个USB 2.0全速功能控制器、USB收发器、振荡器、EEPROM和带有完整调制解调控制信号的…

一文详解深度学习冷板式液冷散热技术规范及要求

深度学习 | 东数西算 | 液冷散热 数据挖掘 | 数据分析 | 高性能计算 随着深度学习、东数西算、医药研发、数据分析、数据挖掘、遥感测绘、高性能计算等技术的快速发展,数据中心的创建与日俱增,传统的风冷散热方式已经不同满足数据中心散热的需求&#x…

Huffman二进制编码以及文本的压缩与解压

目录Huffman树转化成二进制编码文本压缩文本解压Huffman树转化成二进制编码 在上一篇博客的末尾,将Huffman树转化成了01 构成的字符串,显然在实际应用中不是这种操作。我们实际想要的是01构成的一串bits;举个例子:字符"A&quo…

HTTP权威指南------URL与资源

目录 URL标准格式 URL快捷方式 动扩展URL 字符 方案详解 web基础中介绍了URI、URL与URN; URI是一类更通用的资源标识符,URL是它的一个子集; URI是一个通用的概念,它主要由URL与URN组成; URL是通过描述资源的位…

【Kafka】Linux下搭建kafka服务,完整学习案例

【Kafka】Linux下搭建kafka服务,完整学习代码案例(一)Kafka架构基础【1】图解kafka是什么?(1)为什么需要消息队列(2)Topic主题(3)分区(4&#xff…

【UE4 第一人称射击游戏】06-设置动画角色2

步骤: 1.打开“WalkRun_BS”,将最左边中间的点和最右边中间的点的动画改为“walk_backward_inPlace” 2.打开“SWAT_AnimBP”,双击“Walk_Run” 双击“Walk_Run” 将混合空间“WalkRun_BS”拖入 将“Direction”和“Speed”提升为变量&#…

车载以太网 - 初识DoIP - 01

1、DoIP是什么? 从表达形式上 它就是UDS诊断套上车载以太网的马甲,然后实现UDS诊断的所有内容。通过下图DoIP的报文帧格式,从下面往上看,最尾部的数据我们能够很清晰的看到,User Data实际上就是UDS诊断数据,比如:10 03亦或是22 F1 86等信息。然后再往前就是源地址和目标…

Python通过Spleeter实现音唱人声(歌声)伴奏分离

程序示例精选 Python实现音唱人声(歌声)伴奏分离 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 这篇博客针对《Python实现音唱人声(歌声)伴奏分离》编写代码,功能包括了人声(歌声)-伴奏分离。运…