极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27531|回复: 8

Arduino IDE for ESP8266教程(三)HTTP客户端

[复制链接]
发表于 2017-5-11 10:13:36 | 显示全部楼层 |阅读模式
转自我的博客:http://www.windworkshop.cn/?p=1217

Arduino IDE for ESP8266内置的各种通信手段,相比起功能全面但是不方便使用的Socket通信,作者赋予了更强大的功能,那就是HTTP组件,第一篇文章里边说了简单HTTP服务端,这里来说说HTTP客户端。整个教程就以上传Yeelink数据点为目的制作一个HTTP客户端。

[kenrobot_code]#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() {
  
}[/kenrobot_code]

例程里边的关键点基本已经标注上了注视,作者封装了一个HttpClient类,这个类使得Http通信变得非常的简单,平时在pc上编写Http一样简单,可以简单的添加Header,post数据,不用像W5100模块那样,整个通信的报文都需要自己来编写,稍有点不对就会导致通信失败。
回复

使用道具 举报

发表于 2017-5-11 15:00:23 | 显示全部楼层
谢谢分享,最近正好入手了一块esp8266
回复 支持 反对

使用道具 举报

发表于 2017-5-11 21:04:54 | 显示全部楼层
我有块和这种差不多的板子,通电后空闲一段时间后就会串口就会不起作用,要按一下重启键才能用,这是怎么回事呢?
回复 支持 反对

使用道具 举报

发表于 2017-5-12 08:26:56 | 显示全部楼层
我的esp8266一直连不上服务器,惆怅的很!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-12 09:50:25 | 显示全部楼层
nuissq 发表于 2017-5-11 21:04
我有块和这种差不多的板子,通电后空闲一段时间后就会串口就会不起作用,要按一下重启键才能用,这是怎么回 ...

这个要先检查看看程序是否在运行,是不是被什么操作给卡住了,8266本身是单线程的,在连接wifi或者响应请求的时候串口是不工作的,检查过了就得考虑是不是供电不足
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-12 09:56:52 | 显示全部楼层
1529835644 发表于 2017-5-12 08:26
我的esp8266一直连不上服务器,惆怅的很!!!

这个要看是连什么了,可以先试试直接访问国内能访问得了的站点,有问题的话可以考虑换一片或者升级一下esp的版本,连不上的话就考虑一下是不是被墙了或者说参数不正确被服务器拒绝访问了,还有8266似乎不支持https的链接
回复 支持 反对

使用道具 举报

发表于 2017-5-12 21:43:55 | 显示全部楼层
耗电大是硬伤,普通电池供带不动。
回复 支持 反对

使用道具 举报

发表于 2017-12-19 23:01:26 | 显示全部楼层
是不是不支持wpa2的加密形式啊
我总是登不上去
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-20 16:08:52 | 显示全部楼层
mak4000 发表于 2017-12-19 23:01
是不是不支持wpa2的加密形式啊
我总是登不上去

这个倒是没试过,我手机连上去都是使用默认参数
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 12:55 , Processed in 0.044242 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表