实验一 MQTT与MySQL数据持久化实验
DHT11+ESP8266上传温湿度数据到云服务器
准备
你需要有一个云服务器、ESP8266、DHT11、一条安卓线和3根母母线。
步骤:
首先登录你的云服务器终端界面,我这里以腾讯云为例,
然后打开网址https://www.emqx.cn/download,选中EMQ X Enterprise,
根据你的云服务器选择相应系统,安装方式选npm,CPU架构一般都是选x86_64,然后依次运行下面的命令来安装和运行emqx。
登录你的宝塔页面,还没安装的根据宝塔官网安装步骤自行安装即可,比较简单,这里就不说了。
选择数据库——添加数据库,输入数据库名,访问权限选本地服务器。
创建完数据库后,点击右边的管理,选中work,在新建数据表下输入名字和字段数,我这里写的是homework1和3
然后执行。再输入名字和类型,如下所示:
然后执行。
然后,云服务器和宝塔都要添加1883、3306和18083端口,比如腾讯云在安全组添加,宝塔选择安全,输入放行端口和备注即可放行。
接着打开浏览器输入网址:云服务器IP:18083,登录账号,选择规则引擎——资源——创建,选择MySql,输入你刚刚在宝塔创建的数据库的数据库名、用户名和数据库密码(注意下面都要根据所给图片选择要选的选项和输入相应内容)
然后确定。
再选择规则引擎——规则——创建,
SQL输入框填
SELECT
payload.xuhao as xuhao,payload.tem as tem,payload.hum as hum
FROM
"homework1"
WHERE
topic = 'homework1'
开启SQL测试,topic填刚SQL语句的TOPIC
payload框填{"xuhao": 1,"tem":2,"hum":3}
点击SQL测试看是否成功,成功的话添加动作
INSERT INTO
`homework1` (`xuhao`,`tem`,`hum`)
VALUES
(${xuhao},${tem},${hum});
然后点击创建,出错的话请自行检查。
接着用母母线连接ESP8266和DHT11,3V连VCC,DATA连D4,GND连GND,并将安卓线插入ESP8266和电脑相连,打开软件Arduino,点击工具——选择端口——com几,开发板选ESP8266 Boards(2.7.4)——Nodemcu1.0,没装所需的库文件的自行百度方法装,代码如下:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "DHT.h"
#define DHTPIN D4 //DHT11与NodeMUC的连接
// 连接WIFI
#define wifi_ssid "WIFI账号"
#define wifi_password "WIFI密码"
#define mqtt_server "IP地址" // MQTT云地址
//topic
#define topic "topic主题"
#define DHTTYPE DHT11 // DHT 11
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
void setup_wifi() {
delay(10);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi 连接成功!");
}
void reconnect() {
// 循环,直到我们重新连接
while (!client.connected()) {
Serial.print("尝试MQTT连接…");
if (client.connect("nodeMcuDHT11")) {
Serial.println("连接成功");
} else {
Serial.print("失败,rc =");
Serial.print(client.state());
Serial.println(" 在5秒后再试一次");
delay(5000);
}
}
}
bool checkBound(float newValue, float prevValue, float maxDiff) {
return newValue < prevValue - maxDiff || newValue > prevValue + maxDiff;
}
long lastMsg = 0;
int i = 1;
float tem = 0.0;
float hum = 0.0;
//float diff = 1.0;
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
dht.begin();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 30000) {
// 等待几秒钟之间测量
lastMsg = now;
float newTemp = dht.readTemperature();
float newHum = dht.readHumidity();
tem = newTemp;
hum = newHum;
// json serialize(json序列化)
DynamicJsonDocument data(256);
data["xuhao"] = i++;
data["tem"] = tem;
data["hum"] = hum;
// 发布温度和湿度
char json_string[256];
serializeJson(data, json_string);
// {"xuhao":1,"tem":23.5,"hum":55}
Serial.println(json_string);
client.publish(topic, json_string, false);
delay(2000);
}
}
根据自己实际情况修改代码,注意MQTT云地址为你的云服务器地址,后面不需要加东西。打开你的手机热点,然后上传代码,点击右上角串口监视器观察,如下所示:
打开刚刚自己数据库内创建的表,也可看到上传到服务器的温湿度数据。
完成!