概述
这段时间入手了安信可的ESP32-C3开发板,我买的是ESP32-C3-32S开发板(外置4M)的。之前写过一个微信小程序获取onenet数据的,这下顺便整个流程衔接起来。
一、OneNet平台
1、创建产品
控制台 —>MQTT物联网套件–>添加产品
关于产品名称、行业、类别那些自行选择即可,这里选用mqtt协议
2、创建设备
点击我们创建好的产品,进去下一个页面,在页面左边的有一个设备列表,然后添加设备,这个设备名称后面需要用到
3、创建数据流
首先点击数据流,然后点击数据流模板管理,最后添加数据流模板
这里设置的数据流名称后面要用到,这里我创建了温度、湿度的数据流。
二、工作环境
这里我使用的是Arduino IDE,它的库很多,大部分可以直接调用,只有少部分需要自己下载,网上资源有很多,可以自己查找下载,这里我直接跳过安装。
因为我之前使用过esp32开发板,一开始我以为环境是跟ESP32一样的,事实证明我还是太年轻了。后面我通过安信可官方给的包替换。下面的链接是官方的,里面也有Arduino IDE 的安装包
链接:https://pan.baidu.com/s/1kLPvsDpwQf1lz_e3goxpJg
提取码:1234
配置好开发板相应环境
三、代码撰写
1、设备怎么连上网
这里可以调用wifi库
#include <WiFi.h>
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
3.2、鉴权信息
MQTT物联网套件中以accessKey为核心密钥,用户需要使用核心密钥通过签名算法计算签名,与其他参数共同组成token,然后将token作为请求Header参数进行鉴权(参考开发文档)
https://open.iot.10086.cn/doc/mqtt/book/application-develop/apiUsage.html
3.3Onenet下发命令控制灯开关
上面我们已经把数据上传到Onenet的步骤已经搞定了,在原有的基础上写多几行代码即可实现Onenet下发命令,关于灯,本来想外接的,但是我在查看原理图后就想偷懒了,毕竟开发板有自带了两个灯和RGB灯。
3.3.1原理图
这里我选择的是18接口的灯,因为19的灯是常亮的,所以不选它。
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的设备列表界面进行操作,在右边的更多操作里面选择下发命令。然后发送数据即可。效果如下(黄灯是我控制开关的灯,白灯是常亮灯)。
3.4完整代码
#include <WiFi.h>
#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);
}
}
}
实现效果
可能是因为这里我用的是authorization鉴权,所以之前的微信小程序又不能获取数据,后面我把小程序里面的api-key换authorization就可以了。
祝各位元旦快乐
最后
以上就是耍酷冬瓜为你收集整理的ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关的全部内容,希望文章能够帮你解决ESP32-C3通过MQTT协议把温湿度上传到OneNet平台,Onenet下发命令控制灯开关所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复