ESP8266使用HTTP接入Onenet(一)

本文介绍了一个使用ArduinoIDE配置ESP8266连接ONENET云平台的示例,通过HTTP协议实现数据的收发。程序中详细说明了如何修改设备相关参数和发送数据内容,并提供了如何获取和解析云平台返回数据的方法。需要注意的是,尽管数据收发正常,但云平台上显示设备离线。
摘要由CSDN通过智能技术生成

总结了网上的一些关于使用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"
}
}
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值