ESP8266连接MQTT服务器并实现点灯操作

因为工创Ⅲ的缘故不得不重新学习原来大一所学的ESP8266和MQTT服务器相关的知识,但是本人记性实在是非常的差,为了重新学习又在网上搜集了很久的知识,这里为了防止以后出现类似的情况,这里就写一篇博客记录一下。

前置准备

我们首先需要在windows自带的商店中装上ubuntu虚拟机(用于配置服务器)和MQTTBox软件(用于测试服务器)。Ubuntu有很多种类型,具体选择的型号选择下图所示的这一种:
ESP8266连接MQTT服务器并实现点灯操作
Ubuntu下载好了之后,进去进行基础配置。(密码因为奇怪的原因输入的时候不会显示,大家记住自己的密码输的是什么就好!)

然后下面进行的就是在Ubuntu上安装其配置EMQX服务器的操作,具体操作可以去看:

官方文档

配置好了以后,一般只需要记住以下三条常用指令:

启动emqx服务器

sudo emqx start

关闭emqx服务器

sudo emqx stop

在浏览器输入localhost:18083即可访问服务器的Dashboard,密码为默认密码。

测试

打开emqx服务器后测试需要使用mqttbox,打开mqttbox,点击上方Create MQTT Client
ESP8266连接MQTT服务器并实现点灯操作
protocol选择mqtt/tcp,Host填入服务器所在Ipv4地址,可以使用cmd输入ipconfig获得。第一个ClientName随便填一个即可。

然后点击save。

ESP8266连接MQTT服务器并实现点灯操作

如图,如果上述按钮变为绿色显示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灯受到控制,证明实验板成功连上服务器,实验成功!

上一篇:0_树莓派机载计算机的联网操作教程——无名创新


下一篇:前端需要了解的攻击及防御方法及场景