总结了网上的一些关于使用Arduino IDE开发ESP8266接入ONENET平台的示例,将其修改总结为方便修改的程序。
至于如何在onenet新建的设备接入,网上资料很多。我这里节约时间就不写了(有需要的话,留言评论,评论多了,我直接出视频教程)
HTTP协议接入OneNet后,云平台不显示在线,但是云平台数据的收发没有问题
直接上程序
/*HTTP接入ONENET 不显示在线*/
#include <ESP8266WiFi.h>
#define WIFI_NAME "xxxx" //这里填写要连接的WIFI名 (要修改的)
#define WIFI_PASSwORD "12345678" //这里填写要连接的WIFI密码 (要修改的)
#define Device_ID "xxxxx" //【设备列表】->【设备详情】->设备ID (要修改的)
#define APIKey "************************" //【设备列表】->【设备详情】->APIKey (要修改的)
#define OneNet_IP "183.230.40.33" //这里是OneNet服务器的IP地址。
#define OneNet_PORT 80 //这里是OneNet服务器的网络端口号
WiFiClient client;
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println(WIFI_NAME);
Serial.print(":WIFI连接中。。。。。");
WiFi.begin(WIFI_NAME, WIFI_PASSwORD); //WIFI连接
while (WiFi.status() != WL_CONNECTED) //检测WiFi是否连接成功?若没有连接成功则程序一直循环
{
delay(500);
}
Serial.println("");//WiFi连接后的提示信息
Serial.println("WIFI连接成功!!");
Serial.print("WIFI IP : ");
Serial.println(WiFi.localIP());
}
void loop() {
ESP8266SendData(); //
ESP8266AcceptData();
}
void serverDetection() { //此函数用于检测服务器是否连接正常,若服务器没有正常连接则持续进行服务器连接
while (!client.connected()) { //若未连接到服务端,则客户端进行连接。
if (!client.connect(OneNet_IP, OneNet_PORT)) { //实际上这一步就在连接服务端,如果连接上,该函数返回true
Serial.println("服务器连接中。。。");
delay(500);
}
}
}
void clientSendData() { //此函数用于将数据发送到OneNote云平台
if (client.connected()) { //连接服务器成功,就请求POST发送数据
String url = "http://api.heclouds.com/devices/" + String(Device_ID) + "/datapoints?type=3"; //参数type=3表示简洁模式
client.print(String("POST ") + url + " HTTP/1.1\r\n"); //使用HTTP/1.1协议
client.print(String("api-key: ") + APIKey + "\r\n"); //注册设备的APIKey
client.print(String("Host: ") + "api.heclouds.com\r\n");
client.print("Connection: close\r\n");
/*data:数据发送内容,数据名:数据*/
String data =
"{'SoilHUM':" + String(random(1, 20))
+ ",'TEM':" + String(random(40, 60))
+ ",'hum2':" + String(random(80, 100))
+ "}";
client.print("Content-Length:" + String(data.length()) + "\r\n\r\n");
client.print(data);
delay(1000);
}
}
void getServerData() {
if (client.connected()) {
String url = "http://api.heclouds.com/devices/" + String(Device_ID) + "/datastreams?type=3"; //参数type=3表示简洁模式
client.print(String("GET ") + url + " HTTP/1.1\r\n"); //使用HTTP/1.1协议
client.print(String("api-key: ") + APIKey + "\r\n"); //注册设备的APIKey
client.print(String("Host: ") + "api.heclouds.com\r\n");
Serial.println();
Serial.println("向服务器请求数据++++++++++++++++++++++++++++++++++++++++++");
delay(1000);
}
}
void printData(String str){ //串口打印获取的数据
String data;
if (client.available()) {
while (client.available())//available()表示是否可以获取到数据
{
data += char(client.read());
delay(2);
}
Serial.println("");
Serial.println(str+"已获取到数据------------------------------------");
Serial.print(data);
}
else
{
Serial.println("");
Serial.println(str+"没有数据获取***********************************");
}
client.stop(); //关闭HTTP客户端
}
void ESP8266SendData(){
serverDetection();//此函数用于检测服务器是否连接正常,若服务器没有正常连接则持续进行服务器连接
clientSendData(); //此函数用于将数据发送到OneNote云平台
// printData("数据发送到OneNote云平台");
String data;
if (client.available()) {
while (client.available())//available()表示是否可以获取到数据
{
data += char(client.read());
delay(2);
}
Serial.println("");
Serial.println("数据发送到OneNote云平台已获取到数据");
Serial.println(data);
}
else
{
Serial.println("");
Serial.println("数据发送到OneNote云平台没有数据获取");
delay(1000);
}
client.stop(); //关闭HTTP客户端
}
void ESP8266AcceptData(){
serverDetection();//此函数用于检测服务器是否连接正常,若服务器没有正常连接则持续进行服务器连接
getServerData(); //获取云平台的数据并在串口打印输出
clientSendData(); //此函数用于将数据发送到OneNote云平台
printData("OneNote云平台数据返回");
}
要修改的有两个地方,一、开头
这个改成自己设备相关的参数
#include <ESP8266WiFi.h>
#define WIFI_NAME "xxxx" //这里填写要连接的WIFI名 (要修改的)
#define WIFI_PASSwORD "12345678" //这里填写要连接的WIFI密码 (要修改的)
#define Device_ID "xxxxx" //【设备列表】->【设备详情】->设备ID (要修改的)
#define APIKey "************************" //【设备列表】->【设备详情】->APIKey (要修改的)
二、上传的数据
在 clientSendData()函数中找到
/*data:数据发送内容,数据名:数据*/
String data =
"{'SoilHUM':" + String(random(1, 20))
+ ",'TEM':" + String(random(40, 60))
+ ",'hum2':" + String(random(80, 100))
+ "}";
修改成自己要发送的内容就可以了
比如我现在的内容在OneNet中的显示就是
串口输出情况
如果需要解析发送数据后云平台返回数据
找到 void ESP8266SendData()函数,解析data的数据就可以了
void ESP8266SendData(){
serverDetection();//此函数用于检测服务器是否连接正常,若服务器没有正常连接则持续进行服务器连接
clientSendData(); //此函数用于将数据发送到OneNote云平台
// printData("数据发送到OneNote云平台");
String data;
if (client.available()) {
while (client.available())//available()表示是否可以获取到数据
{
data += char(client.read());
delay(2);
}
Serial.println("");
Serial.println("数据发送到OneNote云平台已获取到数据");
Serial.println(data);
}
else
{
Serial.println("");
Serial.println("数据发送到OneNote云平台没有数据获取");
delay(1000);
}
client.stop(); //关闭HTTP客户端
}
如果需求解析请求云平台的信息后需要找到 void printData(String str)函数 解析data的数据就可以了
void printData(String str){ //串口打印获取的数据
String data;
if (client.available()) {
while (client.available())//available()表示是否可以获取到数据
{
data += char(client.read());
delay(2);
}
Serial.println("");
Serial.println(str+"已获取到数据------------------------------------");
Serial.print(data);
}
else
{
Serial.println("");
Serial.println(str+"没有数据获取***********************************");
}
client.stop(); //关闭HTTP客户端
}
如果只需要请求单一数据返回情况需要在void getServerData()函数中进行修改
已下方图片为例
如果只需要获取其中的【TEM】的情况,getServerData()做如下修改,在图片标红的地方改成自己想要的参数就行
void getServerData() {
if (client.connected()) {
String url = "http://api.heclouds.com/devices/" + String(Device_ID) + "/datastreams/TEM?type=3"; //参数type=3表示简洁模式
client.print(String("GET ") + url + " HTTP/1.1\r\n"); //使用HTTP/1.1协议
client.print(String("api-key: ") + APIKey + "\r\n"); //注册设备的APIKey
client.print(String("Host: ") + "api.heclouds.com\r\n");
Serial.println();
Serial.println("向服务器请求数据++++++++++++++++++++++++++++++++++++++++++");
delay(1000);
}
}
串口打印情况
返回的josn信息是
{
"errno":0,
"data":{
"update_at":"2022-06-11 10:48:15",
"id":"TEM",
"create_time":"2022-06-10 20:15:36",
"current_value":45
},
"error":"succ"
}
完整的示例程序中,是查询全部数据,所以,我们直接把上图中的【/TEMP】删除,
串口打印情况
返回的josn信息是
{
"errno":0,
"data":[
{
"create_time":"2022-06-10 20:15:36",
"update_at":"2022-06-11 10:54:33",
"id":"TEM",
"uuid":"67b6c2b7-2ef9-4423-8170-f8a6ae0abf38",
"current_value":41
},
{
"create_time":"2022-06-10 20:15:36",
"update_at":"2022-06-11 10:54:33",
"id":"SoilHUM",
"uuid":"39630d74-e55a-4b64-a182-fe3556ad2746",
"current_value":10
},
{
"create_time":"2022-06-10 20:27:28",
"update_at":"2022-06-11 10:54:33",
"id":"hum2",
"uuid":"8a407e17-d1a0-4ff6-94cf-47229683b512",
"current_value":82
}
],
"error":"succ"
}
}