【物联网】初步认识了解MQTT

news2024/11/26 20:49:03

目录

一、MQTT是什么

二、MQTT的版本

两者之间的关系:

​编辑三、MQTT工作的基本原理

3.1、概念

MQTT客户端:

MQTT服务端:

MQTT主题:

以下面这个图为例进行解释:

3.2、MQTT订阅/发布主题的特点

相互可独立性:

空间可分离:

时间可异步:

四、连接到MQTT服务器端

4.1理论篇

MQTT客户端连接到MQTT服务端一共有两个步骤

4.2实战篇

电脑端MQTT客户端连接MQTT服务器

ESP8266连接MQTT服务端


一、MQTT是什么

特点:客户端/服务端架构、发布/订阅模式、易于实现

二、MQTT的版本

两者之间的关系:

三、MQTT工作的基本原理

深入了解客户端、服务端的概念,首先来看一下下概念:

3.1、概念

MQTT客户端:

MQTT服务端:

MQTT主题:

以下面这个图为例进行解释:

汽车、手机、电脑都是可以作为MQTT客户端,MQTT服务器是服务端

1、汽车将数据传输至MQTT服务端,然后手机和电脑可以从MQTT服务器端获取数据

2、客户端可以接收数据和上传数据,如下图所示:

3、客户端上传或读取数据时,需要指定该数据的主题,就是说明这个数据是干啥的。可以将主题

理解为一个频道,可以在这个主题里面发布数据或读取数据,例如汽车速度和空调温度是两个不同

的主题。

3.2、MQTT订阅/发布主题的特点

相互可独立性:

提炼:就是发布主题的客户端不知道有多少其他客户端订阅了该主题,订阅该主题的客户端也不知

道一共有多少人订阅了该主题,只知道自己是否订阅了。

空间可分离:

时间可异步:

某个客户端上传数据时,如果订阅该主题的客户端不在线,那么服务端会先保存该信息,当订阅该

主题的客户端上线时,再进行推送。

可是可以的意思,并不是一定是这样

四、连接到MQTT服务器端

4.1理论篇

MQTT客户端连接到MQTT服务端一共有两个步骤

第一个步骤:客户端向服务端发送连接请求connect

简而言之:就是MQTT客户端向MQTT服务端发送一个特定格式的数据包(报文)connect,包括

一些连接的信息以及连接以后的一些设置,数据包格式如下:

先来学习clientID、cleanSession、keepAlive这三个变量

clientID:连接到服务器端的客户端名称标识。连接到同一MQTT服务端的clientID不能重复只能有

一个;

cleanSession(干净会话):标识此连接是否重要。如果为FALSE,则说明此连接不是干净会话,

是一个重要的连接过程,当服务器端给此客户端发信息时,如果未收到客户端的确认信息,则会一

直保存要发送的信息,直至收到客户端的确认信息。

keepAlive:心跳时间间隔。MQTT服务端想知道客户端是否连接到服务端,需要客户端定时给服

务端发消息确认,这个心跳时间间隔就是发送信息的间隔。

第二个步骤:服务端向客户端发送确认连接请求connack

简而言之:就是服务端收到了客户端发来的连接请求,所以向客户端返回一个确认收到请求连接的

报文,数据包为connack,格式为下:

该报文只有两个变量,比较简单

returnCode:连接返回码。返回连接状态,是否成功,如果不成功则返回错误代码

sessionPresent:当前会话。对于比较重要的连接,如果服务端发送消息后,未收到客户端的确认

消息,则会保存着数据等待下次发送,直至成功。这个sessionpresent参数就是标明服务端是否有

未收到客户端确认的数据。需要与cleansession配合使用

4.2实战篇

电脑端MQTT客户端连接MQTT服务器

首先要有一个MQTT客户端软件,这里以MQTTfx为例,下载链接如下:

下载 – 太极创客 (taichi-maker.com)http://www.taichi-maker.com/homepage/download/#mqtt下载以后打开以后是这个页面:

通过设置一些参数,可以尝试连接,可以连接本地的服务端,也可以连接一些公共的MQTT服务端

可以连接到公网IP测试是否可以连接,例如:test.ranye-iot.net

注意:我连接然那个公共的MQTT服务器没有成功,测试的是一个国外的MQTT公共服务器

如上图所示,已经成功连接; 

MQTTFX客户端使用教程:

【太极创客】零基础入门学用物联网 - MQTT篇 1-4 服务端连接操作_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1T54y1k7MQ/?spm_id_from=333.788.recommend_more_video.0&vd_source=0864131da85286458a76f1653d414f35

ESP8266连接MQTT服务端

要写好程序烧录至开发板,这是极为关键的

1、首先将pubsubclient库加载到arduino上,具体方法如下:

为Arduino IDE安装添加库 – 太极创客 (taichi-maker.com)

库的下载地址:下载 – 太极创客 (taichi-maker.com)

2、其次编写程序(太极创客实例程序)

/**********************************************************************
本程序旨在演示如何使用PubSubClient库使用ESP8266向连接MQTT服务器。
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "taichi-maker";
const char* password = "12345678";
const char* mqttServer = "test.ranye-iot.net";
 
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/
 
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
 
void setup() {
  Serial.begin(9600);
 
  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);
  
  // 连接WiFi
  connectWifi();
  
  // 设置MQTT服务器和端口号
  mqttClient.setServer(mqttServer, 1883);
 
  // 连接MQTT服务器
  connectMQTTServer();
}
 
void loop() { 
  if (mqttClient.connected()) { // 如果开发板成功连接服务器    
    mqttClient.loop();          // 保持客户端心跳
  } else {                  // 如果开发板未能成功连接服务器
    connectMQTTServer();    // 则尝试连接服务器
  }
}
 
void connectMQTTServer(){
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  String clientId = "esp8266-" + WiFi.macAddress();
 
  // 连接MQTT服务器
  if (mqttClient.connect(clientId.c_str())) { 
    Serial.println("MQTT Server Connected.");
    Serial.println("Server Address: ");
    Serial.println(mqttServer);
    Serial.println("ClientId:");
    Serial.println(clientId);
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(3000);
  }   
}
 
// ESP8266连接wifi
void connectWifi(){
 
  WiFi.begin(ssid, password);
 
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");  
  Serial.println(""); 
}

3.烧录程序即可

打开串口监视器,会有以下信息显示:

 今天的介绍就先到此为止,感谢大家的阅读

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

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

相关文章

【2023年五一数学建模竞赛C题】“双碳”目标下低碳建筑研究--完整思路和代码

1.问题背景与描述 赛题评析&#xff1a;这道题其实主要还是考察学生搜集资料的能力&#xff0c;可发挥空间大&#xff0c;适合小白快速上手 2.解题思路分析 2.1 问题一的分析 1.空调性能系数 2.热导系数 热导系数是指物质导热的能力&#xff0c;通常用单位时间内单位面积…

从STM32F407到AT32F407(一)

雅特力公司的MCU有着性能超群&#xff0c;价格优越的巨大优势&#xff0c;缺点是相关资料少一些&#xff0c;我们可以充分利用ST的现有资源来开发它。 我用雅特力的STM32F437开发板&#xff0c;使用原子 stm32f407的开发板自带程序&#xff0c;测试串口程序&#xff0c;原设定…

【网络安全】文件包含漏洞总结

目录&#xff1a; 介绍文件包含漏洞分类 LFIRFIPHP 的文件包含函数漏洞示例代码利用任意文件读取 使用 PHP 封装协议 php://filterphp://inputRFI getshellLFI文件上传 getshellLFI日志文件 getshellLFI/proc/self/environgetshellLFIphpinfo getshellLFIsession getshell绕过…

数据结构——队列的构建

在本次博客当中我们来学习一下队列的构建。首先来介绍一下队列。队列也是一种被限制的线性表。队列要求我们其中的元素只可以从队尾进入从队头出数据。也就是说我们先进入队列的数据就会先出队列。所以我们可以将我们的两种线性表改编成为我们的队列。话题又回到了我们两种线性…

算法记录 | Day44 动态规划

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

【初学人工智能原理】【3】梯度下降和反向传播:能改(上)

前言 本文教程均来自b站【小白也能听懂的人工智能原理】&#xff0c;感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白&#xff0c;由于缺少图片可能无法理解&#xff0c;故放到了最后&#xff0c;建议直接看代码&#xff08;代码放到了前面&#xff09;。 代码实…

itop-3568开发板驱动学习笔记(24)设备树(三)时钟实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 生产者属性#clock-cells 属性clock-output-namesclock-frequencyassigned-clockclock-indicesassigned-clock-parents 消费者属性 设备树中的时钟信息以时钟树形式体现&#xff0c;时钟树包括时钟的属性和结…

C#_语言简介

目录 1. C# 简介 2. Visual Studio 窗口界面显示 1. C# 简介 什么是程序&#xff1f; 程序&#xff08;Program&#xff09;简单来说就是&#xff1a; 计算机是无法听懂我们人类的语言的&#xff0c;也可以说我们通过我们日常交流的语言是无法控制计算机的&#xff0c;计算机…

排序算法 - 快速排序

文章目录 快速排序介绍快速排序实现快速排序时间复杂度和稳定性快速排序稳定性快速排序时间复杂度 代码实现核心&总结 每日一道算法&#xff0c;提高脑力。第二天&#xff0c;快速排序。 快速排序介绍 它的基本思想是: 选择一个基准数&#xff0c;通过一趟排序将要排序的…

Spring容器技术

Spring容器技术 1. Spring核心容器介绍1.1 创建容器1.2 获取bean对象1.3 容器类层次结构1.4 BeanFactory 2. Spring核心容器总结2.1 容器相关2.2 bean相关2.3 依赖注入相关 1. Spring核心容器介绍 问题导入 问题&#xff1a;按照Bean名称获取Bean有什么弊端&#xff0c;按照B…

(七)ArcCatalog应用基础——图层操作与数据输出

&#xff08;七&#xff09;ArcCatalog应用基础——图层操作与数据输出 目录 &#xff08;七&#xff09;ArcCatalog应用基础——图层操作与数据输出 1.地图与图层操作1.1创建图层1.2设置文件特征1.3保存独立的图层文件 2.地理数据输出2.1输出为Shapefile2.2输出为Coverage2.3属…

[Spring]初始导读

1.Spring初始 1. 为什么要学框架 学习框架相当于从"小作坊"到"工厂"的升级 , 小作坊什么都要做 , 工厂是组件式装配 , 特点就是高效. 2.框架的优点展示(SpringBoot Vs Servlet) 使用SpringBoot 项目演示框架相比 Servlet 所具备的以下优点: 无需配置 …

KDZD电缆安全双枪刺扎器

一、产品背景 多年以来&#xff0c;电力电缆的维护迁移过程中的识别与刺孔&#xff0c;均按照行业标准DL409-91《电业安全工作规程&#xff08;电力线路部分&#xff09;》第234条要求&#xff0c;采用人工刺孔&#xff0c;一旦电缆识别出错&#xff0c;误刺孔带电电缆将对人身…

Win11调整分区大小的方法有哪些?

电脑磁盘分区的大小关系着我们的系统运行流畅、文件数据分门别类、磁盘空间充分利用等&#xff0c;是一个非常重要的工作。那么Win11调整分区大小的方法有哪些&#xff1f; 使用命令提示符 缩小分区 步骤1. 在搜索框中输入cmd并以管理员身份运行命令提示符。 步骤2. 依次输入…

分布式事务TCC 你真的理解了吗

TCC&#xff08;补偿事务&#xff09; TCC 属于目前比较火的一种柔性事务解决方案。TCC 这个概念最早诞生于数据库专家帕特 赫兰德&#xff08;Pat Helland&#xff09;于 2007 发表的 《Life beyond Distributed Transactions: an Apostate’s Opinion》 这篇论文&#xff0…

本地 WAF 已死,云 WAF 永生

多年来&#xff0c;Web 应用程序防火墙 (WAF) 一直是应用程序保护的代名词。事实上&#xff0c;许多应用程序安全团队认为保护其应用程序的最佳选择是一流的本地 WAF 解决方案&#xff0c;尤其是当这些应用程序部署在本地或私有云中时。 但自从引入本地 WAF 以来&#xff0c;…

授权码 + PKCE 模式|OIDC OAuth2.0 认证协议最佳实践系列【03】

​ 在上一篇文章中&#xff0c;我们介绍了 OIDC 授权码模式&#xff08;点击下方链接查看&#xff09;&#xff0c;本次我们将重点围绕 授权码 PKCE 模式&#xff08;Authorization Code With PKCE&#xff09;进行介绍 &#xff0c;从而让你的系统快速具备接入用户认证的标准…

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习

详情点击链接&#xff1a;R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习 Meta分析的选题与文献检索 Meta分析Meta分析的选题策略文献检索数据库精确检索策略&#xff0c;如何检索全、检索准文献的管理与清洗&#xff0c;如何制定文献纳入排除标准文献数据获取技…

( 哈希表) 128. 最长连续序列 ——【Leetcode每日一题】

❓128. 最长连续序列 难度&#xff1a;中等 给定一个未排序的整数数组 nums&#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O ( n ) O(n) O(n) 的算法解决此问题。 示例 1&#xff1a; 输入…

ai数字人无限播是什么?数字人直播带货如何搭建?操作教程及注意事项分享

随着数字技术的不断进步&#xff0c;直播行业也在不断的发展壮大。其中&#xff0c;数字人直播成为了最为热门的直播方式之一。数字人直播利用AI技术创建出的虚拟数字人进行直播&#xff0c;给观众带来了全新的视觉体验。而随着数字人直播的不断发展&#xff0c;数字人直播带货…