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

news2024/11/24 17:03:37

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


在这里插入图片描述

🔮🔮🔮🔮🔮相关文章🔮🔮🔮🔮🔮
ESP32连接MQ Sensor实现气味反应
🔗 https://blog.csdn.net/ws15168689087/article/details/131365573
ESP32连接云服务器【WebSocket】
🔗 https://blog.csdn.net/ws15168689087/article/details/131406163
个人云服务器搭建MQTT服务器
🔗 https://blog.csdn.net/ws15168689087/article/details/131571433
ESP32开发板引脚介绍【附有引脚使用实例】
🔗 https://blog.csdn.net/ws15168689087/article/details/131654327

文章目录

    • ESP32+MQTT+MySQL实现发布订阅【气味数据收集】
    • 👨‍🏫内容1:前言
    • 👨‍⚖️内容2:ESP32数据采集和发布
    • 👨‍💻内容3:MQTT订阅和数据存储


👨‍🏫内容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()
   

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/765336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指针知多少

作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;Python等 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1f495; ⛵前言 不知道大家还记…

avi格式怎么转换成mp4?教你几种简单转换小技巧

由于 AVI 格式的文件结构&#xff0c;它们不适合用于流式传输。这意味着&#xff0c;如果你想在线观看一个 AVI 格式的视频&#xff0c;你需要等待整个文件下载完成后才能开始观看。这对于那些希望尽快开始观看视频的人来说可能是一个问题。那么我们怎么将AVI格式的视频转换成M…

【C语言】memcpy,memmove,memcmp,memset函数详解

memcpy,memmove,memcmp,memset函数详解 memcpy函数一、 memcpy函数的定义&#xff1a;二、memcpy函数的功能&#xff1a;三、memcpy函数模拟memcpy注意事项 memmove函数一、memmove函数简介二、memmove函数的模拟1.两种情况2模拟实现 memcmp函数memecmp函数介绍 memset函数mems…

Cell 子刊 - 4D打印一只可变形的蜘蛛

国自然“十四五”优先发展领域公布&#xff0c;共计115项&#xff01;&#xff08;生物医学领域节选&#xff0c;近 50 项&#xff09;中提到 4D打印是一个重要方向。 凝胶状墨水使得3D打印应用于电子设备的金属物体更容易。 3D打印在经济性、设计自由度和效率方面均超越了传统…

Matplotlib中文乱码解决方案(两种方式)

Matplotlib 默认不支持中文字体&#xff0c;这因为 Matplotlib 只支持 ASCII 字符&#xff0c;但中文标注更加符合中国人的阅读习惯。因此&#xff0c;本节重点讲解如何在 Windows 环境下让 Matplotlib 显示中文。 Matplotlib中文乱码 当不对 Matplotlib 进行设置&#xff0c…

网页版五子棋设计实现自动化测试

目录 一、设计测试用例 二、执行测试 登录页面 功能测试 界面测试 注册界面 功能测试 界面测试 游戏大厅 功能测试 界面测试 游戏房间 功能测试 界面测试 一、设计测试用例 二、执行测试 在执行测试之前首先获取到驱动。 登录页面 功能测试 首先定义star…

2023年9月长沙/郑州/济南DAMA-CDGA/CDGP认证考试报名

据DAMA中国官方网站消息&#xff0c;2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启&#xff0c;相关事宜通知如下&#xff1a; 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…

Spark(26):Spark通讯架构

目录 0. 相关文章链接 1. Spark通信架构概述 2. Spark 通讯架构解析 0. 相关文章链接 Spark文章汇总 1. Spark通信架构概述 Spark 中通信框架的发展&#xff1a; Spark 早期版本中采用 Akka 作为内部通信部件。Spark1.3 中引入 Netty 通信框架&#xff0c;为了解决 Shuf…

靶机渗透之prime1(解法2)

prime1 靶机渗透获取目标shell查看当前用户下的信息查找是否含有有效的备份文件经过查找找到enc文件密码md5格式生成登录靶机Prime提权成功获取flag 靶机渗透 获取目标shell 查看当前用户下的信息 在当前文件夹下&#xff0c;enc文件需要密码&#xff0c;尝试去寻找该文件的密…

移远通信发布新款5G/4G、LPWA和GNSS天线,进一步优化物联网终端性能

2023年7月17日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;再次推出三款新型天线产品&#xff0c;以更优的通信和定位性能&#xff0c;满足各类物联网终端在5G/4G、LPWA和GNSS等技术上的更高设计需求。这三款天线包括&#xff1a; YEMN926J1A&…

【GlobalMapper精品教程】061:快速生成全球任意地区等高线

本文讲解在globalmapper中根据任意指定的区域下载数字地形并生成等高线,支持在CASS中打开并编辑。 文章目录 一、指定下载区域二、下载地形数据三、生成等高线四、投影转换五、导出等高线一、指定下载区域 首先,通过在线地图指定一个区域。当然你有区域范围,可以直接下载。…

爱上PyCharm全新UI的五个理由!让Python开发更个性化

在2023.1版本中&#xff0c; JetBrains官方产品团队对 PyCharm 的外观进行了重新设计&#xff0c;目标是降低视觉复杂性&#xff0c;使用户能够轻松访问基本功能&#xff0c;并根据需要逐级呈现复杂功能 – 打造整洁、现代且专业的外观和质感。 在本文中&#xff0c;我们将进一…

基于python+ResNet50算法实现一个图像分类识别系统入门

一、目录 ResNet50介绍图片模型训练预测项目扩展 在本文中将介绍使用Python语言&#xff0c;基于TensorFlow搭建ResNet50卷积神经网络对四种动物图像数据集进行训练&#xff0c;观察其模型训练效果。 二、ResNet50介绍 ResNet50是一种基于深度卷积神经网络&#xff08;Conv…

ChatGPT助力DevOps的优势与局限

一、前言 DevOps 是一种方法论&#xff0c;旨在提高软件开发和 IT 运营团队的协作和效率。DevOps 涉及各种任务和流程的自动化&#xff0c;例如规划、编码、测试、部署、监控和故障排除。然而&#xff0c;其中一些任务和流程仍然有大量任务需要人工手动处理&#xff0c;而这会…

Debian 系统安装中文输入法-iTOP3588开发板

Debian 系统烧写完成之后&#xff0c;并没有中文输入功能。本文档将介绍如何安装 ibus pinyin 输入法。 首先安装 fcitx 对应的工具&#xff0c;如下图所示&#xff1a; apt-get install fcitx fcitx-tools fcitx-config* fcitx-frontend* fcitx-module* fcitx-ui-* presage …

TDengine 的查询性能与老牌时序数据库相比如何?来看看

在上一篇文章《IoT 场景下写入性能&#xff1a;TDengine16.2 x InfluxDB》中&#xff0c;我们基于 IoT 场景下的 TSBS 时序数据库&#xff08;Time Series Database&#xff09;性能基准测试报告对三大数据库写入性能进行了相关解读&#xff0c;较为直观地展现出了 TDengine 的…

springboot @Async 异步调用接口处理数据

Async 异步背景 新增的数据需要分发给下游业务系统&#xff0c;由于下游业务系统状态未知&#xff0c;所以需要异步发送数据给下游业务系统。 系统生效按钮--->controller新增-->异步调用servcie--->数据集成 在springboot框架中实现步骤 首先在启动类上加上Enable…

数据分析:扩展企业微信、钉钉、飞书等告警通知渠道

本章节主要讲述如何扩展告警的通知渠道&#xff0c;以便将告警发送到第三方应用中 企业微信 实现目标 ●在鸿鹄中创建的告警被触发后&#xff0c;将告警通知发送至指定的企业微信群聊 配置步骤 1、打开“企业微信”&#xff0c;点击告警群右上角的“...”按钮 2、点击“群机器人…

opencv双目视觉标定、匹配和测量

双目视觉原理方面参照《学习Opencv》和大牛博客 http://blog.csdn.net/chenyusiyuan/article/details/5970799中16-19系列博客。本文主要记录我自己在双目视觉标定,立体匹配,测量中遇到的问题和解决方法,并附有代码,文末有代码下载的地址,欢迎交流。 博主使用的相机是USB双…

Android P 之Zygote进程源码分析

init进程是用户空间的第一个进程&#xff0c;而zygote进程则是第一个java进程。zygote进程是init进程的子进程&#xff0c;init进程通过解析rc文件&#xff0c;运行了zygote进程。 zygote是Android系统中一个相当重要的进程&#xff0c;它的主要功能就是执行Android应用程序。…