ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-22 21:02:13  阅读:283  来源: 互联网

标签:mqttClient ESP8266 WiFi MQTT 服务器 Serial 连接


因为工创Ⅲ的缘故不得不重新学习原来大一所学的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灯受到控制,证明实验板成功连上服务器,实验成功!

标签:mqttClient,ESP8266,WiFi,MQTT,服务器,Serial,连接
来源: https://www.cnblogs.com/mudrobot/p/15924914.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有