通过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