# 前言
上一篇文章使用 esp8266
做了一个 http 服务器,这次在上个代码基础上增加 MQTT
服务,让 esp8266
作为一个 client
连接本机的 MQTT
服务.
# 安装 PubSubClient
在 Arduino
上开发 MQTT
协议相关程序,需要引入 PubSubClient
库.
# 写点代码
#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 server
和 MQTTX
都打开,上电之后成功收到了开发板发布的消息
使用 MQTTX
向 inTopic
主题发送消息,也可以用来控制 LED 灯