因为工创Ⅲ的缘故不得不重新学习原来大一所学的ESP8266和MQTT服务器相关的知识,但是本人记性实在是非常的差,为了重新学习又在网上搜集了很久的知识,这里为了防止以后出现类似的情况,这里就写一篇博客记录一下。
前置准备
我们首先需要在windows自带的商店中装上ubuntu虚拟机(用于配置服务器)和MQTTBox软件(用于测试服务器)。Ubuntu有很多种类型,具体选择的型号选择下图所示的这一种:
Ubuntu下载好了之后,进去进行基础配置。(密码因为奇怪的原因输入的时候不会显示,大家记住自己的密码输的是什么就好!)
然后下面进行的就是在Ubuntu上安装其配置EMQX服务器的操作,具体操作可以去看:
配置好了以后,一般只需要记住以下三条常用指令:
启动emqx服务器
sudo emqx start
关闭emqx服务器
sudo emqx stop
在浏览器输入localhost:18083即可访问服务器的Dashboard,密码为默认密码。
测试
打开emqx服务器后测试需要使用mqttbox,打开mqttbox,点击上方Create MQTT Client
protocol选择mqtt/tcp,Host填入服务器所在Ipv4地址,可以使用cmd输入ipconfig获得。第一个ClientName随便填一个即可。
然后点击save。
如图,如果上述按钮变为绿色显示connected,说明连接服务器成功,测试成功!
ESP8266连接并控制其上的LED灯
控制代码如下(有详细注释):
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "************";//WiFi名称
const char* password = "*********";//WiFi密码
const char* mqttServer = "***********";//服务器地址
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
const byte ledPin = LED_BUILTIN; // 需要控制的led灯
void setup() {
Serial.begin(9600);
//设置ESP8266工作模式为无线终端模式
WiFi.mode(WIFI_STA);
// 连接WiFi
connectWifi();
// 设置MQTT服务器和端口号
mqttClient.setServer(mqttServer, 1883);
// 连接MQTT服务器
connectMQTTServer();
mqttClient.setCallback(callback); // 设置回调,控制led灯
pinMode(ledPin,OUTPUT);
}
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())) { //设置mqtt主题的id
//连接成功后就订阅主题
mqttClient.subscribe("hopeful");//订阅主题
Serial.print("订阅主题成功!!");
} else {
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("");
}
//回调函数
void callback(char* topic, byte* payload, unsigned int length) {
// Serial.print("Message arrived [");
// Serial.print(topic);
// Serial.print("] ");
for (int i=0;i<length;i++) {
char receivedChar = (char)payload[i];
if (payload[length-1] == '1') { // 收到消息是 '1' 点亮LED灯
digitalWrite(ledPin,HIGH);
Serial.print(receivedChar); // 打印mqtt接收到消息
}
if (payload[length-1] == '0') // 收到消息是 '0' 关闭LED灯
digitalWrite(ledPin, LOW);
}
Serial.println();
}
在上述基础上,我们通过MQTTBOX订阅hopeful主题,并且在主题中输入1或者0,可以发现ESP8266开发板上的LED灯受到控制,证明实验板成功连上服务器,实验成功!