注:对于ESP8266开源技术感兴趣的可以加群,我们一起探索交流学习,群号:579932824。群名:ESP8266开源技术交流群。
Arduino IDE for ESP8266内置的各种通信手段,相比起功能全面但是不方便使用的Socket通信,现在赋予了更强大的功能,那就是HTTP组件,这里来说说HTTP客户端。整个教程就以上传Yeelink数据点为目的制作一个HTTP客户端。
直接上代码:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#define UKey "" // Yeelink提供的U-ApiKey
String ssid = ""; // 需要连接的wifi热点名称
String password = ""; // 需要连接的wifi热点密码
/* 上传数据到服务器。
* device为设备号,sensor为传感器号,data为上传数据点的值
* 这里默认上传到最新的数据点上,需要上传到特定点上就得在post内容中单独加入时间戳
*/
void uploadYeelinkData(String device, String sensor, String data)
{
HTTPClient http;
const String apiAddress = "/v1.1/device/" + device + "/sensor/" + sensor + "/datapoints";
http.begin("api.yeelink.net", 80, apiAddress);
http.addHeader("U-ApiKey",UKey, true);
int httpCode = http.POST("{\"value\":" + data + "}");
Serial.print("code:");
Serial.println(httpCode);
if(httpCode == 200) // 访问成功,取得返回参数
{
String payload = http.getString();
Serial.println(payload);
}
else // 访问不成功,打印原因
{
String payload = http.getString();
Serial.print("context:");
Serial.println(payload);
}
}
/* 从服务器取得数据
* device为设备号,sensor为传感器号
*/
void readYeelinkData(String device, String sensor)
{
HTTPClient http;
// 这里使用的api是v1.0的,v1.1的api需要提供U-ApiKey
const String apiAddress = "/v1.0/device/" + device + "/sensor/" + sensor + "/datapoints";
http.begin("api.yeelink.net", 80, apiAddress);
int httpCode = http.GET(); // 使用GET形式来取得数据
Serial.print("code:");
Serial.println(httpCode);
if(httpCode == 200)
{ // 访问成功,取得返回参数
String payload = http.getString();
Serial.println(payload);
}
else
{ // 访问不成功,打印原因
String payload = http.getString();
Serial.print("context:");
Serial.println(payload);
}
}
void setup()
{
Serial.begin ( 115200 );
int connectCount = 0;
WiFi.begin ( ssid.c_str(), password.c_str());
while ( WiFi.status() != WL_CONNECTED )
{
delay ( 1000 );
Serial.print ( "." );
if(connectCount > 30)
{
Serial.println( "Connect fail!" );
break;
}
connectCount += 1;
}
if(WiFi.status() == WL_CONNECTED)
{
Serial.println ( "" );
Serial.print ( "Connected to " );
Serial.println ( ssid );
Serial.print ( "IP address: " );
Serial.println ( WiFi.localIP() );
connectCount = 0;
}
//readYeelinkData("8938", "28887"); // 读取数据点测试
uploadYeelinkData("8938", "28887", "1"); // 写入数据点测试
}
void loop()
{
}
例程里边的关键点基本已经标注上了注解,作者封装了一个HttpClient类,这个类使得Http通信变得非常的简单,平时在pc上编写Http一样简单,可以简单的添加Header,post数据,不用像W5100模块那样,整个通信的报文都需要自己来编写,稍有点不对就会导致通信失败。