ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关

这段时间入手了安信可的ESP32-C3开发板,我买的是ESP32-C3-32S开发板(外置4M)的。之前写过一个微信小程序获取onenet数据的,这下顺便整个流程衔接起来。

一、OneNet平台

1、创建产品

控制台 —>MQTT物联网套件–>添加产品

关于产品名称、行业、类别那些自行选择即可,这里选用mqtt协议
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第1张图片
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第2张图片

2、创建设备

点击我们创建好的产品,进去下一个页面,在页面左边的有一个设备列表,然后添加设备,这个设备名称后面需要用到
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第3张图片
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第4张图片

3、创建数据流

首先点击数据流,然后点击数据流模板管理,最后添加数据流模板

这里设置的数据流名称后面要用到,这里我创建了温度、湿度的数据流。

ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第5张图片

ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第6张图片

ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第7张图片

二、工作环境

这里我使用的是Arduino IDE,它的库很多,大部分可以直接调用,只有少部分需要自己下载,网上资源有很多,可以自己查找下载,这里我直接跳过安装。
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第8张图片

因为我之前使用过esp32开发板,一开始我以为环境是跟ESP32一样的,事实证明我还是太年轻了。后面我通过安信可官方给的包替换。下面的链接是官方的,里面也有Arduino IDE 的安装包

链接:https://pan.baidu.com/s/1kLPvsDpwQf1lz_e3goxpJg
提取码:1234
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第9张图片

ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第10张图片
配置好开发板相应环境
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第11张图片

三、代码撰写

1、设备怎么连上网

这里可以调用wifi库

#include 
const char* ssid     = "3671"; //wifi名称
const char* password = "05210835";//wifi密码

2、温湿度

我传感器用的是DHT11,这里也可以调用库

#include "DHT.h"

定义DHT11,数据引脚我接在IO7口

#define DHTPIN 7     // io7
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

3 、数据如何发送给onenet

3.1、这里我们需要查阅onenet的相关文档

https://open.iot.10086.cn/doc/mqtt/book/device-develop/topics/dp-topics.html
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第12张图片
3.2、鉴权信息

MQTT物联网套件中以accessKey为核心密钥,用户需要使用核心密钥通过签名算法计算签名,与其他参数共同组成token,然后将token作为请求Header参数进行鉴权(参考开发文档)

https://open.iot.10086.cn/doc/mqtt/book/application-develop/apiUsage.html
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第13张图片

3.3Onenet下发命令控制灯开关
上面我们已经把数据上传到Onenet的步骤已经搞定了,在原有的基础上写多几行代码即可实现Onenet下发命令,关于灯,本来想外接的,但是我在查看原理图后就想偷懒了,毕竟开发板有自带了两个灯和RGB灯。
3.3.1原理图
这里我选择的是18接口的灯,因为19的灯是常亮的,所以不选它。
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第14张图片

const int led =18; //灯的接口

在setup()定义灯是输出的

  pinMode(led,OUTPUT);//输出

3.3.2接受onenet命令函数

const char* topic="$sys/481938/wendu/dp/post/json";

在setup()设置接收命令函数

  client.setCallback(callback);                                //收到onenet平台的命令

写接收函数,这里我设置接收1是灯亮,0是灯灭。

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
 
  if ((char)payload[0] == '0') {
    digitalWrite(led, LOW);   // 
  } if ((char)payload[0] == '1') {
    digitalWrite(led, HIGH);  // 
  }
  else{}
}

写完这个,烧录代码进去,我们到onenet的设备列表界面进行操作,在右边的更多操作里面选择下发命令。然后发送数据即可。效果如下(黄灯是我控制开关的灯,白灯是常亮灯)。
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第15张图片
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第16张图片
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第17张图片

3.4完整代码

#include 
#include "DHT.h"
#include "PubSubClient.h"
#include "Ticker.h"
#define DHTPIN 7     
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);


const char* ssid     = "3671"; //wifi名称
const char* password = "05210835";//wifi密码
const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址
const int port = 1883;                     //端口号
const int led =18; //灯的接口
const char* topic="$sys/481938/wendu/dp/post/json";
#define mqtt_devid "wendu" //设备ID
#define mqtt_pubid "481938"        //产品ID
//鉴权信息
#define mqtt_password "version=2018-10-31&res=products%2F481938&et=1900000000&method=md5&sign=QR%2F0RUgyIXpnwY3yfO4XUA%3D%3D" //鉴权信息
WiFiClient espClient;           //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
char msgJson[75]; //发送信息缓冲区
//信息模板
char dataTemplate[] = "{\"id\":481938,\"dp\":{\"temp\":[{\"v\":%.2f}],\"humi\":[{\"v\":%.2f}]}}";  //  temp humi要与onenet相对应
Ticker tim1; //定时器,用来循环上传数据

void setupWifi(){
  WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print("正在连接中----\n");
        
    }

    Serial.print("WIFI已连接\n");
    Serial.print(WiFi.localIP());
}
void setup() {

  pinMode(led,OUTPUT);//输出
  Serial.begin(115200);
  setupWifi();   //调用函数连接WIFI
  Serial.print(F("DHT11 test!"));
  dht.begin();                                            
  client.setServer(mqtt_server, port);                   //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口
  client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
  if (client.connected())
  {
    Serial.print("OneNet is connected!");//判断以下是不是连好了.
  }
  client.setCallback(callback);                                //收到onenet平台的命令
  client.subscribe("$sys/481938/wendu/cmd/request/#"); //订阅命令下发主题
  tim1.attach(10, sendTempAndHumi);                            //定时每10秒调用一次发送数据函数sendTempAndHumi

}
  
void loop() {
delay(5000);
float h = dht.readHumidity(); 
float t = dht.readTemperature(); 
float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!\n"));
    return;
  }
  //可以让我们通过串口查看数据
  Serial.print(F("Humidity: "));        
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("℃  \n "));
  
  if (!WiFi.isConnected()) //先看WIFI是否还在连接
  {
    setupWifi();
  }
  if (!client.connected()) //如果客户端没连接ONENET, 重新连接
  {
    clientReconnect();
    delay(100);
  }
  client.loop(); //客户端循环检测


}
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
 
  if ((char)payload[0] == '0') {
    digitalWrite(led, LOW);   // 
  } if ((char)payload[0] == '1') {
    digitalWrite(led, HIGH);  // 
  }
  else{}
}


void sendTempAndHumi()
{
  if (client.connected())
  {
    //dht.readHumidity()
    snprintf(msgJson,75,dataTemplate,dht.readTemperature(),dht.readHumidity()); 
    Serial.print("public the data:");
    Serial.print(msgJson);
    client.publish("$sys/481938/wendu/dp/post/json", (uint8_t *)msgJson, strlen(msgJson));
    
    //发送数据到主题
    delay(500);
    
  }
}
void clientReconnect()
{
  while (!client.connected()) //再重连客户端
  {
    Serial.print("reconnect MQTT...");
   if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password))
    {
      Serial.print("connected");
      client.subscribe("$sys/481938/wendu/cmd/request/#"); //订阅命令下发主题
    }
    else
    {
      Serial.print("failed");
      Serial.print(client.state());
      Serial.print("try again in 5 sec");
     delay(5000);
    }
  }
}

实现效果
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第18张图片

可能是因为这里我用的是authorization鉴权,所以之前的微信小程序又不能获取数据,后面我把小程序里面的api-key换authorization就可以了。

ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第19张图片

祝各位元旦快乐
ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关_第20张图片

你可能感兴趣的:(ESP32-C3,物联网,iot)