Linux MQTT智能家居(MQTT框架)

2023-07-16 00:00:00


前言

本篇文章将会讲解MQTT的框架,我们这个项目使用到的MQTT源码库来自于一位大佬编写。
大佬博客主页:主页

一、MQTT通信框架

在这里插入图片描述
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传递协议,适用于物联网和低带宽、不稳定网络环境中的通信。MQTT通信框架主要围绕服务器、发布者(Publisher)和订阅者(Subscriber)展开。

1.服务器(Broker):
服务器是MQTT通信的中心组件,也称为代理(Broker)。它负责接收来自发布者的消息并将其传递给所有订阅者。服务器处理消息的路由、订阅管理、QoS级别处理、连接管理等功能。发布者和订阅者之间通过与服务器建立的连接进行通信。

2.发布者(Publisher):
发布者是消息的发送方。它可以是物联网设备、传感器、应用程序等。发布者将消息发布到服务器上的特定主题(Topic)。主题是消息的识别标签,订阅者将根据主题来订阅感兴趣的消息。

3.订阅者(Subscriber):
订阅者是消息的接收方。它可以是物联网设备、应用程序等。订阅者通过订阅服务器上的特定主题(Topic)来表明自己对某些消息感兴趣。当有新消息发布到该主题时,订阅者将收到相应的消息。

MQTT通信流程如下:

1.发布者将消息通过MQTT协议连接到服务器(Broker),并指定要发布的主题(Topic)以及消息内容。

2.服务器(Broker)接收到消息后,根据主题将其转发给订阅了该主题的所有订阅者。

3.订阅者将通过MQTT协议连接到服务器,并订阅自己感兴趣的主题(Topic)。

4.当服务器接收到新的消息,并且该消息的主题与某个订阅者的订阅主题匹配时,服务器将消息推送给该订阅者。

需要注意的是,MQTT协议支持不同的服务质量等级(QoS),发布者和订阅者可以根据消息的可靠性需求选择适当的QoS级别。

总结:MQTT通信框架基于服务器、发布者和订阅者之间的交互,通过服务器中转消息,并根据订阅关系将消息传递给订阅者。这种发布-订阅模型使得消息发送和接收的解耦和灵活性更高,并且适用于分布式、异构的环境中的物联网应用和其他消息传递场景

二、心跳包

MQTT 心跳包(Keep Alive)是一种机制,用于维持 MQTT 客户端与服务器之间的活动连接状态。它确保客户端和服务器之间的通信链路保持活跃,以防止连接超时或断开。

以下是 MQTT 心跳包的工作原理:

1.Keep Alive 值:在 MQTT 协议中,客户端在建立连接时会设置 Keep Alive 值。该值表示客户端希望与服务器保持的活动连接时间间隔,以秒为单位。通常,此值会设置为一个较小的时间间隔,例如 60 秒。

2.客户端发送心跳包:一旦客户端与服务器建立连接,它会周期性地发送心跳包给服务器。心跳包是一个特殊的空(zero-byte)消息,只包含 MQTT 固定头部和类型字段为 PingReq 的控制报文。

3.服务器响应心跳包:服务器收到心跳包后,会立即发送一个类型为 PongResp 的响应消息给客户端。服务器的响应表明它仍然处于活动状态。

4.心跳超时:如果客户端在 Keep Alive 时间内未收到服务器的响应,或者连接断开,则客户端可以判断与服务器的连接已断开。客户端可以重新连接服务器或采取其他适当的措施。

MQTT 心跳包的作用:

1.保持连接活跃:心跳包确保 MQTT 客户端和服务器之间的连接保持活跃,避免连接因长时间无活动而断开。

2.检测断开连接:通过监测心跳包的响应,客户端可以判断与服务器的连接是否正常。如果超过一定的时间未收到响应,客户端可以主动断开连接或尝试重新连接。

3.节省网络资源:心跳包的周期性发送相对较小,占用较少的网络资源。同时,较小的 Keep Alive 值可以更快地发现连接问题,减少对应用程序的影响。

通过使用心跳包,MQTT 可以构建可靠的、长时间持续的通信链路,确保设备与服务器之间的连接始终保持活动状态,并及时发现和处理连接问题。

三、项目中使用到的软件

在这里插入图片描述
本项目我们会使用到MQTTX这个软件:

MQTTX 是一个开源的跨平台 MQTT 客户端工具,用于在物联网开发和调试过程中与 MQTT 代理进行交互。它提供了直观和功能丰富的界面,方便用户进行 MQTT 消息的发布、订阅和管理。

以下是 MQTTX 的一些主要特点和功能:

支持多种操作系统:MQTTX 可以在 Windows、macOS 和 Linux 等多个操作系统上运行,提供了跨平台的支持。

直观的用户界面:MQTTX 提供了简洁直观的用户界面,易于使用和导航。用户可以轻松地配置连接参数、订阅主题、发布消息和查看消息交互。

完整的 MQTT 协议支持:MQTTX 支持 MQTT 3.1.1 和 MQTT 5.0 版本,包括各种 MQTT 消息的发布、订阅、连接管理和 QoS (服务质量) 等级控制。

主题订阅管理:用户可以在 MQTTX 中方便地管理订阅主题,并查看接收到的消息历史记录。同时,MQTTX 还支持通配符订阅,例如使用 “+” 和 “#” 进行通配符匹配。

快速发布和订阅消息:MQTTX 提供了快速和便捷的消息发布和订阅功能,用户可以实时查看消息的传输和接收情况。

连接信息和调试:MQTTX 显示与 MQTT 代理的连接状态、断开原因和错误信息,用户可以轻松调试连接问题。

数据可视化:MQTTX 支持以图表形式可视化 MQTT 消息数据,帮助用户更好地理解和分析传感器数据、实时指标等。

四、MQTT中服务器和客户端建立连接的步骤

1.客户端发送 CONNECT 报文:客户端通过 TCP/IP 协议与 MQTT 服务器建立网络连接后,会发送 CONNECT 报文给服务器。CONNECT 报文包含了客户端的身份标识、协议版本、连接标志以及保持连接的参数等信息。

2.服务器响应 CONNACK 报文:MQTT 服务器接收到客户端的 CONNECT 报文后,会进行验证和处理。如果一切正常,服务器会向客户端发送 CONNACK 报文作为响应。CONNACK 报文包含了服务器的连接确认状态以及连接返回码。

3.保持连接(Keep Alive):一旦连接建立,在客户端和服务器之间的通信中,根据客户端在 CONNECT 报文中设置的 Keep Alive 值,客户端需要定期发送心跳(PingReq)报文到服务器,以证明其活动状态。服务器会相应地发送心跳响应(PingResp)报文。这样可以保持连接的活跃状态,并及时检测连接问题。

4.客户端和服务器进行消息交换:一旦连接建立且连接保持活跃,客户端和服务器之间可以进行 MQTT 消息的发布(PUBLISH)、订阅(SUBSCRIBE)、取消订阅(UNSUBSCRIBE)和断开连接(DISCONNECT)等操作。客户端可以发布消息给服务器,服务器可以将消息传递给订阅了相关主题的客户端。

5.客户端断开连接:当客户端希望断开与服务器的连接时,可以发送 DISCONNECT 报文给服务器。服务器收到 DISCONNECT 报文后,会关闭连接并释放相关资源。

总结

本篇文章就讲解到这里。下篇文章我们会对这个MQTT的源码进行分析。

更多推荐

使用cpolar配合Plex打造个人媒体站,畅享私人影音娱乐空间

文章目录1.前言2.Plex网站搭建2.1Plex下载和安装2.2Plex网页测试2.3cpolar的安装和注册3.本地网页发布3.1Cpolar云端设置3.2Cpolar本地设置4.公网访问测试5.结语1.前言用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各种碎片时间(追剧下饭、地铁上刷剧等等),看

【整理】text2kgbench: 语言模型根据本体生成知识图谱的能力

概述该论文的研究背景是大型语言模型(LLM)和基于本体的知识图谱(KG)在自然语言处理(NLP)任务中的性能提升。过去的方法存在一些问题,该论文提出的方法通过从文本中生成KG并遵循给定的本体,解决了这些问题,并鼓励了新的方法。本文提出了Text2KGBench,一个基准测试,用于评估语言模型根据本体从自然语言文本中生成

访问者模式简介

概念:访问者模式(Visitorpattern)是一种行为型设计模式,它允许在不修改已有对象结构的情况下定义新操作。该模式将数据结构与操作分离,使得新增操作变得容易,并且可以在不同的数据结构上复用相同的操作。特点:将操作封装到独立的访问者类中,使得添加新的操作变得简单。可以对一个对象结构中的元素进行多种不同类型的遍历和

Remix 和 Next.js 中实现依赖注入

文章目录在Remix中实现依赖注入在Next.js中实现依赖注入对比小结在Remix中实现依赖注入在Remix中实现依赖注入需要使用到context。下面是一个简单的示例:首先,在项目根目录下创建context.js文件:importReactfrom'react';constDependenciesContext=R

【Spatial-Temporal Action Localization(二)】论文阅读2017年

文章目录1.ActionVLAD:Learningspatio-temporalaggregationforactionclassification[code](https://github.com/rohitgirdhar/ActionVLAD/)[](https://github.com/rohitgirdhar/

platform驱动模型

一、总线驱动模型1.概念linux中将一个挂载在总线上的驱动的驱动模型分为三部分:device、driver和bus。device是用来保存设备信息的对象,存放在内核中一个klist_device链表中进行管理。driver当前设备的驱动信息对象,存放在内核中一个klist_driver链表中进行管理。bus是当前设备

【Python从入门到进阶】36、Selenium 动作交互

接上篇《35、selenium基本语法学习》上一篇我们介绍了selenium的基本语法,包括元素定位以及访问元素信息的操作。本篇我们来学习selenium操作网页的动作内容。一、什么是selenium动作操作动作操作是指使用Selenium调用WebDriver执行与用户交互相关的动作,例如单击、右键单击、悬停、拖放等

Redis集群搭建

Redis集群搭建1、主从模式部署1.1环境准备IP主机名角色192.168.54.200mastermaster192.168.54.201slave1slave1192.168.54.202slave2slave21.2下载下载地址:http://download.redis.io/releases/这里选择下载:

全链路自动化测试

背景从SOA架构到现在大行其道的微服务架构,系统越拆越小,整体架构的复杂度也是直线上升,我们一直老生常谈的微服务架构下的技术难点及解决方案也日渐成熟(包括典型的数据一致性,系统调用带来的一致性问题,还是跨节点跨机房复制带来的一致性问题都有了很多解决方案),但是有一个环节我们明显忽略了。在现在的微服务架构趋势下,微服务在

微信小程序| 打造ChatGPT英语四六级背单词小程序

一、需求背景学英语,最大的痛苦莫过于背单词!不知道你平时都是用什么方式在背单词呢?硬啃单词书?字典?还是说各类的背单词APP来回跳转?不可否认的是,单词一两遍完全记不住,没有个三四五六七八遍,都很难在考场的卷子上认出他!所以,这次我们来做一个通关英语四六级的背单词神器,让他能够基于艾宾浩斯遗忘规律来辅助我们高效背单词。

数仓主题域和数据域、雪花模型,星型模型和星座模型

数仓模型和领域划分一、主题域和数据域的差别二、雪花模型,星座模型和星型模型一、主题域和数据域的差别明确数据域作为数仓搭建的重要一环,能够让数仓的数据便于管理和应用。数据域和主题域都是数据仓库中的重要概念,但含义略有不同,常常作为面试官的面试考点。数据域指的是特定的业务领域或是业务过程,如销售、采购、人力资源管理、财务等

热文推荐