固件升级
最近在工作中遇到嵌入式设备固件升级问题,操作文档中要求用 PuTTY 连上嵌入式设备的 Linux 系统,插入 U 盘并挂载,然后执行 U 盘根目录下的升级脚本。
PuTTY 操作如图所示,输入 ip,连接成功后,输入账号和密码,就可以操作了。
但是这样操作太麻烦了,对于技术支持的同事来说,通过 PuTTY 连接,输入多条命令,效率很低。而且还得针对不同设备选择不同的固件版本,稍微弄错就可能升级失败。
所以,能不能做一个小工具来简化操作呢?
telnet-client
在 npm 搜索到 telnet-client,可以发送命令,实现一键升级。
针对不同版本使用不同固件,原先要求升级文件都需要在根目录。由于命名冲突,一个 U 盘只能放一个版本的升级文件。
使用这个工具之后,可以识别设备版本,自动将 U 盘根目录下对应版本的文件夹复制到根目录。因此,一个 U 盘就能放针对所有版本的升级文件了。
简要代码如下:
const Telnet = require('telnet-client');
const cmdListSd = 'ls /dev/sd*'; // 列出设备,U 盘也在其中
const cmdCleanUsb = 'rm -f /mnt/usb/burn.sh /mnt/usb/mtd_debug /mnt/usb/u-boot-hi3531d.bin /mnt/usb/update.bin /mnt/usb/updateApp.zip'; // 清除根目录下的文件
async function run() {
let connection = new Telnet();
let params = {
host: '172.20.92.107',
port: 23,
login: 'admin',
password: 'pwd',
shellPrompt: '~ # ', // 这里如果写错了,可能会报 Error:Cannot connect
timeout: 30000, // 这里可以设置长一点,避免出现 response not received 的错误
};
try {
await connection.connect(params);
} catch (error) {
console.log(error);
}
// 如果命令执行时间过长报错,可以改用 send 方法
let res = await connection.exec(cmdCleanUsb);
console.log('async result:', res);
}
run();