本文将演示如何通过 基于 ESP8266 的 NodeMCU,把通过 DHT11 传感器搜集到的温、湿度数据通过 MQTT 协议将其存储到 MySQL 数据库,便于后续对数据进行处理。

本文的总体架构如下:

在这里插入图片描述

本文有两种方案:

  1. 采用云服务器(EMQ X CLOUD)部署,然后在云服务器部署宝塔并新建MySQL数据库。
  2. 采用本地部署,在本地部署EMQ企业版,然后在本地部署宝塔并新建MySQL数据库。

本文采用了第一种方案,采用云服务器(EMQ X CLOUD)部署。
本文主要有五大部分:

  1. 数据采集与上传
  2. 云服务器(EMQ X CLOUD)的部署
  3. 云服务器数据库的建立
  4. EMQ X Cloud 规则引擎配置
  5. 实现效果

一、数据采集与上传

硬件配置

  • NodeMCU board x 1:NodeMCU 是一个开源的 IoT (硬件)开发平台,NodeMCU 包含了可以运行在ESP8266 Wi-Fi SoC芯片之上的固件,以及基于 ESP-12 模组的硬件。“NodeMCU” 缺省一般指的是固件,而不是开发套件。固件使用 Lua 脚本语言。
  • DHT11 temperature/humidity sensor x 1:DHT11
    数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器
  • 面包板(Breadboard )x 1
  • 跳线(Jumper wires)若干

硬件连接图请参考下图:

在这里插入图片描述
硬件连线

NodeMCU ----------------------- DHT11
D4      ----------------------- DATA
3.5V    ----------------------- VCC
GND     ----------------------- GND

代码编写

  1. 首先我们将导入 ESP8266WiFi 和 PubSubClient 库,ESP8266WiFi 库能够将 ESP8266 连接到 Wi-Fi 网络,PubSubClient 库能使 ESP8266 连接到 MQTT 服务器发布消息及订阅主题。
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "DFRobot_DHT11.h"
  1. 设置 Wi-Fi 名称和密码,以及 MQTT 服务器连接地址和端口。
// WiFi
const char *ssid = "602iot"; // Enter your WiFi name
const char *password = "18wulian";  // Enter WiFi password
// MQTT Broker
const char *mqtt_broker = "red263b0.cn.emqx.cloud";//EMQX CLOUD连接地址
const char *topic = "temp_hum/602iot";
const char *mqtt_username = "602iot";
const char *mqtt_password = "602iot";
const int mqtt_port = 12498;//mqtt端口
  1. 打开一个串行连接,以便于输出程序的结果并且连接到 Wi-Fi 网络。
// Set software serial baud to 115200;
Serial.begin(115200);
// connecting to a WiFi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.println("Connecting to WiFi..");
}
  1. 设置 MQTT Broker 信息。
//connecting to a mqtt broker
  client.setServer(mqtt_broker, mqtt_port);
  while (!client.connected()) {
    String client_id = "602iot_";
    client_id += String(WiFi.macAddress());
    Serial.println("Connecting to public emqx mqtt broker...");
    if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
      Serial.println("Public emqx mqtt broker connected!");
    } else {
      Serial.print("failed with state\n");
      Serial.print(client.state());
      delay(2000);
    }
  }
  1. 读取温湿度传感器数据以 json 格式上报数据。
    DHT.read(DHT11_PIN);//DHT11读取环境的温湿度数据
    float temp = DHT.temperature;
    float hum = DHT.humidity;
    // json serialize
    DynamicJsonDocument data(256);
    data["temp"] = temp;
    data["hum"] = hum;
    // publish temperature and humidity
    char json_string[256];
    serializeJson(data, json_string);
    // 数据格式:{"temp":23.5,"hum":55}
    Serial.println(json_string);
    client.publish(topic, json_string, false);

完整代码点击此处下载

二、 云服务器(EMQ X CLOUD)的部署

此部分可以到EMQ X CLOUD的官网文档来进行操作,官网文档有详细的操作步骤。
EMQ X CLOUD的官网文档

三、云服务器数据库的建立和数据表格的建立

我们需要在我们云服务器上安装一个数据库,我这里选择了一个简便的方法,在服务器上安装了一个宝塔面板,这是一个图形化的服务器控制面板,提供了许多方便快捷的服务,宝塔面板提供一键安装LNMP套件服务。
具体的安装过程参考宝塔官网
我们安装完面板后,第一次打开面板会自动提示安装LNMP套件,选择一键安装即可,安装完成之后点击数据库,选择新建数据库,要记住用户名和密码,等下我们本地连接数据库的时候要用到,访问权限建议选择所有IP。

在这里插入图片描述
创建好数据库之后就可以进行创建表格,可以用SQL语句来进行建表。

在这里插入图片描述
温湿度表创建

使用以下 SQL 语句将创建 temp_hum 表,该表将用于存放设备上报的温度和湿度数据。

CREATE TABLE `temp_hum` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `up_timestamp` timestamp NULL DEFAULT NULL,
  `client_id` varchar(32) DEFAULT NULL,
  `temp` float unsigned DEFAULT NULL,
  `hum` float unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `up_timestamp_client_id` (`up_timestamp`,`client_id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4;

数据库建立好表格之后,可以在本地用Navicat 15 for MySQL连接数据库,对刚刚建立的数据库进行查看和修改。Navicat下载地址

打开Navicat 15 for MySQL软件选择新建连接——MySQL,连接名可以随意填,主机填写我们云服务器的IP地址,端口默认选择3036,用户名和密码填写我们上一步新建数据库时填写的用户名和密码,填写完之后可以选择测试连接,如果出现无法连接的情况就去宝塔面板—安全—防火墙再次放行3036端口。

在这里插入图片描述
连接上数据库之后,点击相应的表就可以查看相应的数据了。

在这里插入图片描述
四、 EMQ X Cloud 规则引擎配置

  1. 资源创建

点击左侧菜单栏规则引擎,找到资源面板,点击新建资源,下拉选择 MySQL 资源类型。填入刚才创建好的 mysql 数据库信息,并点击测试如果出现错误应及时检查数据库配置是否正确。

在这里插入图片描述
2. 规则测试

点击左侧左侧菜单栏规则引擎,找到规则面板,点击创建,然后输入如下规则匹配 SQL 语句。在下面规则中我们从 temp_hum/emqx 主题读取消息上报时间 up_timestamp、客户端 ID、消息体(Payload),并从消息体中分别读取温度和湿度。

SELECT 

timestamp as up_timestamp, clientid as client_id, payload.temp as temp, payload.hum as hum  

FROM  

"temp_hum/602iot"  

在这里插入图片描述
3. 添加响应动作

点击左下角添加动作,下拉选择 → 保存数据到 MySQL 选择第一步创建好的资源,并输入以下数据插入 SQL 模板。

insert into temp_hum(up_timestamp, client_id, temp, hum) values (FROM_UNIXTIME(${up_timestamp}/1000), ${client_id}, ${temp}, ${hum}) 

在这里插入图片描述
4. 查看规则监控

在这里插入图片描述
5. 测试

使用MQTT X模拟温湿度数据上报
需要将 broker.emqx.io 替换成已创建的部署连接地址,并添加客户端认证信息。

在这里插入图片描述
在Navicat 15 for MySQL软件上查看数据库,可以看到模拟数据已经转存到数据库中。

在这里插入图片描述
五、实现效果

使用 Arduino IDE 将完整代码上传到 NodeMCU,并打开串口监视器。

在这里插入图片描述
建立 MQTT X 客户端 与 MQTT 服务器的连接, 并测试温湿度数据接收。

在这里插入图片描述
MQTT服务器收到消息后,会检测是否符合规则,如果消息命中规则,则将数据封装为JSON格式存进数据库。

在这里插入图片描述
演示视频链接

总结

至此为止,完成了从 NodeMCU 采集数据,并上传到 EMQ 提供的 MQTT 云服务并存储到 MySQL 数据库。在后续的项目中,还需要在后端方面进行数据处理并应用到实际生活应用当中。

更多推荐