ESP32+MQTT+MySQL实现发布订阅【气味数据收集】

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: ESP32+MQTT+MySQL实现发布订阅【气味数据收集】

ESP32+MQTT+MySQL实现发布订阅【气味数据收集】

🔮🔮🔮🔮🔮相关文章🔮🔮🔮🔮🔮




@TOC



👨‍🏫内容1:前言


👨‍🏫 前言
👉有关ESP32实现气味反应以及搭建MQTT服务器的相关内容
👨‍💻可以参考往期博文
👋本章将实现ESP32将收集到的气味数据借助MQTT传输保存到MySQL数据库中


👨‍⚖️内容2:ESP32数据采集和发布


1️⃣气味数据采集:
👉这里我将简单展示气味采集的内容,具体详情可翻阅往期博文


int mq_pin = 33;
void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);   //9600 bps
 //Serial.println("CLEARDATA");
 //Serial.println("LABEL,VALUE");
}
void loop() {
 // put your main code here, to run repeatedly:
 int val;
 val=analogRead(33);
 //Serial.println(val ,DEC);
 //Serial.print("DATA, TIMER,");
 Serial.println(val);
 delay(500);
}


2️⃣数据采集和发布:
🎈这里我们将采集到的数据发布到MQTT服务器上
⬇️下面的代码中有部分需要自行修改填写⬇️


#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Ticker.h>    
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "xxxxxx";     //WIFI名称
const char* password = "xxxxxxx";   //WIFI密码
const char* mqttServer = "xxxxxxxx";    //MQTT服务器IP
Ticker ticker;   //定时执行任务
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
int count;    // Ticker计数用变量
int mq_pin = 33;   //引脚号
void setup() {
 Serial.begin(9600);
 //设置ESP32工作模式为无线终端模式
 WiFi.mode(WIFI_STA);
 // 连接WiFi
 connectWifi();
 // 设置MQTT服务器和端口号
 mqttClient.setServer(mqttServer, 1883);
 // 连接MQTT服务器
 connectMQTTServer();
 // Ticker定时对象
 ticker.attach(1, tickerCount); 
}
void loop() { 
 // delay(500);
 if (mqttClient.connected()) { // 如果开发板成功连接服务器
   // 每隔1秒钟发布一次信息
   if (count >= 2){
     pubMQTTmsg();
     count = 0;
   }    
   // 保持心跳
   mqttClient.loop();
 } else {                  // 如果开发板未能成功连接服务器
   connectMQTTServer();    // 则尝试连接服务器
 }
}
void tickerCount(){
 count++;
}
void connectMQTTServer(){
 String clientId = "slldxdb";
 // 连接MQTT服务器
 if (mqttClient.connect(clientId.c_str())) { 
   Serial.println("MQTT Server Connected.");
   Serial.println("Server Address: ");
   Serial.println(mqttServer);
   Serial.println("ClientId:");
   Serial.println(clientId);
 } else {
   Serial.print("MQTT Server Connect Failed. Client State:");
   Serial.println(mqttClient.state());   //打印连接返回码
   delay(3000);
 }   
}
// 发布信息
void pubMQTTmsg(){
 static int value; // 客户端发布信息用数字
 String topicString = "mqtt-mark";   //建立发布主题
 char publishTopic[topicString.length() + 1];  
 strcpy(publishTopic, topicString.c_str());
 int val;
 val=analogRead(mq_pin);
 // 建立发布信息
 String messageString = String(val);
 char publishMsg[messageString.length() + 1];   
 strcpy(publishMsg, messageString.c_str());
 // 实现ESP32向主题发布信息
 if(mqttClient.publish(publishTopic, publishMsg)){
   Serial.println("Publish Topic:");Serial.println(publishTopic);
   Serial.println("Publish message:");Serial.println(publishMsg);    
 } else {
   Serial.println("Message Publish Failed."); 
 }
}
// ESP32连接wifi
void connectWifi(){
 WiFi.begin(ssid, password);
 //等待WiFi连接,成功连接后输出成功信息
 while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi Connected!");  
 Serial.println(""); 
}


3️⃣实现效果图:
实现效果图如下⬇️



👨‍💻内容3:MQTT订阅和数据存储


🎯相关代码:
⬇️下面的代码中有部分需要自行修改填写⬇️


import json
import paho.mqtt.client as mqtt
import pymysql
"""rc 值 
0 连接成功
1 协议版本错误
2 无效的客户端标识
3 服务器无法使用
4 错误的用户名或密码
5 未经授权
"""
#打开数据库连接 【自行填写】
mysql_conn = pymysql.connect(user="xxx",password="xxx",host="xxx",database="xxx",port=3306)
def on_connect(client, userdata, flags, rc):
   return rc
def on_message(client, userdata, publishMsg):
   # data = publishMsg.payload
   # print(json.loads(data))
   msg = publishMsg.payload.decode('gb2312')
   print(msg)
   ##存数据到数据库中
   cursor = mysql_conn.cursor()
   insert_sql = 'insert into test (value) VALUES ("%s")' %(msg)
   cursor.execute(insert_sql)
   # 提交到数据库执行
   mysql_conn.commit()
   cursor.close()  # 先关闭游标
def main():
   client = mqtt.Client()
   client.username_pw_set(username='', password='')
   client.on_connect = on_connect
   client.on_message = on_message
   rc = client.connect(host='xxxx', port=1883, keepalive=15)    ##自行填写服务器地址信息
   print('rc', rc)
   if rc == 0:
       client.subscribe('mqtt-mark')    ##订阅主题
   else:
       print('连接失败')
       raise Exception
   # 无限循环收发消息
   client.loop_forever()
if __name__ == '__main__':
   main()


🎯效果展示:
⬇️当完全执行后,我们可以看到终端打印收到的数据⬇️
⬇️同时数据库中也依次收到相应的数据【对比图如下】⬇️



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
消息中间件
RabbitMQ消息模型之发布订阅Publish-Subscribe
RabbitMQ消息模型之发布订阅Publish-Subscribe
37 0
RabbitMQ消息模型之发布订阅Publish-Subscribe
|
网络性能优化
基于MQTT.fx的ESP8266主题发布订阅
本篇文章主要以ESP8266-12E作为开发板,带你了解MQTT发布、订阅、取消订阅的基础知识。
354 0
基于MQTT.fx的ESP8266主题发布订阅
|
存储 网络协议 物联网
NB-IoT 通信之 MQTT 发布订阅 | 学习笔记
快速学习 NB-IoT 通信之 MQTT 发布订阅
739 0
NB-IoT 通信之 MQTT 发布订阅 | 学习笔记
|
网络协议 安全 物联网
MQTT- 基于 mosquitto 开源 SDK 实现发布订阅 | 学习笔记
快速学习 MQTT- 基于 mosquitto 开源 SDK 实现发布订阅
569 0
MQTT- 基于 mosquitto 开源 SDK 实现发布订阅 | 学习笔记
|
消息中间件 Java PHP
RabbitMQ发布订阅实战-实现延时重试队列
本文将会讲解如何使用RabbitMQ实现延时重试和失败消息队列,实现可靠的消息消费,消费失败后,自动延时将消息重新投递,当达到一定的重试次数后,将消息投递到失败消息队列,等待人工介入处理。
2650 0
|
消息中间件 C# 存储
[译]RabbitMQ教程C#版 - 发布订阅
先决条件 本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672)。如果你使用不同的主机、端口或证书,则需要调整连接设置。 从哪里获得帮助 如果您在阅读本教程时遇到困难,可以通过邮件列表 联系我们。
1195 0
|
存储 SQL MySQL
Mysql 5.7中数据量更改统计数据收集的逻辑
今天一个朋友在问Mysql什么时候收集统计数据,我就简单的找了一下源代码,现总结如下。如有错误请指出,因为我只是简单做了一下调试。 一、持久化(PERSISTENT))与非持久化统计数据(TRANSIENT) Mysql统计数据分为持久化和非持久化 持久化统计数据 存储在mysql.innodb_index_stats和mysql.innodb_table_stats中 非持久化统计数据 存储在information_schema.indexes和information_schema.tables中 前者是innodb表后者是memory表。
2973 0
|
21天前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
21天前
|
消息中间件 Java C语言
消息队列 MQ使用问题之在使用C++客户端和GBase的ESQL进行编译时出现core dump,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
7天前
|
消息中间件 存储 缓存
一个用过消息队列的人,竟不知为何要用 MQ?
一个用过消息队列的人,竟不知为何要用 MQ?
31 1