# 前言

上一篇文章使用 esp8266 做了一个 http 服务器,这次在上个代码基础上增加 MQTT 服务,让 esp8266 作为一个 client 连接本机的 MQTT 服务.

# 安装 PubSubClient

Arduino 上开发 MQTT 协议相关程序,需要引入 PubSubClient 库.

# 写点代码

p
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <PubSubClient.h>
// 定义 wifi 名称和密码
const char* ssid = "HUAWEI-KTT6S5_HiLink";
const char* password = "15008683399lwp";
// 设置 led 灯的 gpio
const int led = 2;
// 创建一个 WebServer 监听 80 端口
ESP8266WebServer server(80);
// 创建 mqtt client
const char* mqtt_server = "192.168.1.15";
WiFiClient espClient;
PubSubClient client(espClient);
long lastReconnectAttempt = 0;
// 重新连接函数
boolean reconnect() {
  if (client.connect("mqttClient")) {
    // 发布一条消息
    client.publish("outTopic","hello world!I am a Esp8266!");
    // 订阅一个主题
    client.subscribe("inTopic");
  }
  return client.connected();
}
void mqtt_callback(char* topic, byte* payload, unsigned int length){
  Serial.print("Message: [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  if ((char)payload[0] == '1') {
    //led 灯亮
    digitalWrite(led, 0);
  } else {
    //led 灯灭
    digitalWrite(led, 1);
  }  
}
void handleRoot(){
  const String Html = "<!DOCTYPE html>\
    <html>\
      <head>\
        <meta charset=\"utf-8\">\
        <title>Hello ESP8266!</title>\
      </head>\
      <body>\
        <h1>看到的这个网页为ESP8266提供<h1>\
      </body>\
    </html>";
  digitalWrite(led,1);
  server.send(200,"text/html",Html);
  digitalWrite(led,0);
}
void handleNotFound(){
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);  
}
void setup() {
  Serial.begin(115200);
  // 设置 led 为输出模式
  pinMode(led,OUTPUT);
  digitalWrite(led,1);
  // 设置 Wifi 连接模式为 STA
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid,password);
  while(WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(2000);
  }
  server.on("/",handleRoot);
  server.onNotFound(handleNotFound);
  server.begin();
  // 连接电脑上启动的 mqtt server
  client.setServer(mqtt_server, 8883);
  client.setCallback(mqtt_callback);
  lastReconnectAttempt = 0;
  Serial.println("connect success!");
  Serial.println(WiFi.localIP());
  digitalWrite(led,0);digitalWrite
}
void loop() {
  server.handleClient();
  if (!client.connected()) {
    long now = millis();
    if (now - lastReconnectAttempt > 5000) {
      lastReconnectAttempt = now;
      if (reconnect()) {
        lastReconnectAttempt = 0;
      }
    }
  } else {
    client.loop();
  }
}

写好之后验证没有问题进行上传烧写到板子里,接下来就测一下

# 测试

上电之前在电脑上把 MQTT serverMQTTX 都打开,上电之后成功收到了开发板发布的消息

使用 MQTTXinTopic 主题发送消息,也可以用来控制 LED 灯

MQTTX