项目目的
本项目利用Wemos将DHT11采集的温湿度数据通过MQTT协议上传至EMQ X服务器,进而将EMQ X指定主题下且满足条件的消息存储到 MySQL 数据库。
硬件准备
硬件 | 数量 |
---|---|
Wemos | 1 |
DHT11 | 1 |
USB转串口数据线 | 1 |
杜邦线 | 若干 |
软件准备
1、Arduino IDE
2、腾讯云服务器
3、宝塔Linux面板
4、EMQ X
5、MySQL
6、MQTTX
硬件连接
Wemos | DHT11 |
---|---|
5V | VCC |
GND | GND |
D2 | DATA |
项目过程
1、云服务器
阿里云、腾讯云、华为云等云服务器均可
(本项目用的是腾讯云服务器,系统为Ubuntu18.04)
2、宝塔面板
2.1、安装宝塔面板
在云服务器上安装宝塔面板前,要注意服务器不能有以下环境:Apache/Nginx/php/MySQL(若有其中之一则会安装出错)。
支持宝塔面板的Linux操作系统有CentOS、Ubuntu、Deepin、Debian、Fedora。本项目使用的是Ubuntu。
Ubuntu 宝塔安装指令:
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
2.2、登录宝塔面板
宝塔Linux面板默认端口是8888,安装好宝塔面板后,在浏览器输入{您服务器的公网IP:8888}即可访问。
我们也可以根据自己情况修改8888这个端口,修改的端口范围为8888 - 65535,但切记要在云服务器的安全组以及宝塔面板的安全防火墙界面放行端口。
2.3、添加数据库
1、在宝塔 Web 面板首页 ,点击左侧菜单栏“数据库”>> 添加数据库按钮:
2、在添加数据库对话框中输入数据库名称、用户名,密码可以随机也可以自行输入。类型默认MySQL,访问权限我选择的是所有人(由于设备在不同的网络环境中IP不固定),然后点击【提交】按钮。
3、至此,我们已经成功创建了一个数据库:
4、在这个页面可以直接点击phpMyAdmin对数据库进行管理,也可以点击相应数据库右侧的按钮对其进行管理。如管理(进入数据库执行 sql 语句等)、权限(设置数据库权限)、改密(修改数据库密码)和删除(删除数据库)等。
5、进入数据库管理界面新建数据表并添加字段。
当然,有Navicat for MySQL的friends也可以使用它来进行数据库管理。
3、数据配置
3.1 安装 EMQ X Enterprise
1、在云服务器上安装EMQ X Enterprise:
2、在云服务器的安全组以及宝塔面板的安全防火墙界面放行端口,在浏览器输入{服务器的公网IP:18083}即可访问。
(18083是默认端口,您也可以根据自身情况进行修改)
3.2 资源创建
1、打开 EMQ X Dashboard,进入左侧菜单的资源页面,点击 新建按钮,键入 MySQL 服务器信息进行资源创建。
2、EMQ X 集群中节点所在网络环境可能互不相同,资源创建成功后点击列表中状态按钮,查看各个节点资源连接状况,如果节点上资源不可用,请检查配置是否正确、网络连通性,并点击重连按钮手动重连。
3.3 规则创建
1、进入左侧菜单的规则页面,点击新建按钮,进行规则创建。
2、在规则的SQL输入中输入以下代码用于获取testtopic/0主题发布的payload中包含的三个字段的值:
SELECT
payload.Temperature AS Temperature,
payload.Humidity AS Humidity,
payload.ts AS ts
FROM
"testtopic/0"
3、点击规则-响应动作中的添加按钮,选择保存数据到 MySQL 动作,选取刚刚选定的资源,我们使用 ${fieldName} 语法填充 SQL 语句,将数据插入到数据库,最后点击新建按钮完成规则创建。
动作的 SQL 配置如下:
INSERT INTO
`test` (`Temperature`, `Humidity`, `ts`)
VALUES
(${Temperature}, ${Humidity}, ${ts});
3.4 SQL测试
借助 SQL 测试功能,确保SQL输入中的代码格式和测试的json数据格式无误。
若发送的payload与测试输出的内容与格式一致,则说明代码和payload的格式无误。
由上图可以看出测试输出与预期相符。
4、MQTTX测试
1、使用MQTTX软件新建连接:
2、在EMQ X Dashboard的左侧菜单栏中选中工具-WebSocket,填写 “连接配置” 的参数:
(切记:“连接配置”中的“Client ID”不能和MQTTX中的“Client ID”一致,否则会导致WebSocket的连接自动断开)
3、订阅设备发布的topic:
4、在MQTTX中使用刚创建的连接通过testtopic/0将数据模板发布至服务器上:
MySQL中存储到的数据:
可以看到在WebSocket中能正确接收数据并成功转存在MySQL中,至此测试完毕。
5、代码
本项目调用了ESP8266WiFi、PubSubClient、ESP8266HTTPClient、ArduinoJson、dht库,实现了使用了DHT11采集温湿度数据,获取网络时间戳,并将这些数据上传至云服务器,最后转存在MySQL数据库中。
部分代码如下:
完整代码点此下载。
实验效果
实验结论
以上就是一个简单的实现MQTT数据在MySQL上的数据持久化存储的实验,以前只是单纯玩过硬件采集数据上云,但没有做过把采集的数据上传云端并转存至数据库。现在一整套做下来发现其实并不难,在这个过程中碰到的难题是获取时间戳时json格式的解析。