连接MQTT服务器

发布时间 2023-09-09 17:58:43作者: 肖恩雷

连接MQTT服务器

当我们的Esp8266开发板连接到网络后,我们就需要测试验证以下Esp8266连接到MQTT服务器上,让Esp8266作为一个发布者,间隔1s向服务器发送一条信息。

1.导入库函数

需要连接到MQTT服务器,我们需要使用PubSubClient库函数,因此首先添加到工程中

image-20230909172436877

2.编写代码

MQTT服务器的话可以自行搭建也可以使用注册账号连接到公共的MQTT服务器,我这里使用自行搭建的EMQX作为服务器。

#include <Arduino.h>
#include <PubSubClient.h>
#include <WiFiManager.h>
/************************************/
// 函数声明
void wifiInit();
void connectMqttServer();
void publishMqttMessage();
/************************************/
// wifi连接信息
WiFiManager wiFiManager;
char *ssid = "2002";
char *password = "15828546007";
// mqtt服务器
const char *mqttServer = "110.41.13.221";
// wifi客户端
WiFiClient wificlient;
// mqtt客户端
PubSubClient mqttclient(wificlient);
/************************************/

void setup()
{

  // 启动串口
  Serial.begin(9600);
  // wifi初始化
  wifiInit();
  // 设置mqtt服务器地址和端口号
  mqttclient.setServer(mqttServer, 1883);
  // 连接Mqtt服务器
  connectMqttServer();
}

void loop()
{
  if (mqttclient.connected())
  {
    // 发布消息
    publishMqttMessage();
    // 保持心跳
    mqttclient.loop();
  }
  else
  {
    // 则尝试连接服务器
    connectMqttServer();
  }
}
// wifi初始化
void wifiInit()
{
  // 重置设置
  // wiFiManager.resetSettings();
  // 自动配网
  // wiFiManager.autoConnect("esp8266-wifi");
  WiFi.begin(ssid,password);
  Serial.println("wifi连接中...");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.println("小主不要着急,我正在加紧连接wifi中...");
  }
  Serial.print("报告小主,wifi连接成功,IP:");
  Serial.println(WiFi.localIP());
}

// 连接mqttServer
void connectMqttServer()
{
  // 客户端id
  String clientId = "esp8266-" + WiFi.macAddress();
  // 连接mqtt服务器
  if (mqttclient.connect(clientId.c_str()))
  {
    Serial.println("报告小主,已连接到MQTT服务器");
  }
  else
  {
    Serial.println("报告小主,连接MQTT服务器失败");
    delay(1000);
  }
}
// 发布消息
void publishMqttMessage()
{
  // 发布主题
  String topicStr = "esp8266/temperature";
  char publishTopic[topicStr.length() + 1];
  strcpy(publishTopic, topicStr.c_str());
  // 发布消息
  String messageStr = "hello world";
  char publishMsg[messageStr.length() + 1];
  strcpy(publishMsg, messageStr.c_str());

  // ESP8266向主题发布信息
  if (mqttclient.publish(publishTopic, publishMsg))
  {
    delay(1000);
    Serial.println("Esp8266发布消息成功");
  }
  else
  {
    Serial.println("Esp8266发布消息失败");
  }
}

代码编写好后,下载到开发板中,查看串口打印日志。Esp8266开发板作为客户端,间隔1s向服务器发送一条消息

image-20230909172934433

3.消费者MQTTX

使用MQTTX客户端工作作为我们的消费者,ESP8266作为发布者发布消息,MQTTX作为消费者,订阅主题后来消费该消息

image-20230909174356985

4.登陆EMQX服务器

登陆服务器查看,我们的Esp8266连接到服务器上查看相关信息

image-20230909174736395

image-20230909174836514