物联网入门:初识MQTT并连接到MQTT服务端

目录

一、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.烧录程序即可

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

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

物联沃分享整理
物联沃-IOTWORD物联网 » 物联网入门:初识MQTT并连接到MQTT服务端

发表评论