前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文玩转MQTT (ESP8266+DHT11+MQTT+MYSQL方案)

一文玩转MQTT (ESP8266+DHT11+MQTT+MYSQL方案)

作者头像
逍遥子大表哥
发布2023-06-10 15:36:31
1.2K1
发布2023-06-10 15:36:31
举报
文章被收录于专栏:kali blog

本文我们来聊一聊esp8266利用mqtt协议进行通信。并将数据数据存入数据库的操作。

关于MQTT

MQTT(消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。

搭建MQTT服务器

这里我们利用emqx在centos中来搭建mqtt服务器。官方提供了直观的安装方式,及其简单。这里我安装的是EMQX5.0(企业版)

代码语言:javascript
复制
wget https://www.emqx.com/zh/downloads/enterprise/v5.0.0/emqx-enterprise-5.0.0-el7-arm64.rpm
yum install emqx-enterprise-5.0.0-el7-arm64.rpm
sudo systemctl start emqx

需要注意的是,尽量不要下载最新版的。因为很多功能在最新版中要钱。更多历史版本可以在这里下载https://www.emqx.com/zh/downloads/enterprise

然后输入初始账号admin public登录。

配置esp8266

我们需要将DHT11的数据通过mqtt协议发送出来。烧录代码如下。

代码语言:javascript
复制
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

/************ WIFI and MQTT Information (CHANGE THESE FOR YOUR SETUP) ******************/
const char* ssid = "PDCN"; //type your WIFI information inside the quotes
const char* password = "1234567890";
const char* mqtt_server = "192.168.123.173";
const char* mqtt_username = "admin";
const char* mqtt_password = "admin";
const int mqtt_port = 1883;
const char* mqtt_sensor_topic = "dht11";
unsigned long last_send = 0;

#define DHTPIN 4 
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE);

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(115200);
  dht.begin();

  setupWifi();
  client.setServer(mqtt_server, mqtt_port);
}

// 连接 Wifi
void setupWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop()
{
  if ( !client.connected() ) { // MQTT 是否连接成功
    reconnect();
  }
  if ( millis() - last_send > 5000 ) { // 每5秒发布一次温湿度数据
    handleTemperatureAndHumidity();
    last_send = millis();
  }
  client.loop();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(mqtt_sensor_topic, mqtt_username, mqtt_password)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

void handleTemperatureAndHumidity() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t) ) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }
  // 准备JSON Payload
  String payload = "{";
  payload += "\"temp\":"; payload += t; payload += ",";
  payload += "\"humi\":"; payload += h;
  payload += "}";

  // 发送温湿度数据
  char attributes[100];
  payload.toCharArray( attributes, 100 );
  client.publish( mqtt_sensor_topic, attributes );
  Serial.println( attributes );
}

在上述代码中,我们引入了PubSubClientDHT库。在ide中安装这两个库。(注意版本,过高可能编译不过)

上传代码到esp8266。过会儿我们在emqx中便可以看到设备已经上线了。

查看订阅数据

在上述代码中,我们的订阅主题为dht11。下载mqtt工具mqttx。新建一个连接。

具体配置如下

连接完成后,添加订阅

如下,成功得到esp8266中的dht11的数据。

需要注意的是,我们需将数据处理成json数据,方便后期入库。如{"temp":23.40,"humi":57.00}

将数据存入mysql

为了后期方便数据,我们可以将数据存放到mysql中。具体操作如下:

点击数据桥接-创建-资源类型为mysql,填写相应的mysql账号等信息,并进行测试,提示资源可用则证明没有问题。

sql模板内容如下

代码语言:javascript
复制
insert into wendu ( temp, humi,time) values (${temp}, ${humi},FROM_UNIXTIME(${time}/1000) )

简单的sql插入语句,即在wendu表的temp humi time字段中插入相应的值。

配置完成后,会自动提示配置相应的规则

代码如下

代码语言:javascript
复制
SELECT
  timestamp as time, payload.temp as temp ,payload.humi as humi #获取值赋值给变量,注意逗号隔开。
FROM
  "dht11" # 数据来子订阅的主题dht11

现在,我们在mysql中新建一个wendu的表。并创建temp humitime字段。

最终效果如下

版权属于:逍遥子大表哥

本文链接:https://cloud.tencent.com/developer/article/2295611

按照知识共享署名-非商业性使用 4.0 国际协议进行许可,转载引用文章应遵循相同协议。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于MQTT
  • 搭建MQTT服务器
  • 配置esp8266
  • 查看订阅数据
  • 将数据存入mysql
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档