从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )

前言

学了这么久的物联网,一直停留在硬件层面的数据采集和显示,虽然也用过Ubuntu系统进行过项目开发(年初的时候用树莓派完成了口罩识别的项目),也使用过云服务器与硬件简单的MQTT通讯,但是一直没有把两者紧密的结合起来,这两天实现了从硬件采集数据、上传到云服务器以及将数据永久化(存储进数据库)的整个物联网系统,接下来我详细的叙述整个系统是如何实现的,也算是给自己留个纪念。
本文将分为五个部分:

  1. 用硬件来采集温度数据并通过MQTT协议上传到云服务器
  2. 在服务器上搭建自己的MQTT服务器
  3. 在云服务建立一个数据库
  4. 利用MQTT服务器对上传的数据进行解析并存储
  5. 实现效果

从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第1张图片

一、数据采集与上传

这里用到的硬件主要有:主控板ESP32、钢琴按键一排、DHT11一个(代替红外测温模块)
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第2张图片
硬件连线

ESP32   --------------------- DHT11
P19  --------------------- DATA
3.5V    --------------------- VCC
GND     --------------------- GND
ESP32   --------------------- PianoKey
P23     --------------------- key1
5V      --------------------- VCC
GND     --------------------- GND

关于数据格式
我们MQTT服务器接收到的JSON数据格式,即接收到的MQTT消息应该如下

{
     "name":"anyone",
"temp":"25",
"date":"2021-4-19",
"time":"22:32:36",
"client_id":"esp32"}

所以我们发出的代码定义的字符串应该对"进行转义处理,避免编译时当作特殊字符而出错

String message = "{
     \"name\":\"xxx\",
\"temp\":\"25\",
\"date\":\"2021-4-19\",
\"time\":\"22:32:36\",
\"client_id\":\"esp32\"}"

需要在消息中插入变量时应使用"+String+"的格式进行拼接。

String message = "{
     \"name\":\"xxx\",
\"temp\":\""+String+"\",
\"date\":\""+Date+"\",
\"time\":\""+Time+"\",
\"client_id\":\"esp32\"}";

部分代码
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第3张图片

采集数据部分就是一个简单的DHT11,上传部分用了WIFI和MQTT,使用了WIFI库和PubSubClient库,为了记录每次测温数据的时间,这里还使用了一个全球的ntp服务器,每次开机自动联网,根据设定初始化并连接MQTT服务器和时间服务器,然后循环检测按键是否按下,按下则采集数据,并将数据封装成JSON格式,通过MQTT协议上传到云服务器。硬件的部分没什么特别难的地方,比较烦人的地方是将数据封装成JSON格式,要将一些变量转成字符串格式并且拼接在一起,特别要注意转义字符的使用,否则就会报错或者发送的数据无法解析;另外一个地方就是获取网络时间,ntp设置东八区获取的时间会晚八个小时,获取后把年月日、时分秒取出来、进行校正,最后拼接到上传的JSON数据里。这两个部分几乎耗费了我一天的时间。关于网络时间的获取可以参考这篇文章https://blog.csdn.net/LinQiPing233/article/details/83615058

完整代码点击此处下载

串口打印的信息
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第4张图片
用MQTTX进行调试也能接收到发送的数据,到这里硬件部分算是告一段落了。

从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第5张图片

二、搭建MQTT服务器

这部分需要用到云服务器,由于我阿里云的服务器过期了,所以去腾讯云白嫖了一个月的服务器,如果实在没有服务器的话,也可以在虚拟机里搭建,废话不多说,MQTT我用的是EMQ,大家可以去官网下载,建议大家选择zip包安装
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第6张图片
获取安装ZIP包

wget https://www.emqx.cn/downloads/enterprise/v4.2.5/emqx-ee-ubuntu18.04-4.2.5-x86_64.zip

解压并安装

unzip emqx-ee-ubuntu18.04-4.2.5-x86_64.zip

进入解压的目录运行shell命令启动EMQ

./bin/emqx start

启动成功后查看运行状态

emqx_ctl status

从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第7张图片到这里EMQ算是安装完成了,但是要想使用MQTT服务,必须还要在云服务器的安全组里放行MQTT所使用的1883端口,同时EMQ自带了个 管理控制台Dashboard,使用18083端口,放行之后可以通过IP:18083进行访问,详细的内容大家可以去看官方的文档https://docs.emqx.cn/enterprise/v4.2/getting-started/dashboard-ee.html#%E7%9B%91%E6%8E%A7
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第8张图片
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第9张图片
接下来我们用MQTTX来测试MQTT服务器,测试软件在这里下载https://mqttx.app/cn/
新建一个连接
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第10张图片
连接上之后可以向指定的Topic发送消息,也可以订阅Topic,同时在控制台也可以看到连接上了的客户端
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第11张图片

从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第12张图片
通过MQTTX给服务器发送消息,控制台中也能看到,说明服务器已经搭建完成可以使用,至此MQTT部分已经完成。
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第13张图片
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第14张图片

三、云端数据库搭建与设计表格

这部分需要在我们的云服务器上安装一个数据库,我在这里选择的是MySQL,还需要安装PHP、Nginx。大家可以自行在服务器上安装,这里就不展开来说了。由于阿里云的服务器过期之后忘记备份了,我又不想从头安装配置一遍,我选择了个简单的方法,安装宝塔运维面板,宝塔面板提供一键安装LNMP套件服务,这里提供大家参考。
宝塔官网
Ubuntu/Deepin安装命令:

 wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh 124cc0

安装成功之后,同样在云服务器的安全组放行TCP8888端口,通过IP:8888访问运维面板。
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第15张图片
第一次打开面板会自动提示安装LNMP套件,选择一键安装即可,安装完成之后点击数据库,选择新建数据库,要记住用户名和密码,等下我们本地连接数据库的时候要用到,访问权限建议选择所有IP。
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第16张图片数据库建立好之后,在安全组放行3306端口,在本地用Navicat 15 for MySQL连接数据库,对刚刚建立的数据库进行设计和修改。Navicat下载地址
打开Navicat选择新建连接——MySQL,连接名可以随意填,主机填写我们云服务器的IP地址,端口默认选择3036,用户名和密码填写我们上一步新建数据库时填写的用户名和密码,填写完之后可以选择测试连接,如果出现无法连接的情况就去宝塔面板—安全—防火墙再次放行3036端口。
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第17张图片
连接上数据库之后,双击展开,点击选中表,右键选择新建表格,根据自己的需求添加字段设计表格,类型可以选择整型、字符串、浮点型等,如果是需要存储中文字符数据,例如name字段,字符集需要选择utf8mb4,排列规则选择utf8mb4_general_ci,否则会出现乱码。设计好之后,Ctrl+Shift+S保存一下,到这里数据库部分就算搭建完成了。
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第18张图片

四、数据解析以及数据永久化

在这里我们需要将服务器收到的JSON格式数据根据字段分割开来,并且将相应的字段存进数据库,实现数据的永久化,这一步可以使用MQTT服务器的规则引擎模块。
首先在规则引擎下找到资源,选择新建一个资源,由于我们的MQTT服务器和数据库在同一个云服务器上,所以这里填写的IP地址是本地的127.0.0.1:3306,用户名和密码则是我们创建数据库时设定的,如果忘了可以去宝塔面板上查询,填好之后选择测试连接,如果显示资源可用的则配置成功。
注意如果安装的EMQ是Broker版本,是不支持数据库资源的。
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第19张图片添加资源完成之后,选择规则,新建规则,这里的规则就是用来根据字段切割消息,大家可以参考我的规则,然后根据自己数据库的字段以及上传的消息来编写规则。

SELECT

  payload.client_id AS client_id,
  payload.name AS name,
  payload.date as date,
  payload.time AS time,
  payload.temp AS temp

FROM

  "$events/message_delivered" //接受

WHERE
  topic = 'topic_temp'

从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第20张图片

填写好规则后进行SQL测试,确保上传的数据能正确解析。
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第21张图片
点击测试后可以输出正确的数据则配置成功。
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第22张图片最后一步就是把数据存进数据库了,即创建响应动作,资源选择我们刚刚创建的MySQL数据库资源

insert into
  `temp` (`client_id`, `name`, `date`,`time`, `temp`)
  //temp是要插入数据的表的名字
values
  (${
     client_id},${
     name},${
     date},${
     time},${
     temp});
  //对应刚刚规则输出的值

从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第23张图片

五、实现效果

开机自动连接WIFI并初始化连接MQTT服务器
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第24张图片
等待按键按下,检测到按键按下则读取温度信息、获取网络时间,将相关数据封装为JSON格式上传。
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第25张图片
MQTT服务器收到消息后,会检测是否符合规则,如果消息命中规则,则将数据根据字段切割,并且存进数据库。
从硬件采集到云端数据库全实现之物联网体温检测系统(ESP32+MQTT+云服务器+MySQL )_第26张图片
视频效果链接:https://b23.tv/cPe6Ls

你可能感兴趣的:(Arduino,mysql,mqtt,物联网,云服务器)