使用Node-Red设置ESP8266httpUpdate服务器

时间:2019-01-22 17:48:52

标签: php http server binaryfiles node-red

对于任何错误,我都表示歉意,因为我是Node-Red的新手。我正在尝试建立一个简单的HTTP服务器来更新我的ESP8266节点。

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

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

这些是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);

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

1 个答案:

答案 0 :(得分:0)

第一件事。让我们尝试了解为什么您的流程无法正常运行,并尝试对其进行修复。

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

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

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

选择要编辑的文件时要小心。根据专家的话:

“通常,当您对设置文件所做的更改未生效时,意味着您编辑了错误的文件。已安装的代码随附一个文件,然后将其复制到您的用户目录(通常为〜/)中。节点红色)。Rickus”

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

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

enter image description here

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

链接:https://flows.nodered.org/flow/888b4cd95250197eb429b2f40d188185