查看: 235|回复: 3

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

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

    [LV.2]偶尔看看I

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

    完整代码如下:

    kittenblock中小学创客名师推荐的图形化编程软件

    
    #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);
    }


    输出如下:

    kittenblock中小学创客名师推荐的图形化编程软件

    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
    


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

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

    [LV.2]偶尔看看I

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

    [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 试试

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

    本版积分规则

    热门推荐

    【人脸识别】ESP-EYE 最新的板子到货了
    【人脸识别】ESP-EYE 最新
    1.我不会编程,最多抄几个一步一步的网络教程。 2.不知道为啥就是超级喜欢电子元件。
    2.4“TFT 触摸屏ILI9341,输入示例程序后能显示画面但是无法...
    2.4“TFT 触摸屏ILI9341,
    各位大神,小弟淘了一块2.4“触摸屏,驱动是ILI9341,集成电路板。 上传示例code
    使用arduino uno用蓝牙碰到温湿度问题
    使用arduino uno用蓝牙碰
    [*]硬件: [Arduino UNO] [*]接入方式: [*]blinker库版本: [最新刚下的] [*]开发环境
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    这次做了个8*8的RGB点阵
    这次做了个8*8的RGB点阵
    初次使用贴片,5050RGB用了64个,从设计到布线一次成功,编写了测试程序小灯都没问题
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表