Я пытаюсь выполнить запрос GET из PHP-скрипта на Wifiserver esp8266, чтобы включить или выключить светодиод и вернуть JSON-объект, например так:{led:'off'}
из {led:'on'}
в зависимости от состояния светодиода.
URL выглядит примерно так:http://[IP-NUMBER]/LED=ON&access_token=x
Когда я делаю запрос к URL через браузер, все работает нормально, за исключением того, что индикатор загрузки браузера показывает бесконечное состояние загрузки. (Я возвращаю JSON-объект обратно, и светодиод de включается или выключается).
Так же, когда я пытаюсь позвонить $result = file_get_contents($url);
в сценарии PHP, file_get_contents
возвращает ошибку тайм-аута соединения через некоторое время. То же самое происходит при выполнении запроса get для PHP curl.
Таким образом, проблема в том, что каждый запрос GET к esp8266 никогда не заканчивается и поэтому загружается бесконечно.
Кто-нибудь знает, почему запрос GET к веб-серверу esp8266 разрешается в тайм-аут?
Это код на esp8266:
#include <ESP8266WiFi.h>
const char* ssid = "xx";
const char* password = "xx";
WiFiServer server(80);
void setup() {
Serial.begin(9600);
delay(10);WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
server.begin();
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
// Wait until the client sends some data
while(!client.available()){
delay(1);
}
// Read the first line of the request
String request = client.readStringUntil('\r');
client.flush();
// Match the request
if (request.indexOf("&access_token=x") != -1) {int value = LOW;
if (request.indexOf("/LED=ON") != -1) {
value = HIGH;
Serial.print('1');
}
if (request.indexOf("/LED=OFF") != -1){
value = LOW;
Serial.print('0');
}
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println(""); //closing header
client.print("{led:'");
if(value == HIGH) {
client.print("on");
} else {
client.print("off");
}
client.println("'}");
} else {
client.println("HTTP/1.0 403 Forbidden");
client.println("Content-Type: text/html");
client.println(""); //closing header
client.println("No Access");
}
client.stop();
delay(1);
}
постскриптум esp8266 отправляет 1
или 0
через последовательный порт к Arduino, который управляет включением или выключением светодиода.
—- редактировать —-
Я добавил Content-Length
атрибут заголовка, который остановил состояние бесконечной загрузки при нацеливании на URL через веб-браузер, но file_get_contents($url);
запрос или PHP-запрос curl до сих пор разрешается за время ожидания.
—- edit2 —-
Я заменил запрос PHP curl на Javascript AJAX-запрос и установил разрешенный заголовок CORS на веб-сервере esp8266, который, кажется, работает довольно хорошо!
Но все еще не знаю, почему запросы PHP приводят к тайм-ауту, поэтому проблема решена, но вопрос остается без ответа.
Задача ещё не решена.
Других решений пока нет …