Настройка сервера ESP8266httpUpdate с Node-Red - PullRequest
0 голосов
/ 22 января 2019

Заранее извиняюсь за любые ошибки, так как я очень новичок в Node-Red.Я пытаюсь настроить простой HTTP-сервер для обновления моего узла ESP8266.

Как это работает: ESP8266 будет отправлять HTTP-запрос на определенный URL-адрес и ожидать ответа от двоичной папки.Бинарный файл хранится в папке локально на моем ПК с Windows, где работает Node-Red.Как я могу настроить поток Node-Red, который будет делать это?

Это мои текущие настройки, но они не работают.Когда я запрашиваю URL через веб-браузер, он просто загружает папку без типа файла.Current Flow Setup

Это документация для ESP8266 сторона .В документации рекомендуется настроить сервер PHP со следующим кодом.Однако этот код немного сложнее, что помогает проверить версию перед обновлением нужным двоичным файлом, который я планирую реализовать позже в Node-Red.

header('Content-type: text/plain; charset=utf8', true);    
function check_header($name, $value = false) {
    if(!isset($_SERVER[$name])) {
        return false;
    }
    if($value && $_SERVER[$name] != $value) {
        return false;
    }
    return true;
}

function sendFile($path) {
    header($_SERVER["SERVER_PROTOCOL"].' 200 OK', true, 200);
    header('Content-Type: application/octet-stream', true);
    header('Content-Disposition: attachment; filename='.basename($path));
    header('Content-Length: '.filesize($path), true);
    header('x-MD5: '.md5_file($path), true);
    readfile($path);
}

if(!check_header('HTTP_USER_AGENT', 'ESP8266-http-Update')) {
    header($_SERVER["SERVER_PROTOCOL"].' 403 Forbidden', true, 403);
    echo "only for ESP8266 updater!\n";
    exit();
}

if(
    !check_header('HTTP_X_ESP8266_STA_MAC') ||
    !check_header('HTTP_X_ESP8266_AP_MAC') ||
    !check_header('HTTP_X_ESP8266_FREE_SPACE') ||
    !check_header('HTTP_X_ESP8266_SKETCH_SIZE') ||
    !check_header('HTTP_X_ESP8266_CHIP_SIZE') ||
    !check_header('HTTP_X_ESP8266_SDK_VERSION') ||
    !check_header('HTTP_X_ESP8266_VERSION')
) {
    header($_SERVER["SERVER_PROTOCOL"].' 403 Forbidden', true, 403);
    echo "only for ESP8266 updater! (header)\n";
    exit();
}

$db = array(
    "18:FE:AA:AA:AA:AA" => "DOOR-7-g14f53a19",
    "18:FE:AA:AA:AA:BB" => "TEMP-1.0.0"
);

if(isset($db[$_SERVER['HTTP_X_ESP8266_STA_MAC']])) {
    if($db[$_SERVER['HTTP_X_ESP8266_STA_MAC']] != 
    $_SERVER['HTTP_X_ESP8266_VERSION']) ) {
        sendFile("./bin/".$db[$_SERVER['HTTP_X_ESP8266_STA_MAC']]."bin");
    } else {
        header($_SERVER["SERVER_PROTOCOL"].' 304 Not Modified', true, 304);
    }
    exit();
}

header($_SERVER["SERVER_PROTOCOL"].' 500 no version for ESP MAC', true, 
500);

Любая помощь будет высоко оценена.Спасибо.

1 Ответ

0 голосов
/ 23 января 2019

обо всем по порядку.Давайте попробуем понять, почему ваш поток не работает, и попробуем исправить его.

В библиотеке Node-RED есть поток, который выполняет именно то, что вы хотите достичь.Если вы еще не пробовали, пожалуйста, сделайте это как можно скорее.Ссылка: https://cookbook.nodered.org/http/serve-a-local-file

Второй момент для рассмотрения: когда мы хотим обслуживать локальный контент, нам нужно настроить статический путь http в файле конфигурации Node-RED с именем: settings.js

Youоткройте этот файл, найдите строку, начинающуюся с httpStatic:, измените ее в соответствии со своими настройками и оставьте ее без комментария.Вот как выглядит моя установка (не просто скопируйте и вставьте, вам нужно настроить каталог здесь).

// following property can be used to identify a directory of static content
// that should be served at http://localhost:1880/.
//httpStatic: '/home/nol/node-red-static/',
httpStatic: "C://Users/OCM/.node-red/static",

Будьте внимательны при выборе файла для редактирования.По словам экспертов:

"Чаще всего, когда ваши изменения в файле настроек не вступают в силу, это означает, что вы отредактировали неправильный файл. Один поставляется с установленным кодом, которыйзатем скопируйте его в свой каталог пользователя (обычно ~ / .node-red). Rickus "

Наконец, не забудьте скопировать бинарный файл в этот статический каталог.

После проверки всех этихуказывает, что вполне вероятно, что результатом вашего потока будет двоичный файл, и это можно проверить, добавив узел отладки (сконфигурированный для отображения полного объекта msg) сразу после файла в узле.Если вы видите буфер в msg.payload, это означает, что ваш поток обслуживает двоичный файл.

enter image description here

РЕДАКТИРОВАТЬ: Поиск в библиотеке Node-RED Iобратите внимание, что пример потока уже соответствует HTTP-запросам ESP8266httpUpdate.

Ссылка: https://flows.nodered.org/flow/888b4cd95250197eb429b2f40d188185

...