极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13762|回复: 2

求助ESP8266获取XML的问题

[复制链接]
发表于 2018-6-18 19:56:06 | 显示全部楼层 |阅读模式
本帖最后由 benclee 于 2018-6-18 19:57 编辑

[kenrobot_code]#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
char ssid[] = "GTWY1";  // WiFi名 SSID (name)
char pass[] = "58025952";       // WiFi密码
const unsigned long BAUD_RATE = 115200;
String payload = "";              //获取数据储存变量
String webadd = "http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100";    //接口地址
int time1 = 0;  //WIFI等待时间(500ms)
int sta,sta2;
String com;
void setup()
{
  delay(1000);
  Serial.begin(BAUD_RATE);
   WiFi.begin(ssid, pass);//连接WIFI
}
void loop(){
http();
}
/*****************************************http数据获取*******************************************/
void http(){
   HTTPClient http;
  http.begin(webadd);
  int httpCode = http.GET();//返回的代号200为正常
        if(httpCode > 0) {
               payload = http.getString();//获取XML数据
               int a = payload.indexOf("shidu");
               com = payload.substring(a,a+12);
             Serial.println(payload);
             Serial.println(httpCode);
             Serial.println(com);
              Serial.println(a);
            }
   http.end();
}[/kenrobot_code]

为什么获取不到XML数据呢。谢谢
回复

使用道具 举报

发表于 2018-6-19 10:38:02 | 显示全部楼层
嗯,这的确是个问题(原文:This is exactly a question)
回复 支持 反对

使用道具 举报

发表于 2018-6-19 22:00:59 | 显示全部楼层

请原谅我上面的废话,您这个问题真是有去试的。
结论:请求是成功的,但是无法正确获取到返回的数据,所以显示不出来。
至于原因请您自己去发掘,您可能觉得我又在说废话了...但是以我的描述能力是无法有效率地说明这个问题的,真是十分抱歉

作为补偿,我修改了示例里的代码,
下面这套代码能够获取相对完整的信息,并且能用串口输出一些东西来...但是处理编码的,所以看上去有点乱

  1. #include <Arduino.h>

  2. #include <ESP8266WiFi.h>
  3. #include <ESP8266WiFiMulti.h>

  4. #include <ESP8266HTTPClient.h>

  5. #define USE_SERIAL Serial

  6. ESP8266WiFiMulti WiFiMulti;

  7. void setup() {

  8.     USE_SERIAL.begin(115200);
  9.     // USE_SERIAL.setDebugOutput(true);

  10.     USE_SERIAL.println();
  11.     USE_SERIAL.println();
  12.     USE_SERIAL.println();

  13.     for(uint8_t t = 4; t > 0; t--) {
  14.         USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
  15.         USE_SERIAL.flush();
  16.         delay(1000);
  17.     }

  18.     WiFi.mode(WIFI_STA);
  19.     WiFiMulti.addAP("填上您的WIFI SSID", "填上您的WIFI密码");

  20. }

  21. void loop() {
  22.     // wait for WiFi connection
  23.     if((WiFiMulti.run() == WL_CONNECTED)) {

  24.         HTTPClient http;

  25.         USE_SERIAL.print("[HTTP] begin...\n");

  26.         // configure server and url
  27.         http.begin("http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100");
  28.         //http.begin("192.168.1.12", 80, "/test.html");

  29.         USE_SERIAL.print("[HTTP] GET...\n");
  30.         // start connection and send HTTP header
  31.         int httpCode = http.GET();
  32.         if(httpCode > 0) {
  33.             // HTTP header has been send and Server response header has been handled
  34.             USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

  35.             // file found at server
  36.             if(httpCode == HTTP_CODE_OK) {

  37.                 // get lenght of document (is -1 when Server sends no Content-Length header)
  38.                 int len = http.getSize();

  39.                 // create buffer for read
  40.                 uint8_t buff[128] = { 0 };

  41.                 // get tcp stream
  42.                 WiFiClient * stream = http.getStreamPtr();

  43.                 // read all data from server
  44.                 while(http.connected() && (len > 0 || len == -1)) {
  45.                     // get available data size
  46.                     size_t size = stream->available();

  47.                     if(size) {
  48.                         // read up to 128 byte
  49.                         int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));

  50.                         // write it to Serial
  51.                         USE_SERIAL.write(buff, c);

  52.                         if(len > 0) {
  53.                             len -= c;
  54.                         }
  55.                     }
  56.                     delay(1);
  57.                 }

  58.                 USE_SERIAL.println();
  59.                 USE_SERIAL.print("[HTTP] connection closed or file end.\n");

  60.             }
  61.         } else {
  62.             USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
  63.         }

  64.         http.end();
  65.     }

  66.     delay(100000);
  67. }
复制代码


为了保证代码里不参杂奇怪的字符,这里来一份文本文件的下载



可惜本坛不支持直接上存文本文件,希望能对您有一点点帮助

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 06:35 , Processed in 0.039731 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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