概述
查询OneNet平台多协议接入文档,地址链接如下,这里直接查看MQTT的API使用方法:
https://open.iot.10086.cn/doc/v5/develop/detail/582
新版MQTT好像无法利用微信小程序调用API,旧版的可以,即在多协议接入中配置,配置方法和新版的配置方法一致,找到API地址和API密钥。
我用ApiPost来进行测试是否能获取数据,网页地址如下:
https://console.apipost.cn/apis/project
ApiPost设置如下,采用GET方式,填写好API地址和API密钥,然后发送,可以看到正确返回数据,数据格式如下:
微信小程序注册网上有很多教程,微信小程序项目中的每个文件的作用:
index.js | 页面逻辑代码用js实现 |
index.json | json数据 |
index.wxml | 页面标记语言与HTML相似 |
index.wxss | 页面样式 |
index.js代码如下,主要修改API地址和API密钥。
Page({
data: {
temperature:"0",
humidity: "0",
},
//周期函数
onLoad: function () {
setInterval(function () {
this.init()
}.bind(this), 1000)
},
init: function () {
var that = this
wx.request({
url: "https://api.heclouds.com/devices/********/datapoints", //将请求行中的数字换成自己的设备ID
header: {
"api-key": "***************" //换成自己的api-key
},
data: {
limit: 1
},
method: "GET",
success: function (e) {
console.log(e.data.data)
that.setData({
humidity: e.data.data.datastreams[0].datapoints[0].value,
temperature : e.data.data.datastreams[1].datapoints[0].value,
})
}
});
}
})
温湿度数据主要是根据上面ApiPost解析出来数据格式定位,代码如下:
humidity: e.data.data.datastreams[0].datapoints[0].value,
temperature : e.data.data.datastreams[1].datapoints[0].value
页面配置可以用可视化选项进行配置(像拖拽,添加文本等),所有配置完成后,可以看到小程序上可以显示自己的温湿度数据。
演示视频如下:
将完成的小程序进行上传发布,选择上传选项,如下图所示:
填写版本号:
上传成功如下:
登录微信公众平台,登录小程序平台,找到版本管理选项,可以看到刚才上传的小程序,如下图所示。
提交审核,下一步。
继续提交。
填写相关信息。
确定提交。
等待审核。
审核通过,发布即可。
发布后,手机上会自动出现发布的小程序,可以打开查看。
ESP32 MQTT旧版本程序与新版本有区别但不大,旧版本鉴权信息可以自己设定。
#include <Arduino.h>
#include "WiFi.h"
#include "PubSubClient.h"
#include "Ticker.h"
#include <Wire.h>
const char *ssid = "Redmi K40"; //wifi名
const char *password = "********"; //wifi密码
const char *mqtt_server = "183.230.40.39"; //onenet 的 IP地址
const int led =2; //灯的接口
#define mqtt_devid "*****" //设备ID
#define mqtt_pubid "*****" //产品ID
//鉴权信息
#define mqtt_password "*****" //鉴权信息(自己设定的不需要token)
#define Addr_SHT30 0x44 // SHT30 IIC 7位地址为0x44
#define SDA_PIN 21 //引脚接法在这里
#define SCL_PIN 22
WiFiClient espClient; //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
char msg_buf[200]; //发送信息缓冲区
char dataTemplate[] = "{"temp":%.2f,"hum":%.2f}"; //信息模板
char msgJson[75]; //要发送的json格式的数据
unsigned short json_len = 0; //json长度
Ticker tim1; //定时器,用来循环上传数据
//连接WIFI相关函数
void setupWifi()
{
delay(10);
Serial.println("连接WIFI");
WiFi.begin(ssid, password);
while (!WiFi.isConnected())
{
Serial.print(".");
delay(500);
}
Serial.println("OK");
Serial.println("Wifi连接成功");
}
//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
void callback(char *topic, byte *payload, unsigned int length)
{
Serial.println("message rev:");
Serial.println(topic);
for (size_t 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())
{
unsigned int data[6]; //存储获取到的六个数据
Wire.beginTransmission(Addr_SHT30);//开始IIC //写地址
Wire.write(0x2C); //发送测量命令 0x2C06,但是因为IIC一次只能发一个8位数据,所以得发两次
Wire.write(0x06); //停止IIC
Wire.endTransmission(); //等待500ms是等待SHT30器件测量数据,实际上这个时间可以很短
delay(500);
Wire.requestFrom(Addr_SHT30, 6); //请求获取6字节的数据,然后会存到8266的内存里
if (Wire.available() == 6) //读取6字节的数据,这六个字节分别为:温度8位高数据,温度8位低数据,温度8位CRC校验数据,湿度8位高数据,湿度8位低数据,湿度8位CRC校验数据
{
data[0] = Wire.read();
data[1] = Wire.read();
data[2] = Wire.read();
data[3] = Wire.read();
data[4] = Wire.read();
data[5] = Wire.read();
}
float temp = ((((data[0] * 256.0) + data[1]) * 175) / 65535.0) - 45; //然后计算得到的数据,要转化为摄氏度、相对湿度
float hum = ((((data[3] * 256.0) + data[4]) * 100) / 65535.0);
snprintf(msgJson, 40, dataTemplate, temp, hum); //将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson
json_len = strlen(msgJson); //msgJson的长度
msg_buf[0] = char(0x03); //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
msg_buf[1] = char(json_len >> 8); //数据第二位是要发送的数据长度的高八位
msg_buf[2] = char(json_len & 0xff); //数据第三位是要发送数据的长度的低八位
memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
msg_buf[3 + strlen(msgJson)] = 0; //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
Serial.print("public message:");
Serial.println(msgJson);
client.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
}
}
//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
while (!client.connected()) //再重连客户端
{
Serial.println("reconnect MQTT...");
if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password))
{
Serial.println("connected");
}
else
{
Serial.println("failed");
Serial.println(client.state());
Serial.println("try again in 5 sec");
delay(5000);
}
}
}
void setup()
{
pinMode(led,OUTPUT);//输出
Wire.begin(SDA_PIN, SCL_PIN); //初始化IIC(作为主设备)
Serial.begin(115200); //初始化串口
delay(3000); //这个延时是为了让我打开串口助手
setupWifi(); //调用函数连接WIFI
client.setServer(mqtt_server, 6002); //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口
client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
client.setCallback(callback); //设置好客户端收到信息是的回调
tim1.attach(1, sendTempAndHumi); //定时每1秒调用一次发送数据函数sendTempAndHumi
}
void loop()
{
if (!WiFi.isConnected()) //先看WIFI是否还在连接
{
setupWifi();
}
if (!client.connected()) //如果客户端没连接ONENET, 重新连接
{
clientReconnect();
}
client.loop(); //客户端循环检测
}
最后
以上就是花痴美女为你收集整理的ESP32-微信小程序获取OneNET温湿度数据的全部内容,希望文章能够帮你解决ESP32-微信小程序获取OneNET温湿度数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复