模块: REPL
约 1015 字大约 3 分钟
2026-03-19
构建固件和导入到JS
repl是一个内置 module,构建固件时不需要在 C++ 中 use 引入。
在JS中导入 repl module:
import * as repl from 'repl'import repl简介
REPL 交互式命令行模块
REPL (Read-Eval-Print Loop) 提供交互式 JavaScript 执行环境, 支持通过串口、WebSocket、USB CDC、MQTT 等多种通道进行远程控制和调试。 REPL 还支持文件系统操作。
模块启用
但具体的 REPL 通道需要单独启用:
| 通道 | 启用方式 | 说明 |
|---|---|---|
| UART0 | 默认启用 | 默认激活,无需额外配置 |
| USB CDC | beshell.use<REPLCDC>() | 需要芯片支持 USB OTG 且 sdkconfig 中开启 |
| WebSocket | JS 侧启用 | 使用 repl.ws.connect() |
| MQTT | JS 侧启用 | 使用 repl.mqtt.start() |
uart0通道是BeShell默认的 REPL 通道,不需要做额外配置就可以工作。
主要功能
- 命令执行: 远程执行 JavaScript 代码
- 文件传输: 通过 REPL 协议上传/下载文件
- 加密通信: 支持 AES-CTR 加密保护通信内容
- 多通道支持: 串口、WebSocket、USB CDC、MQTT
示例:
import * as repl from "repl"
// 创建自定义 REPL 通道
const channel = new repl.REPLChannel()
// 启用 WebSocket REPL
const ws = repl.ws.connect("ws://192.168.1.100:8080")
// 启用 USB CDC REPL(需要 C++ 侧启用 REPLCDC)
repl.cdc.start()
// 启用 MQTT REPL
repl.mqtt.start(mqttClient, "beshell/repl/in", "beshell/repl/out")
// 设置访问密码
repl.setPassword("mysecret")
// 启用加密通信
repl.enableCrypto()
repl.setCryptoKey(keyBuffer, viBuffer)模块函数
函数 enableCrypto
原型: enableCrypto ()
启用 REPL 加密通信
启用 AES-CTR 加密模式,保护 REPL 通信内容。 启用后需要使用 setCryptoKey() 设置加密密钥。
示例:
import * as repl from "repl"
// 启用加密
repl.enableCrypto()
// 设置 16 字节密钥和初始向量
const key = new Uint8Array([0x01, 0x02, ...]) // 16 字节
const vi = new Uint8Array([0x10, 0x20, ...]) // 16 字节
repl.setCryptoKey(key.buffer, vi.buffer)返回值:
类型undefined
函数 disableCrypto
原型: disableCrypto ()
禁用 REPL 加密通信
关闭 AES-CTR 加密,恢复明文通信模式。
示例:
import * as repl from "repl"
// 禁用加密
repl.disableCrypto()返回值:
类型undefined
函数 setCryptoKey
原型: setCryptoKey (key:ArrayBuffer, vi:ArrayBuffer)
设置 REPL 加密密钥
配置 AES-CTR 加密所需的密钥和初始向量(IV)。 密钥和 IV 都必须是 16 字节(128 位)的 ArrayBuffer。
示例:
import * as repl from "repl"
// 准备 16 字节密钥和 IV
const key = new Uint8Array([
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10
])
const vi = new Uint8Array([
0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80,
0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, 0x00
])
// 设置密钥并启用加密
repl.setCryptoKey(key.buffer, vi.buffer)
repl.enableCrypto()参数:
key
类型ArrayBuffer
参数说明16 字节 AES 密钥
vi
类型ArrayBuffer
参数说明16 字节初始向量 (IV)
异常:
- 密钥长度不是 16 字节
- IV 长度不是 16 字节
返回值:
类型undefined
函数 setPassword
原型: setPassword (password:string)
设置 REPL 访问密码
设置 REPL 远程访问的密码验证。设置后,远程连接需要提供正确的密码才能执行命令。 密码验证在命令执行前进行,用于防止未授权访问。
示例:
import * as repl from "repl"
// 设置访问密码
repl.setPassword("mySecretPassword")
// 清除密码(空字符串表示无密码)
repl.setPassword("")参数:
password
类型string
参数说明访问密码,空字符串表示不启用密码验证
返回值:
类型undefined
