Skip to content

Ljzd-PRO/cores3ctl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cores3ctl

cores3ctl logo

用于通过 USB 串口连接 M5Stack CoreS3,并在主机终端中管理设备文件系统的命令行工具。

当前版本聚焦于 /flash 用户区文件管理:

  • 列出串口与验证连接
  • 浏览远端目录与树
  • 创建目录
  • 上传/下载文件
  • 删除文件和空目录
  • 将本地目录单向同步到设备
  • 打开交互式 REPL

安全默认值:首版拒绝写入 /system,并拒绝删除 //flash/system 等危险路径。

目录结构

cores3ctl/
  pyproject.toml
  README.md
  cores3ctl/
    __main__.py
    cli.py
    config.py
    errors.py
    output.py
    paths.py
    remote_fs.py
    repl_protocol.py
    serial_transport.py
    sync.py
  tests/

安装

在项目根目录下执行:

python -m pip install -e .\cores3ctl

如果没有安装 pyserial,上面的命令会一并安装。

在当前项目环境中,也可以直接安装到根目录的 uv 虚拟环境:

uv pip install --python ./.venv/bin/python -e ./cores3ctl

安装完成后,可直接使用:

./.venv/bin/cores3ctl ports
./.venv/bin/cores3ctl ping

cores3ctl 现在会自动优先选择当前系统里最像 CoreS3 的串口设备。也可以用环境变量固定端口:

export CORES3CTL_PORT=/dev/cu.usbmodem11201
./.venv/bin/cores3ctl ping

注意:同一时间只应有一个 cores3ctl 命令占用设备串口;并发访问同一串口会导致 pyserial 报错。

当前项目中的推荐用法

在本项目根目录下,推荐直接使用 uv 或根虚拟环境中的命令入口:

uv run cores3ctl ports
uv run cores3ctl ping
uv run cores3ctl info
uv run cores3ctl sync . /flash --git --progress

或者:

./.venv/bin/cores3ctl ports
./.venv/bin/cores3ctl ping
./.venv/bin/cores3ctl info
./.venv/bin/cores3ctl sync . /flash --git --progress

当前 macOS 实机环境下,设备串口示例为:

/dev/cu.usbmodem11201

基本用法

默认串口参数:

  • 端口:COM20
  • 波特率:115200

查看串口

cores3ctl ports

验证设备连接

cores3ctl --port COM20 ping
cores3ctl --port COM20 info

浏览设备文件

cores3ctl ls /flash
cores3ctl ls apps
cores3ctl tree /flash/res
cores3ctl stat /flash/main.py

相对远端路径会自动按 /flash 解析,因此 apps/demo.py 等价于 /flash/apps/demo.py

创建目录

cores3ctl mkdir /flash/apps/demo
cores3ctl mkdir -p /flash/apps/demo/subdir

上传文件

cores3ctl put .\local.py apps\local.py
cores3ctl put .\logo.png /flash/res/img/logo.png

上传采用“先写临时文件,再重命名”的方式,避免中途失败破坏目标文件。

如需在交互终端中显示传输进度:

cores3ctl --progress put .\local.py apps\local.py

进度信息写到 stderr,最终结果 JSON 仍写到 stdout,便于脚本继续解析。

如需禁止覆盖已存在文件:

cores3ctl put .\local.py apps\local.py --no-force

下载文件

cores3ctl get /flash/main.py .\downloads\main.py
cores3ctl get /flash/res/img/logo.png .\downloads\

如需显示下载进度:

cores3ctl --progress get /flash/main.py .\downloads\main.py

当前第一版下载进度会在完成时输出最终传输状态;后续可继续增强为真正的块级实时进度。

删除文件或目录

cores3ctl rm /flash/apps/demo/temp.txt
cores3ctl rmdir /flash/apps/demo/empty_dir

首版 rmdir 仅支持删除空目录,不支持递归删除。

同步目录

cores3ctl sync .\assets /flash/apps/assets --dry-run
cores3ctl sync .\assets /flash/apps/assets

sync 当前默认仍是单向上传同步

  • 本地有、远端无:上传
  • 文件大小不同:覆盖上传
  • 文件大小相同:跳过
  • 不会删除远端多余文件

默认排除:.git.venv__pycache__.pytest_cache.ruff_cache 等目录。

可额外传入:

cores3ctl sync .\assets /flash/apps/assets --exclude node_modules --exclude dist

如需显示同步中每个上传操作的进度:

cores3ctl --progress sync .\assets /flash/apps/assets

Git 感知同步

sync 也支持基于 Git commit 的代码部署,用于把当前仓库 HEAD 或指定 revision 的文件快照同步到设备,并在设备端记录当前已部署版本。

首次初始化同步必须显式给出 scope,例如只同步 main.pylib

cores3ctl sync . /flash/app --git --scope ./main.py --scope ./lib --dry-run
cores3ctl sync . /flash/app --git --scope ./main.py --scope ./lib

设备端会在目标目录下创建:

  • /flash/app/.cores3ctl-sync.json

其中记录:

  • 当前已部署的 git commit hash
  • 当前受管的 scope 范围
  • 对应的 remote_dir

查看设备端当前 Git 同步状态:

cores3ctl sync . /flash/app --git --status

从指定 revision 同步:

cores3ctl sync . /flash/app --git --rev 0123456 --scope ./main.py --scope ./lib

后续增量同步会根据设备端记录的 git_rev + scope 与本次目标 revision 做 Git 文件级 diff:

  • A:新增文件,上传
  • M:修改文件,上传
  • D:删除文件,设备端删除
  • R*:重命名文件,优先在设备端 rename,必要时 fallback 为上传新文件再删除旧文件

真正开始传输前,CLI 会先列出本次计划同步的文件变更。除此之外,Git 模式还会额外核对设备端目标文件的存在性、类型和文件大小;即使 Git diff 没有显示该文件变化,只要设备端文件缺失或大小与目标快照不一致,也会自动补传。

如需强制对当前 scope 全量重传:

cores3ctl sync . /flash/app --git --force-full

如需更新设备端记录的 scope:

cores3ctl sync . /flash/app --git --scope ./main.py --scope ./lib --update-scope

注意:Git 模式同步的是已提交内容(默认 HEAD,或 --rev 指定 revision),不会自动携带未提交工作区改动。

执行远端代码 / 交互式 REPL

cores3ctl exec "print('hello from raw repl')"
cores3ctl repl

repl 模式下,输入 Ctrl+] 后回车可退出主机侧会话。

设计说明

  • 使用 pyserial 打开 CoreS3 的 USB CDC 串口。
  • 每次执行前发送 Ctrl+C,尽量中断当前正在运行的脚本。
  • 通过 raw REPL 执行结构化脚本,并用 @@OK@@ / @@ERR@@ 标记结果。
  • 远端文件上传与下载都采用 base64 分块传输,兼容文本与二进制文件。
  • 路径保护逻辑集中在 paths.py,统一约束危险路径与 /system 写入。

测试

运行单元测试:

python -m pytest .\cores3ctl\tests

如果本机没有 pytest

python -m pip install pytest

后续可扩展项

当前还未实现,但设计上预留了空间:

  • set-main:把某个 apps/*.py 复制为 /flash/main.py
  • reset
  • 更精确的文件差异比较(哈希)
  • 更安全的递归删除
  • 下载路径的真正块级实时进度(当前第一版主要完善了上传与同步上传进度)

About

通过USB串口连接M5Stack CoreS3,并在主机终端中管理设备文件系统的命令行工具

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages