打开oneNET MQTT物联网套件,找到应用管理,点击立即前往,如下图所示。
常规图表中选择一个仪表盘,如下图所示。
function last(arr) {
var len = arr ? arr.length : 0;
if (len) return arr[len - 1];
}
return [{
value: last(data).value,
name: '温度'
}]
上面是仪表盘的使用,现在配置折线图,找到折线图,如下图所示。
rootData.temp_F10c.forEach((item, index) => {
// console.log('元素:', item, ';下标:', index);
item.x = item.at;
item.y = item.value;
item.y1 = rootData.humi_sSv7[index].value;
});
return rootData.temp_F10c
网页上显示仪表盘,折线图以及按钮,如下图所示。
ESP32程序如下:
const char *ssid = "*******"; //wifi名
const char *password = "********"; //wifi密码
const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址
const int port = 1883; //端口号
const int led =2; //灯的接口
//鉴权信息
WiFiClient espClient; //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
char msgJson[75]; //发送信息缓冲区
//信息模板
char dataTemplate[] = "{\"id\":123,\"dp\":{\"cTemp\":[{\"v\":%.2f}],\"humidity\":[{\"v\":%.2f}]}}";
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 cTemp = ((((data[0] * 256.0) + data[1]) * 175) / 65535.0) - 45; //然后计算得到的数据,要转化为摄氏度、相对湿度
float humidity = ((((data[3] * 256.0) + data[4]) * 100) / 65535.0);
snprintf(msgJson, 75, dataTemplate, cTemp, humidity); //将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson
Serial.print("public the data:");
Serial.println(msgJson);
client.publish("$sys/503228/ESP32_01/dp/post/json", (uint8_t *)msgJson, strlen(msgJson)); //发送数据到主题
}
}
//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
while (!client.connected()) //再重连客户端
{
Serial.println("reconnect MQTT...");
if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password))
{
Serial.println("connected");
client.subscribe("$sys/503228/ESP32_01/cmd/request/#"); //订阅命令下发主题
}
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, port); //设置客户端连接的服务器,连接Onenet服务器, 使用1883端口
client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
if (client.connected())
{
Serial.println("OneNet is connected!"); //判断以下是不是连好了.
}
client.setCallback(callback); //设置好客户端收到信息是的回调
client.subscribe("$sys/503228/ESP32_01/cmd/request/#"); //订阅命令下发主题
tim1.attach(2, sendTempAndHumi); //定时每2秒调用一次发送数据函数sendTempAndHumi
}
void loop()
{
if (!WiFi.isConnected()) //先看WIFI是否还在连接
{
setupWifi();
}
if (!client.connected()) //如果客户端没连接ONENET, 重新连接
{
clientReconnect();
delay(100);
}
client.loop(); //客户端循环检测
}