查看: 907|回复: 3

[未解决] ESP8266获取网页不全...

[复制链接]
  • TA的每日心情
    奋斗
    2019-9-30 21:13
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2019-9-22 11:20 | 显示全部楼层 |阅读模式
    本帖最后由 Widayn 于 2019-9-22 16:45 编辑

    完整代码如下:

    [mw_shl_code=arduino,true]
    #include <ESP8266WiFi.h>
    #include <ArduinoJson.h>

    WiFiClient client;

    const char* ssid     = "xxxxx";         // XXXXXX -- 使用时请修改为当前你的 wifi ssid
    const char* password = "xxxxxxxx";         // XXXXXX -- 使用时请修改为当前你的 wifi 密码


    const char* host = "api.thinkpage.cn";
    const char* APIKEY = "24qbvr1mjsnukavo";        //API KEY
    const char* city = "guangzhou";
    const char* language = "en";
    const unsigned long BAUD_RATE = 115200;                   // serial connection speed
    const unsigned long HTTP_TIMEOUT = 4100;               // max respone time from server
    const size_t MAX_CONTENT_SIZE = 2048;                   // max size of the HTTP response

    // Skip HTTP headers so that we are at the beginning of the response's body
    //  -- 跳过 HTTP 头,使我们在响应正文的开头
    bool skipResponseHeaders() {
      // HTTP headers end with an empty line
      char endOfHeaders[] = "\r\n\r\n";

      client.setTimeout(HTTP_TIMEOUT);
      bool ok = client.find(endOfHeaders);

      if (!ok) {
        Serial.println("No response or invalid response!");
      }

      return ok;
    }

    // 发送请求指令
    bool sendRequest(const char* host, const char* cityid, const char* apiKey) {
      // We now create a URI for the request
      //心知天气
      String GetUrl = "/v3/weather/now.json?key=";
      GetUrl += apiKey;
      GetUrl += "&location=";
      GetUrl += city;
      GetUrl += "&language=";
      GetUrl += language;

      // This will send the request to the server
      client.print(String("GET ") + GetUrl + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" +
                   "Connection: close\r\n\r\n");
      return true;
    }
    void readReponseContent(char* content, size_t maxSize) {
      size_t length = client.peekBytes(content, maxSize);
      delay(100);
      Serial.println("Get the data from Internet!");
      content[length] = 0;
      Serial.println("Read Over!");
    Serial.println(content);
    const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 1024;
    DynamicJsonDocument doc(capacity);
    deserializeJson(doc, content);
    JsonObject results_0 = doc["results"][0];
    JsonObject results_0_location = results_0["location"];
    const char* results_0_location_id = results_0_location["id"]; // "WS0E9D8WN298"
    const char* results_0_location_name = results_0_location["name"]; // "Guangzhou"
    const char* results_0_location_country = results_0_location["country"]; // "CN"
    const char* results_0_location_path = results_0_location["path"]; // "Guangzhou,Guangzhou,Guangdong,China"
    const char* results_0_location_timezone = results_0_location["timezone"]; // "Asia/Shanghai"
    const char* results_0_location_timezone_offset = results_0_location["timezone_offset"]; // "+08:00"
    JsonObject results_0_now = results_0["now"];
    const char* results_0_now_text = results_0_now["text"]; // "Clear"
    const char* results_0_now_code = results_0_now["code"]; // "1"
    const char* results_0_now_temperature = results_0_now["temperature"]; // "23"
    const char* results_0_last_update = results_0["last_update"]; // "2019-09-21T21:25:00+08:00"
    Serial.println();
    Serial.println(results_0_location_name);
    Serial.println();
    Serial.println(results_0_location_timezone_offset);
    }


    // Close the connection with the HTTP server -- 关闭与HTTP服务器连接
    void stopConnect() {
      Serial.println("Disconnect");
      client.stop();
    }

    void setup(){
      WiFi.mode(WIFI_STA);     //设置esp8266 工作模式

      Serial.begin(BAUD_RATE );      //设置波特率
      Serial.println();
      Serial.print("connecting to ");
      Serial.println(ssid);

      WiFi.begin(ssid, password);   //连接wifi
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi connected");
      delay(500);
      // Check if a client has connected
      if (!client.connect(host, 80)) {
        Serial.println("connection failed");
        return;
      }

      if (sendRequest(host, city, APIKEY) && skipResponseHeaders()) {
        char response[MAX_CONTENT_SIZE];
        readReponseContent(response, sizeof(response));
      }
      stopConnect();
    }
    void loop(){
      delay(3000);
    }[/mw_shl_code]

    输出如下:

    [mw_shl_code=arduino,true]connecting to Home-360WIFI
    ...........
    WiFi connected
    Get the data from Internet!
    Read Over!
    {"results":[{"location":{"id":"WS0E9D8WN298","name":"Guangzhou","country":"CN","path":"Guangzhou,Guangzhou,Guangdong,China","timezone":"Asia

    Guangzhou


    Disconnect
    [/mw_shl_code]

    接受数据的content变量似乎只保存了前半截...然后后面的那一半json也解析不来,直接打印content也没有显示出了...

  • TA的每日心情
    奋斗
    2019-9-30 21:13
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2019-9-22 11:28 | 显示全部楼层
    json解析部分的代码应该没问题...
    我把json数据直接复制下来赋值给content是可以解析的...
  • TA的每日心情
    开心
    2020-7-1 09:10
  • 签到天数: 817 天

    [LV.10]以坛为家III

    发表于 2019-9-25 08:51 | 显示全部楼层
    peekBytes 改成 readBytes 试试
  • TA的每日心情
    奋斗
    2019-9-30 21:13
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2019-9-27 16:28 | 显示全部楼层
    单片机菜鸟 发表于 2019-9-25 08:51
    peekBytes 改成 readBytes 试试

    哇可以了,多谢博哥!!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    2.4寸触屏T12焊台 Arduino开源自制
    2.4寸触屏T12焊台 Arduino
    基本功能已经完善 1.触摸调节温度、2.虚拟键盘、3.调节pid参数、4.烙铁的休眠设置、5.
    【吐槽】给 M5Stack 新产品 Unit-Hall 的几点意见
    【吐槽】给 M5Stack 新产
    今年早些时候测评过 M5Stack 的 Color Unit,对这个产品的精细设计很是满意。 偶然间
    支持 原生USB 的ESP32 :ESP32 S2
    支持 原生USB 的ESP32 :E
    当我们谈论 ESP32 支持USB时,谈论的并不是最常见的ESP32而是乐鑫信息科技(上海)股份
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表