目录
一、MQTT是什么
二、MQTT的版本
两者之间的关系:
三、MQTT工作的基本原理
3.1、概念
MQTT客户端:
MQTT服务端:
MQTT主题:
3.2、MQTT订阅/发布主题的特点
相互可独立性:
空间可分离:
时间可异步:
四、连接到MQTT服务器端
4.1理论篇
两个步骤
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.烧录程序即可
打开串口监视器,会有以下信息显示:
今天的介绍就先到此为止,感谢大家的阅读