当前位置:   article > 正文

ESP32-WROOM-32E最小开发板编程入门(物联网篇)_esp32开发板

esp32开发板

一、MQTT服务器环境搭建

我们的ESP32开发板已经可以通过Wi-Fi正常连接网络,我们需要将板卡采集的数据上报到服务器,并将数据存入数据库,服务器可以下发指令到板卡执行某些动作,这样就实现了一个简单的IoT平台。

物联网一般使用的是MQTT通讯协议,MQTT主要是订阅者和发布者之间的消息传递。

因此我们这里需要搭建一个MQTT服务器,这里选用的是EMQX开源免费版本进行搭建。

1.1.概述

EMQX 是一款开源的大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条,单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息,同时保证毫秒级的低时延。

EMQX产品优势

  • **开放源码 **:基于 Apache 2.0 许可证完全开源,自 2013 年起 200+ 开源版本迭代。
  • **MQTT 5.0 **:100% 支持 MQTT 5.0 和 3.x 协议标准,更好的伸缩性、安全性和可靠性。
  • [海量连接]:单节点支持 500 万 MQTT 设备连接,集群可扩展至 1 亿并发 MQTT 连接。
  • 高性能:单节点支持每秒实时接收、移动、处理与分发数百万条的 MQTT 消息。
  • 低时延:基于 Erlang/OTP 软实时的运行时系统设计,消息分发与投递时延低于 1 毫秒。
  • 高可用:采用 Masterless 的大规模分布式集群架构,实现系统高可用和水平扩展

1.2.准备工作

1.2.1.硬件

  • 云端服务器(公网IP) 此项非必须,可在自已机器上进行本地搭建
  • 电脑(Windows 10)

1.2.2.软件

准备软件安装包:

EMQX官方文档提供了详细的说明,我们的云端服务器使用的是Ubuntu 22.04 64位系统,参考对应的文档选择某种安装方式即可,这里采用的是通过 Apt 源安装

EMQX官网: https://www.emqx.io/

1.3.安装

1.3.1.MQTT服务器搭建

1.通过以下命令配置 EMQX Apt 源:

curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash
  • 1

2.运行以下命令安装 EMQX:

sudo apt-get install emqx
  • 1

3.运行以下命令启动 EMQX:

sudo systemctl start emqx
  • 1

远程登录云端服务器,依次执行上面的三个命令,执行完成后EMQX服务就已经启动了。

浏览器中输入访问地址: http://IP:18083/,即可打开登录界面

20240711_4

注意事项

Ubuntu系统防火墙默认不开启18083端口,需要在设置防火墙开放18083端口,否则无法打开EMQX的管理界面Dashboard

初次登录账户和密码为admin/public,初次登录系统会要求修改密码

成功登录后可看到EMQX的管理平台Dashboard

20240711_1

1.3.2.安装MQTTX客户端

客户端工具是作为验证工具,用于快速测试MQTT消息服务和应用程序开发。

MQTTX官网:https://mqttx.app/zh

安装过程,到官网下载并运行安装程序

image-20240222115333398

下一步,选择安装路径

image-20240222115430528

点击安装,直至安装完成即可

image-20240222115508163

运行主界面

image-20240222115542011

默认为英文操作界面,设置为中文,点击左侧配置按钮,在Language栏选择简体中文即可

image-20240222120410440

1.3.3.MQTTX 工具创建客户端连接

1.启动 MQTTX 客户端。点击新建连接创建一个 MQTT 连接。

2.配置新建的 MQTT 连接作为消息发送客户端。

20240711_3

注意事项

1.MQTTX访问的是MQTT服务器1883端口,注意需要在服务器防火墙放行这个端口

2.连接所用到的用户名和密码需要在EMQX管理平台的客户端 认证中进行创建

1.3.4.MQTTX工具发送消息

我们已经创建了一个客户端连接并成功连接上了MQTT服务器,然后订阅一个主题hantu_iot/testtopic并向它发送一条消息。

打开MQTTX工具,点击添加订阅进入添加订阅窗口,在Topic文本框中输入hantu_iot/testtopic

image-20240611120701397

点击确定按钮,即可看到已经添加了这个订阅

image-20240611125655455

我们在MQTTX的右角下的Topic处输入hantu_iot/testtopic,并在内容框中输入一段json格式字符串,点击绿色提交按钮。

image-20240611125920400

可以看到MQTTX客户端向服务器提交了一条了消息,由于MQTTX客户端自已也订阅了这个主题,所以它也会收到服务器分发过来的这条消息,这就实现了一次简单的发送、接收消息。

二、开发板发布和订阅消息

MQTT服务器搭建完成以后,我们就可以将开发板采集到的数据通过MQTT协议发送到MQTT服务器,并将其存储到服务器数据库当中(数据持久化),由于EMQX免费版不提供数据持久化的功能,为了解决这个问题,我们会需要用到另外一个重要的工具Node-Red

2.1.引入第三方库

ESP32最小开发板通过WiFi连接到网后,通过MQTT协议收发消息,我们需要用到第三方库PubSubClient库

引入方法,我们打开Arduino IDE,进入项目->导入库–>管理库

在左侧库管理界面搜索栏中输入我们想要查找的库名称,我们这里输入"PubSubClient",回车进行搜索

image-20240611133737716

点击安装直接进行安装即可,这里选择的版本是2.8.0

2.2.输入代码

接下来我们就可以开始编写代码了,输入以下代码

#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>

/*=========================== 全局变量及宏定义 =============================*/
// WiFi
const char *ssid = "此处为WIFI网络名称";
const char *password = "此处为WIFI密码";

// MQTT Broker
const char *mqtt_broker = "MQTT服务器IP";    // 服务器地址
const char *clientid = "Hantu-1234";        // 自定义clientid
const char *topic = "hantu_iot/testtopic";  // 定义 Topic
const char *mqtt_username = "用户名";        // 用户名
const char *mqtt_password = "密码";          // 密码
const int mqtt_port = 1883;                 // 端口


//定义客户端
WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  // 初始化波特率
  Serial.begin(9600);
  // 连接WiFi网络
  WiFi.begin(ssid, password);
  Serial.print("正在连接WIFI");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println(".");
  }
  Serial.println("连接成功");
  Serial.print("IP Address");
  Serial.println(WiFi.localIP());

  // 连接到MQTT服务器
  client.setServer(mqtt_broker, mqtt_port);
  // 设置mqtt保持活跃时间 ms
  client.setKeepAlive(60);
  // 设置回调函数
  client.setCallback(callback);

  while (!client.connected()) {
    Serial.printf("The client %s connects to the public mqtt broker\n", clientid);
    if (client.connect(clientid, mqtt_username, mqtt_password)) {
      Serial.println("ESP32开发板连接MQTT服务器成功");
    } else {
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);
    }
  }

  // 定阅主题
  client.subscribe(topic, 0);
  // 发布消息
  client.publish(topic, "Hi EMQX, I'm ESP32 ^^");

}

void callback(char *topic, byte *payload, unsigned int length) {
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
  Serial.print("Message:");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  Serial.println("-----------------------");
}

void loop() {
  client.loop();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

2.3.编译并上传程序

输入完成后,初次编译需要指定程序的存放目录,工程名称命名为MQTT_SendToServer,然后执行上传命令即可进行代码的编译并上传至开发板,点击上传按钮开始上传

image-20240611153519621

注意事项

每次上传程序的时候需要注意选择正确的开发板和端口

看到这样的执行结果就说明程序已经正常上传到开发板,我们打开串口监视器

image-20240612155033047

可以看到程序已经正常运行。

注意事项

由串口监视器输出的结果可以看到,板卡向MQTT服务器发送消息以后,板卡也收到了这条消息,因为在发布消息以前,板卡本身也订阅了这个主题,所以服务器会把消息推送过来,同时MQTTX工具也会收到这条消息。

三、远程控制LED灯

本示例学习如何远程能过网络来控制LED的开和关,我们已经实现了与MQTT服务器的消息通信,接下来我们来实现远程控制板载LED灯的开和关。

3.1.控制LED灯程序

打开Arduino IDE,输入程序,命名工程名称为MQTT_Led_OnOff

#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

/*=========================== 全局变量及宏定义 =============================*/
// WiFi
const char *ssid = "此处为WIFI网络名称";
const char *password = "此处为WIFI密码";

// MQTT Broker
const char *mqtt_broker = "MQTT服务器IP";    // 服务器地址
const char *clientid = "Hantu-1234";        // 自定义clientid
const char *topic = "hantu_iot/testtopic";  // 定义 Topic
const char *mqtt_username = "用户名";        // 用户名
const char *mqtt_password = "密码";          // 密码
const int mqtt_port = 1883;                 // 端口

//定义客户端
WiFiClient espClient;
PubSubClient client(espClient);

/*=========================== 自定义全局变量&宏定义 =============================*/
int redPin = 25;

void setup() {
  // 初始化波特率
  Serial.begin(9600);
  // 设置LED灯为输出模式
  pinMode(redPin, OUTPUT);

  // 连接WiFi网络
  WiFi.begin(ssid, password);
  Serial.print("正在连接WIFI");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println(".");
  }
  Serial.println("连接成功");
  Serial.print("IP Address");
  Serial.println(WiFi.localIP());

  // 连接到MQTT服务器
  client.setServer(mqtt_broker, mqtt_port);
  // 设置mqtt保持活跃时间 ms
  client.setKeepAlive(60);
  // 设置回调函数
  client.setCallback(callback);

  while (!client.connected()) {
    Serial.printf("The client %s connects to the public mqtt broker\n", clientid);
    if (client.connect(clientid, mqtt_username, mqtt_password)) {
      Serial.println("ESP32开发板连接MQTT服务器成功");
    } else {
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);
    }
  }

  // 定阅主题
  client.subscribe(topic, 0);
  // 发布消息
  client.publish(topic, "Hi EMQX, I'm ESP32 ^^");
}

void callback(char *topic, byte *payload, unsigned int length) {
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
  Serial.print("Message:");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  Serial.println("-----------------------");

  //解析payload获取LED灯的开和关的值
  JsonDocument doc;
  deserializeJson(doc, payload);
  int led_logic = doc["led"];

  if (led_logic == 1) {
    digitalWrite(redPin, LOW);
    Serial.println("LED灯已打开");
  }
  if (led_logic == 0) {
    digitalWrite(redPin, HIGH);
    Serial.println("LED灯已关闭");
  }
  delay(50);
}

void loop() {
  client.loop();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

然后编译并上传程序到板卡

3.2.MQTTX发送开关指令

我们打开MQTTX客户端,连接到服务器,然后向开发板订阅的主题"hantu_iot/testtopic"发送消息,服务器在接收到MQTTX的消息后以后在将消息推送给订阅者(开发板),从而就可以实现远程的控制

我们定义了一个简单的json字符串,只发送0或者1来进行开关

image-20240627160555359

注意事项

发送数值1为开灯、数值0为关灯

点击发送即可看到灯的开关状态

image-20240627160729564

注意事项

由于MQTTX工具也订阅了"hantu_iot/testtopic"这个主题,所以它发送出去的消息服务器也会给它推送过来

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/1001171
推荐阅读
相关标签
  

闽ICP备14008679号