библиотека esp32, esp32_https_server, самозаверяющий сертификат, cors и код состояния 499 - PullRequest
0 голосов
/ 19 марта 2020

Я работаю над проектом 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...