esp8266基本使用 - GET/POST

通过OneNet物连平台作为例子,演示使用esp8266发起GET/POST请求


准备

arduino安装esp8266库
选择相应开发板(使用的是手边仅有的wemos d1)


1.GET

用esp8266发出GET请求,获取OneNet平台的数据

/**
 * GET
*/

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "##设置能上网的wifi的名称##";      // wifi名
const char* password = "##wifi密码##";  // wifi密码

const char* host = "api.heclouds.com";  // 连接的主机域名
const int httpsPort = 443;  // https端口
String url = "";  // 请求的页面地址(后面代码中进行拼接)

String API_KEY = "##填写自己OneNet平台里的OneNet的api key##";  // onenet的 api key
String deviceId = "##OneNet里设备的ID##";    // onenet的设备ID
String dataId = "led";    // 任意设置的数据名

void connectWifi();
float getDataToOnenet();

void setup() {
  Serial.begin(115200);
}

void loop() {
  float data = getDataToOnenet();
//  Serial.println("GET data:");
//  Serial.println(data);
  delay(3000);
}

/**
 * 连接wifi
 */
void connectWifi(){
  Serial.println();
  Serial.print("connecting to ");
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA);    // 设置wifi模式
  WiFi.begin(ssid, password);   // 连接wifi
  while (WiFi.status() != WL_CONNECTED) { //判断连接状态
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

/**
 * 从onenet获取数据
 */
float getDataToOnenet(){
  // Use WiFiClientSecure class to create TLS connection
//  WiFiClient client;          // HTTP
  WiFiClientSecure client;    // HTTPS
  Serial.print("connecting to ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {   // 判断连接情况
    Serial.println("connection failed");
    return -1;
  }

  Serial.print("requesting URL: ");
  Serial.println(url);

  // 发送GET请求
  // 组拼url地址
  url = "/devices/" + deviceId + "/datastreams/" + dataId;
  // 组拼HTTPS请求的Header
  String getStr = String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: arduino\r\n" +
               "api-key:" + API_KEY + "\r\n" +
               "Connection: close\r\n\r\n";
  client.print(getStr);

  Serial.println("request sent");

  // 读取连接情况
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }

  // 读取数据
  String line = client.readStringUntil('\n');
  Serial.println("reply was:");
  Serial.println("==========");
  Serial.println(line);   // 打印接受到的数据
  Serial.println("==========");
  Serial.println("closing connection");

  // TODO:解析json字符串,获取需要的数据
  return 0;
}

最后打开板子串口查看数据


2.POST

用esp8266发出POST请求,上传数据到OneNet平台

由于为了简化显示整个操作流程,没添加其它传感器,自己在loop()函数中任意设置了一个数据上传

/**
 * POST
*/

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "##设置能上网的wifi的名称##";      // wifi名
const char* password = "##wifi密码##";  // wifi密码

const char* host = "api.heclouds.com";  // 连接的主机域名
const int httpsPort = 443;  // https端口
String url = "";  // 请求的页面地址(后面代码中进行拼接)

String API_KEY = "##填写自己OneNet平台里的OneNet的api key##";  // onenet的 api key
String deviceId = "##OneNet里设备的ID##";    // onenet的 设备ID
String dataId = "led";    // 任意设置的数据名

void connectWifi();
void postDataToOnenet(float data);

void setup() {
  Serial.begin(115200);
}

void loop() {
  float data = 314;
  postDataToOnenet(data);
  delay(3000);
}

/**
 * 连接wifi
 */
void connectWifi(){
  Serial.println();
  Serial.print("connecting to ");
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA);    // 设置wifi模式
  WiFi.begin(ssid, password);   // 连接wifi
  while (WiFi.status() != WL_CONNECTED) { //判断连接状态
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

/**
 * 上传数据到onenet
 */
void postDataToOnenet(float data){
  // Use WiFiClientSecure class to create TLS connection
//  WiFiClient client;          // HTTP
  WiFiClientSecure client;    // HTTPS
  Serial.print("connecting to ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {   // 判断连接情况
    Serial.println("connection failed");
    return;
  }

  Serial.print("requesting URL: ");
  Serial.println(url);

  // 发送POST请求
  // 组拼url地址
  url = "/devices/" + deviceId + "/datapoints";
  // 组拼HTTPS请求的Header
  String jsonStr = String("") + "{'datastreams':[{" +
            "'id':'" + dataId + "'" +
            ",'datapoints':[{" +
            "'value':" + data +
            "}]}]}";
  String getStr = String("POST ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: arduino\r\n" +
               "api-key:" + API_KEY + "\r\n" +
               "Connection: close\r\n";
  client.print(getStr);   // 发送Headers头
  client.print(String("") + "Content-Length:" + jsonStr.length() + "\r\n\r\n"); // 发送Header头-数据内容长度(注意:\r\n\r\n是结尾)
  client.print(jsonStr);  // 发送json数据

  Serial.println("request sent");

  Serial.println("==========");
  Serial.println("send was:");
  Serial.println(jsonStr);   // 打印发送的请求数据
  String line = client.readStringUntil('\n');
  Serial.println("reply was:");
  Serial.println(line);   // 打印接受到的数据
  Serial.println("==========");
}

最后,打开OneNet平台,查看上传的数据,会有折线图显示


解释

上面GET/POST请求的示例中,有些地方初学时,不知道怎么做,下面一一列出:

关于物联开放平台的的api key等参数怎么获取?
1.访问https://open.iot.10086.cn/,注册登录
2.开发者中心 -> 创建产品 -> 操作系统:无,设备接入方式:公开协议,联网方式:wifi,模组选择:安可信 ESP8266系列 ,设备接入协议:HTTP
3.参数API_KEY:产品详情里面的APIKey
4.参数deviceId:添加新设备后,即是设备ID

关于GET/POST请求的header设置?
详情查看官方文档:https://open.iot.10086.cn/doc/art493.html#108

附:
另外,还有使用库封装,简化组拼Header头 、 组拼json操作
库名为(需另外到GitHub下载):HttpPacket.h、ArduinoJson.h

猜你喜欢

转载自blog.csdn.net/ZAQ1018472917/article/details/84927548