使用 Node-Red 设置 ESP8266httpUpdate 服务器

Setting up ESP8266httpUpdate server with Node-Red

我对 Node-Red 很陌生,如有任何错误,请提前致歉。我正在尝试设置一个简单的 HTTP 服务器来更新我的 ESP8266 节点。

它的工作原理是:ESP8266 将向特定 URL 发送 HTTP 请求,并等待二进制文件夹的响应。二进制文件存储在我 Windows PC 上的本地文件夹中,其中 Node-Red 是 运行。我如何设置可以执行此操作的 Node-Red 流程?

这是我当前的设置,但它不起作用。当我通过网络浏览器请求 URL 时,它只会下载一个没有文件类型的文件夹。

这些是 ESP8266 side 的文档。文档建议使用以下代码设置 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);

任何帮助将不胜感激。谢谢。

要事第一。让我们试着了解为什么您的流程不起作用并尝试修复它。

Node-RED 库中有一个流程可以完全执行您想要实现的目标。如果您还没有尝试过,请尽快尝试。 Link: https://cookbook.nodered.org/http/serve-a-local-file

要考虑的第二点:当我们想要提供本地内容时,我们需要在 Node-RED 配置文件中设置一个 http 静态路径,名为:settings.js

您必须打开此文件,找到以 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",

选择要编辑的文件时要小心。按照专家的话来说:

"Most often, when your changes to the settings file are not taking effect, it means you have edited the wrong file. There is one delivered with the installed code, which is then copied into your user directory (typically ~/.node-red). Rickus"

最后,不要忘记将二进制文件复制到这个静态目录。

在检查了所有这些点之后,您的流程的结果很可能是二进制文件,这可以通过在 node.js 中的文件之后添加一个调试节点(配置为显示完整的 msg 对象)来检查。如果您在 msg.payload 中看到缓冲区,则表示您的流程正在为二进制文件提供服务。

编辑:搜索 Node-RED 库我发现已经有一个符合 ESP8266httpUpdate HTTP 请求的示例流程。

Link: https://flows.nodered.org/flow/888b4cd95250197eb429b2f40d188185