一键升级,使用 telnet-client 解决嵌入式设备固件升级问题

726 阅读2分钟

固件升级

最近在工作中遇到嵌入式设备固件升级问题,操作文档中要求用 PuTTY 连上嵌入式设备的 Linux 系统,插入 U 盘并挂载,然后执行 U 盘根目录下的升级脚本。

PuTTY 操作如图所示,输入 ip,连接成功后,输入账号和密码,就可以操作了。

PuTTY

telnet登录

但是这样操作太麻烦了,对于技术支持的同事来说,通过 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();