Я работаю над проектом ESP32. одна из моих целей - связаться с ESP32 с веб-сайта, используя javascript fetch или XMLHttpRequest ().
ESP32 подключен к моей локальной сети, и я использую библиотеку esp32_https_server. он использует самоподписанный сертификат, который браузер указывает как действительный (но выдает предупреждение «Соединение не защищено» из-за самоподписанного сертификата). веб-сайт имеет сертификат CA и является безопасным.
при тестировании, esp32 подключен через USB к моему компьютеру, в идеале я хотел бы, чтобы он оставался в одиночестве.
проблема, с которой я столкнулся что я не могу подключиться к esp32. я получаю ошибки с кодом состояния 499.
мои вопросы:
1) как мне успешно подключиться к серверу esp32 с безопасного веб-сайта для получения данных из esp32?
2) как мне это сделать, когда esp32 не подключен к моему p c через usb-кабель?
пожалуйста, ознакомьтесь с дополнительной информацией о настройке esp32 и ответами ниже.
вот код esp32:
ResourceNode *nodeRoot = new ResourceNode("/", "GET", [](HTTPRequest *req, HTTPResponse *res) {
ResourceParameters *params = req->getParams();
std::string action = params->getRequestParameter("action");
String aksie = action.c_str();
Serial.println("Aksie: " + aksie);
if (aksie != "upload_data" && aksie != "upload_current_temp")
{
// this should be home page displayed
// Set the response status
res->setStatusCode(200);
res->setStatusText("success");
res->println("Secure Hello World!!!");
}
else
{
// either uploads..
processParams(aksie, res);
}
});
secureServer->registerNode(nodeRoot);
и вот код, который обрабатывает запрос «upload_current_temp»:
if (action == "upload_current_temp")
{
// get random temperature
int currentTemp = random(0, 9);
String temp = String(currentTemp);
Serial.println("upload current temperature");
Serial.println("uploadCurrentTemp: " + temp);
std::string tem = temp.c_str();
// Set the response status
res->setStatusCode(200);
res->setStatusText("success current temperature");
StaticJsonDocument<200> doc;
doc["temperature"] = temp;
// Produce a minified JSON document
String output;
serializeJson(doc, output);
Serial.println("curent temp json output: " + output);
deserializeJson(doc, output);
// Set the content type of the response
res->setHeader("Content-Type", "application/json");
res->setHeader("Access-Control-Allow-Origin", "*");
res->setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
// As HTTPResponse implements the Print interface, this works fine. Just remember
// to use *, as we only have a pointer to the HTTPResponse here:
serializeJson(doc, *res);
}
, а также в setUp () у меня есть эта строка:
secureServer->setDefaultHeader("Access-Control-Allow-Origin", "*"); //replace * with actual address
при использовании:
const xhr = new XMLHttpRequest();
const url = 'https://192.168.0.102/?action=upload_current_temp';
xhr.open('GET', url);
xhr.responseType = 'text';
xhr.onload = function () {
const data = xhr.response;
console.log(data);
if (this.readyState == 4 && this.status == 200) {
var obj = JSON.parse(this.responseText);
console.log("getCurTemp(), responseText: " + JSON.stringify(this.responseText, null, 2));
currentTemperature = obj.temperature;
console.log("current temperature: " + currentTemperature);
document.getElementById('currentTemp').innerHTML = currentTemperature;
}
};
xhr.send();
я получаю следующие ошибки (в опере):
499 (запрос был запрещен антивирусом)
было заблокировано политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».
и в chrome:
заблокирован согласно политике CORS: в запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin».
с этими заголовками (опера):
URL запроса: https://192.168.0.102/?action=upload_current_temp Метод запроса: GET
Код статуса: 499 Запрос был запрещен антивирусом
Удаленный адрес: 192.168.0.102:443
Политика реферера: no-referer-when-downgrade
Cache-Control: no-store, no-cache, must-revalidate, max-age = 0
Соединение: закрыть
Длина содержимого: 52266
Тип содержимого: text / html; charset = utf-8
Истекает: понедельник, 04 дек. c 1999 21:29:02 GMT
Pragma: без кэширования
Принимать: /
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US, en; q = 0,9
Соединение: keep-alive
Хост: 192.168.0.102
Происхождение: https://istimuli.co.uk
Ссылка: https://istimuli.co.uk/?code=66b72f8e-400c-4adb-ad42-f4efec391d06
Se c -Fetch-Dest: пусто
Se c -Fetch-Mode: cors
Se c -Fetch-Site: кросс-сайт
Пользователь -Агент: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (K HTML, как Gecko) Chrome / 80.0.3987.132 Safari / 537.36 OPR / 67.0.3575.79
действие: upload_current_temp
и при использовании:
var url = "https://192.168.0.102/?action=upload_current_temp";
var request = new Request(url, {
method: 'GET',
mode: 'cors', // no-cors, *cors, same-origin
headers: {
'Content-Type': 'application/json'
}
});
fetch(request).then(function (response) {
// Convert to JSON
return response.json();
}).then(function (data) {
console.log("temp: " + JSON.stringify(data));
return data;
}).catch(function (error) {
console.log('Request failed', error)
return 000;
});
я получаю эти ошибки в опере:
499 (запрос был запрещен антивирусом)
был заблокирован политикой CORS: Ответ на предполётный запрос не проходит проверку контроля доступа: отсутствует заголовок «Access-Control-Allow-Origin» o n запрошенный ресурс. Если непрозрачный ответ удовлетворяет вашим потребностям, задайте для режима запроса значение «no-cors», чтобы получить ресурс с отключенным CORS.
и в chrome: был заблокирован политикой CORS: Ответ на предварительный запрос не выполняется. 't пройти проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок' Access-Control-Allow-Origin '. Если непрозрачный ответ удовлетворяет вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS.
, и это заголовки (опера):
1 запрос
51,3 КБ передано
51,0 КБ ресурсов
URL запроса: https://192.168.0.102/?action=upload_current_temp
Метод запроса: ОПЦИИ
Код статуса: 499 Запрос был запрещен антивирусом
Удаленный адрес: 192.168.0.102:443
Политика реферера: no-referer-when-downgrade
Cache-Control: no-store, no-cache, must-revalidate, max-age = 0
Соединение: закрыть
Content-Length: 52266
Content-Type: text / html; charset = utf-8
Истекает: понедельник, 04 дек. c 1999 21:29:02 GMT
Pragma: без кэширования
Принимать: /
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US, en; q = 0,9
Access-Control-Request-Headers : content-type
Метод контроля доступа-запроса: GET
Соединение: keep-alive
Хост: 192.168.0.102
Источник: https://istimuli.co.uk
Реферер: https://istimuli.co.uk/?code=66b72f8e-400c-4adb-ad42-f4efec391d06
Se c -Fetch-Dest: пусто
Se c -Fetch-Mode: cors
Se c -Fetch-Site: кросс-сайт
Пользователь-агент: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit /537.36 (K HTML, как у Gecko) Chrome / 80.0.3987.132 Safari / 537.36 OPR / 67.0.3575.79
action: upload_current_temp