benclee 发表于 2018-6-18 19:56:06

求助ESP8266获取XML的问题

本帖最后由 benclee 于 2018-6-18 19:57 编辑

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

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

wing 发表于 2018-6-19 10:38:02

嗯,这的确是个问题(原文:This is exactly a question)

wing 发表于 2018-6-19 22:00:59


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

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

#include <Arduino.h>

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

#include <ESP8266HTTPClient.h>

#define USE_SERIAL Serial

ESP8266WiFiMulti WiFiMulti;

void setup() {

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

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
      USE_SERIAL.printf(" WAIT %d...\n", t);
      USE_SERIAL.flush();
      delay(1000);
    }

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

}

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

      HTTPClient http;

      USE_SERIAL.print(" begin...\n");

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

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

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

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

                // create buffer for read
                uint8_t buff = { 0 };

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

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

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

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

                        if(len > 0) {
                            len -= c;
                        }
                  }
                  delay(1);
                }

                USE_SERIAL.println();
                USE_SERIAL.print(" connection closed or file end.\n");

            }
      } else {
            USE_SERIAL.printf(" GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      }

      http.end();
    }

    delay(100000);
}

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



可惜本坛不支持直接上存文本文件,希望能对您有一点点帮助
页: [1]
查看完整版本: 求助ESP8266获取XML的问题