如何解决ESP8266 随机切割响应
我希望我的 NodeMCU V3 从 OpenWeatherMapApi 获取天气数据。我找到了一些示例代码如何发送 GET 请求,但响应被随机切断。阅读响应后,我打印接收到的 JSON 响应的长度。响应应该有大约 16k 个字符,但每个请求都是随机的。有时应该是 16k,有时是 11k,有时是 13k 等等。这是我的代码:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
WiFiClient client;
const char *url = "/data/2.5/onecall?lat=51.039117&lon=21.072800&appid=xxx&lang=pl&units=metric&exclude=minutely";
const char *host = "api.openweathermap.org";
int fetchWeatherJson(struct weatherDataPacketStruct *wdps) {
if (!isConnected())
return -1;
Serial.println("Fetching weather");
if (!client.connect(host,80)) {
Serial.println("Connection failed");
return -1;
}
client.setTimeout(15000);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
Serial.println("headers received");
break;
}
}
Serial.println("reply was:");
Serial.println("==========");
String line;
while (client.available()) {
line = client.readStringUntil('\n'); //Read Line by Line
// Serial.println(line); //Print response
}
Serial.println(line.length());
parseWeatherJson(line.c_str(),wdps);
return 1;
}
有什么问题吗?谢谢。
解决方法
我在这里找到了一些解决方案:ESP8266 - Response from server gets cut
使用 read() 而不是 readString() 并放置 delay(1) 起初似乎有效,但是当我将读取的字符保存到一个数组而不是打印它,响应再次被切断。然而,当我删除延迟(1)时,一切都开始工作,不知道为什么。这是最终代码:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
WiFiClient client;
const char *url = "/data/2.5/onecall?lat=51.039117&lon=21.072800&appid=xxx&lang=pl&units=metric&exclude=minutely";
const char *host = "api.openweathermap.org";
char responseBuff[18000];
int fetchWeatherJson(struct weatherDataPacketStruct *wdps) {
client.flush();
if (!isConnected())
return -1;
Serial.println("FETCHING weather");
if (!client.connect(weatherHost,80)) {
Serial.println("connection failed");
return -1;
}
client.setTimeout(15000);
client.print(String("GET ") + weatherUrl + " HTTP/1.1\r\n" +
"Host: " + weatherHost + "\r\n" +
"Connection: close\r\n\r\n");
while (client.connected()) {
String line = client.readStringUntil('\n');
Serial.println(line);
if (line == "\r") {
Serial.println("headers received");
break;
}
}
long int time = millis();
long int wait = 1000 * 10;
int counter = 0;
while ((time + wait) > millis()) {
while (client.available()) {
char c = client.read();
responseBuff[counter] = c;
counter++;
Serial.print(c);
if (c == '\0')
continue;
}
}
Serial.println(counter);
return parseWeatherJson(responseBuff,wdps);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。