博客迁移
1 问题 在Node Red开发过程中会有自定义节点的开发,
相关开发的规范可见官方文档
https://nodered.org/docs/creating-nodes/在完成节点开发后,代码目录大体如下
为了将节点安装到Linux设备中,通常通过FTP TFTP SFTP
等协议将升级包放入到设备中,在设备中执行命令行。这种方式对于开发人员来讲没有什么难度,但对运维人员操作较困难,因此需要找到一种对运维人员友好的方式进行设备升级,这是这篇文档要解决的。2 解决思路 设备中装有NodeRed,可利用NodeRed
的Http节点建立服务器,客户端(Windows)将文件上传到设备中,设备接收完文件后,利用Function、exec节点调用sh脚本,实现设备节点升级
3 实施 ## 3.1 window 端 ### 3.1.1 使用NodeJs编写Http上传文件程序 核心代码如下:
引用自
https://www.cnblogs.com/motadou/p/3790018.htmlvar boundary = "NODEJSPOSTFILE-" + (Math.random() * 9017189554344922).toString(36); var sHeader = "--" + boundary + "\r\n"; sHeader += "Content-Disposition: form-data; name=\"fileName\"; filename=\"" + sFileName + "\"\r\n"; sHeader += "Content-Type: application/octet-stream\r\n\r\n"; var sEndData = "\r\n--" + boundary + "--\r\n\r\n"; var options = { hostname: hostIP, port: 1880, path: '/files', method: 'POST', headers: { } }; var httpreq = http.request(options, function (httpres) { httpres.on('data', function (dataResponse) { if (dataResponse == "okay") { console.log("上传成功: " + dataResponse + ",请等待系统重启,重新加载节点"); } else { console.log("上传失败: " + dataResponse); } process.stdin.resume(); }); }); httpreq.setHeader('Content-Type', 'multipart/form-data; boundary=' + boundary + ''); httpreq.setHeader('Content-Length', Buffer.byteLength(sHeader) + data.length + Buffer.byteLength(sEndData)); httpreq.on('error', function (e) { console.log('错误problem with request: ' + e.message); callback(e); return; }); httpreq.write(sHeader); httpreq.write(data); httpreq.write(sEndData); httpreq.end(); } ```在完成程序后,调用Js即可完成文件上传。 ### 3.1.2 js打包成应用程序exe 但没有安装Node环境时,无法使用,对此,在网上找到了Js打包程序,分别测试了 《Bat To Exe Converter》(Win10报毒)、PKG(最终使用)、NEXE(报nexe vcbuild.bat nosign release x64 exited with code错误,Node版本不支持)等等,最后选择了PKG 1. PKG 安装(网上有大量文档) > https://github.com/vercel/pkg 2. PKG 环境下载 在PKG打包过程中,需要下载fetched-v10.17.0-win-x64等文件,目录位置在C:\Users\XXXX\.pkg-cache\v2.6,如果通过应用程序自身下载,则会因网络位置断掉,此时使用手动方式安装,[https://github.com/vercel/pkg-fetch/releases](https://github.com/vercel/pkg-fetch/releases),找到对应的uploaded-v2.6-node-v10.17.0-win-x64,下载到C:\Users\XXXX\.pkg-cache\v2.6目录中,修改名称则可使用 3. 打包 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200623111443917.png) 4. 最终可执行程序 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200623111515416.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x4bXV5dQ==,size_16,color_FFFFFF,t_70) 在得到打包程序后,Windows端工作基本结束。 ## 3.2 设备端 设备端工作较为轻松,以配置NodeRed为主 ### 3.2.1 Window向linux设备上传升级包(Http) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200623112008955.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x4bXV5dQ==,size_16,color_FFFFFF,t_70) 1. 编辑Http in节点 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200623112119684.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x4bXV5dQ==,size_16,color_FFFFFF,t_70) 2. 编辑Function函数,这里有一个小坑,在Function中无法使用require,需要在setting.js中配置,并使用global.get方法![在这里插入图片描述](https://img-blog.csdnimg.cn/2020062311230781.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x4bXV5dQ==,size_16,color_FFFFFF,t_70)![在这里插入图片描述](https://img-blog.csdnimg.cn/20200623112143604.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x4bXV5dQ==,size_16,color_FFFFFF,t_70) 3. 编辑exec节点, 在这里,调用了一个脚本,脚本功能是通过 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020062311241630.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x4bXV5dQ==,size_16,color_FFFFFF,t_70) ### 3.2.2 设备使用脚本对设备进行升级 installpackage.sh脚本比较简单如下所示。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200623112631711.png) 这样,完成了windows中开发的节点在linux设备中的安装