对于任何错误,我都表示歉意,因为我是Node-Red的新手。我正在尝试建立一个简单的HTTP服务器来更新我的ESP8266节点。
工作原理是:ESP8266将向特定的URL发送HTTP请求,并等待二进制文件夹的响应。二进制文件存储在运行Node-Red的Windows PC上的本地文件夹中。如何设置将执行此操作的Node-Red流?
这是我当前的设置,但不起作用。当我通过Web浏览器请求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);
任何帮助将不胜感激。谢谢。
答案 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中看到一个缓冲区,则意味着您的流正在提供二进制文件。
编辑:搜索Node-RED库我发现已经有一个示例示例流程,它符合ESP8266httpUpdate HTTP请求。
链接:https://flows.nodered.org/flow/888b4cd95250197eb429b2f40d188185