远程开发环境升级:GitHub SSH 推送落地 + SMB 方案验证 + ESP32 串口优化

源代码管理 / 远程仓库(本次核心):
- 新增 GitHub 私有仓库 Leo-z8/OrangePi_CM5_Project(镜像 Android 13 SDK 关键路径)
- 本地 Git 仓库首次推送成功,远端 commit: c79995a30
- 白名单 .gitignore 追加通配符:device/rockchip/*/*/preinstall/*.apk
- 2 个 120MB camera360.apk 从 Git 历史排除(超 GitHub 100MB 限制,需另存备份)
- 认证方式切换为 SSH ed25519(ssh.github.com:443),永久免密,不依赖 Clash
- PAT 一次性推送后已撤销,凭证文件已清理

文档更新(Tailscale + SSH 远程开发操作指南 → v3.1):
- 4.5 新增 macOS SMB 挂载方案,并完整对比 Remote-SSH 在驱动开发场景下的差异
- 8.7 改写 GitHub 推送章节,SSH 为主推荐方案,HTTPS+PAT 降为应急备选
- 8.10 新增首次推送踩坑实录:100MB 单文件限制、git rev-list 去重陷阱、rwnd 瓶颈
- 8.11 新增实测数据:.git 774MB / 96,600 文件 / SSH 4-6 MiB/s 稳定无抖动
- 8.9 备份策略明确列出需另存的大文件清单

ESP32 HOLOMAIN 代码(02_HOLOMAIN_香橙派CM5开发板代码.ino):
- processCommand 响应统一走 Serial(USB CDC),不再回写 SerialLinux(UART0)
- 修复 Android 高频灯光命令占满 UART0 TX 导致 SORC_xxx/SO_BTx 刷卡数据延迟/丢失的问题

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Rdzleo 2026-04-22 18:14:10 +08:00
parent 713cbd1835
commit d6a1e28975
2 changed files with 474 additions and 8 deletions

View File

@ -400,8 +400,12 @@ void TaskBTN2code(void* pvParameters) {
} }
// 处理单条完整命令 // 处理单条完整命令
// 参数 resp 指向发送方串口命令响应会回到发送方Windows 发命令 Windows 收响应Android 同理) // 响应统一发到 Serial (USB CDC / Windows 调试口),不回发给 SerialLinux (Android)
void processCommand(const String& command, Stream& resp) { // 原因Android 高频发灯光命令(音乐律动)时,若每条命令都回响应到 UART0 TX
// 会堵塞业务数据 SORC_xxx / SO_BTx 的发送,导致刷卡后 Android 收到延迟甚至丢失
// 参数 src 仅用于保留调用兼容性,响应不再写入 src
void processCommand(const String& command, Stream& /*src*/) {
Stream& resp = Serial; // 所有命令响应只发 Windows 调试口
if (command.startsWith("MO_LED_")) { if (command.startsWith("MO_LED_")) {
String modeStr = command.substring(7); String modeStr = command.substring(7);
int newMode = modeStr.toInt(); int newMode = modeStr.toInt();

View File

@ -925,12 +925,53 @@ Host linux-vm
之后直接 `ssh linux-vm` 即可连接。 之后直接 `ssh linux-vm` 即可连接。
## 4.4 VS Code Remote-SSH ## 4.4 VS Code Remote-SSH(推荐用于驱动开发)
1. VS Code 安装 Remote - SSH 扩展 1. VS Code 安装 Remote - SSH 扩展
2. Cmd+Shift+P → "Remote-SSH: Connect to Host" 2. Cmd+Shift+P → "Remote-SSH: Connect to Host"
3. 选择 linux-vm 3. 选择 linux-vm
4. 连接成功后打开文件夹 `/home/zhangwenqi/Radxa_CM5` 4. 连接成功后打开文件夹 `/home/zhangwenqi/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13`
Remote-SSH 模式下 VS Code 的后端vscode-server、扩展、终端都跑在虚拟机上Mac 只负责 UI。
编译、git、文件索引全都是虚拟机本地操作性能和稳定性最佳。
## 4.5 SMB 挂载(轻量文件浏览/编辑,不适合驱动开发)
macOS 原生支持 SMB通过 Tailscale 直接挂载虚拟机 Samba 共享目录:
**挂载方式**
1. Finder → `⌘+K`(连接到服务器)
2. 输入:`smb://100.123.82.91`
3. 输入虚拟机用户名/密码
4. 选择要挂载的共享目录,挂载点位于 `/Volumes/<share_name>`
挂载成功后 VS Code 可直接打开挂载目录,像本地文件一样编辑。
### 适用场景(轻量用途)
| 用途 | 可行性 |
|------|--------|
| 临时查看/编辑几个配置文件 | ✅ |
| 快速预览源码结构 | ✅ |
| Finder 里拖文件到 Mac 备份 | ✅ |
| 打开整个 84GB SDK 做索引开发 | ⚠️ 首次索引慢 |
| 跑编译 / 烧录 / git 大仓库操作 | ❌ 必须 SSH 到虚拟机 |
| 让 Claude Code 自动编译调试 | ❌ Mac shell 无 Linux 工具链 |
### SMB 方案关键局限
1. **文件访问 ≠ 执行环境**SMB 只能让 Mac 看到文件,无法在 Mac 上跑 Android 编译(缺 Rockchip 工具链、Docker、特定 Python/libncurses5 等依赖)
2. **符号链接支持有限**Android SDK 含大量符号链接SMB 可能表现异常
3. **Git 操作不稳定**:文件锁语义差异,`git status` 在 SMB 挂载目录上不可靠
4. **文件系统大小写**macOS 默认大小写不敏感 + Linux 大小写敏感,可能冲突
5. **`.DS_Store` 污染**Mac Finder 会在挂载目录留下元数据文件,进 git 会碍事
### 结论:两种方案如何选择
- **驱动开发主力**Remote-SSH编辑 + 编译 + 调试 + git 全部在虚拟机)
- **辅助场景**SMB只看几个文件、拖文件备份
两者不冲突,可以同时配好,按需使用。
--- ---
@ -1385,7 +1426,428 @@ sudo systemctl restart ssh
--- ---
文档版本: 2.0 ---
最后更新: 2026-04-15
适用系统: Ubuntu 20.04 LTS (x86_64), macOS # 第八部分Android SDK Git 代码管理
网络环境: 跨网络远程开发Tailscale + ClashX Pro 共存)
## 8.1 方案说明
OrangePi CM5 Android 13 SDK 共 84GB、数十万文件不可能全量入 Git。
采用**白名单 `.gitignore` 方案**:在 SDK 根目录初始化 Git默认忽略所有文件只放行会被修改的核心目录。
- Git 仓库路径:`~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13/`
- 远程仓库GitHub`OrangePi_CM5_Project`Private
- 首次推送96,602 个文件,.git 约 1.3GB)约需 30-60 分钟
## 8.2 追踪的核心目录
| 目录 | 作用 |
|------|------|
| `device/rockchip/` | 产品配置、开机画面、init.rc、权限 |
| `kernel-5.10/arch/arm64/boot/dts/` | 设备树(屏幕/LED/NFC/GPIO 等) |
| `kernel-5.10/arch/arm64/configs/` | 内核配置文件 |
| `kernel-5.10/drivers/` | 内核驱动源码 |
| `kernel-5.10/include/` | 内核头文件 |
| `hardware/rockchip/` | Rockchip 硬件 HAL |
| `hardware/interfaces/` | Android 硬件接口 |
| `hardware/libhardware/` | Android hardware 库 |
| `u-boot/arch/arm/` | U-Boot 架构相关代码 |
| `u-boot/configs/` | U-Boot 配置 |
| `u-boot/board/` | 板级支持 |
| `u-boot/drivers/` | U-Boot 驱动 |
| `u-boot/include/` | U-Boot 头文件 |
| `u-boot/dts/` | U-Boot 设备树 |
| `frameworks/base/core/res/` | 系统默认资源(开机动画等) |
## 8.3 .gitignore 白名单内容
```gitignore
# 策略:根目录忽略所有,只白名单放行会改的目录
# 1. 默认忽略根目录所有内容
/*
# 2. 白名单:允许这些顶层目录/文件
!/.gitignore
!/README.md
!/device/
!/kernel-5.10/
!/hardware/
!/u-boot/
!/frameworks/
# ===== device 目录:只保留 rockchip =====
/device/*
!/device/rockchip/
/device/rockchip/*
!/device/rockchip/common/
!/device/rockchip/rk3588/
# ===== kernel-5.10:只保留驱动、设备树、配置 =====
/kernel-5.10/*
!/kernel-5.10/arch/
!/kernel-5.10/drivers/
!/kernel-5.10/kernel/
!/kernel-5.10/include/
!/kernel-5.10/Documentation/
# kernel-5.10/arch 只保留 arm64
/kernel-5.10/arch/*
!/kernel-5.10/arch/arm64/
/kernel-5.10/arch/arm64/*
!/kernel-5.10/arch/arm64/boot/
!/kernel-5.10/arch/arm64/configs/
/kernel-5.10/arch/arm64/boot/*
!/kernel-5.10/arch/arm64/boot/dts/
# ===== hardware 只保留 rockchip =====
/hardware/*
!/hardware/rockchip/
!/hardware/interfaces/
!/hardware/libhardware/
# ===== u-boot 只保留配置、设备树、板级代码 =====
/u-boot/*
!/u-boot/arch/
!/u-boot/board/
!/u-boot/configs/
!/u-boot/include/
!/u-boot/drivers/
!/u-boot/dts/
/u-boot/arch/*
!/u-boot/arch/arm/
/u-boot/arch/arm/*
!/u-boot/arch/arm/dts/
!/u-boot/arch/arm/mach-rockchip/
!/u-boot/arch/arm/include/
# ===== frameworks 只保留 base/core/res =====
/frameworks/*
!/frameworks/base/
/frameworks/base/*
!/frameworks/base/core/
/frameworks/base/core/*
!/frameworks/base/core/res/
# ===== 编译产物和临时文件 =====
out/
*.o
*.ko
*.a
*.so
*.so.dbg
*.pyc
*.swp
*.swo
*~
__pycache__/
.DS_Store
# ===== 子仓库的 .git 内部目录 =====
**/.git/
```
## 8.4 日常工作流
```bash
# 在 SDK 中直接改代码(例如 NFC 驱动)
cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13
vi kernel-5.10/drivers/nfc/my_nfc.c
# 查看修改
git status
git diff
# 提交
git add kernel-5.10/drivers/nfc/
git commit -m "添加 PN532 NFC 驱动支持"
git push
```
## 8.5 回滚操作
```bash
# 查看历史
git log --oneline
# 回滚单个文件到上一版本
git checkout HEAD~1 -- kernel-5.10/drivers/nfc/my_nfc.c
# 回滚整个目录
git checkout HEAD~1 -- kernel-5.10/drivers/nfc/
# 慎用:回滚全部到某个 commit
git reset --hard <commit_hash>
```
## 8.6 分支管理(推荐功能分支)
```bash
# 创建功能分支
git checkout -b feature/nfc-pn532
# 开发、多次 commit 后合并回 main
git checkout main
git merge feature/nfc-pn532
# 废弃分支
git branch -D feature/nfc-pn532
```
## 8.7 首次推送到 GitHubSSH 密钥方式,推荐)
**当前仓库**: `git@github.com:Leo-z8/OrangePi_CM5_Project.git`Private
**认证方式**: SSH ed25519 密钥,永久免密
**网络路径**: 虚拟机 → GitHub `ssh.github.com:443`(直连,不经 Clash 代理)
### 为什么选 SSH 而非 HTTPS + PAT
| 对比项 | HTTPS + PAT | SSH 密钥 |
|--------|-------------|----------|
| 有效期 | 最长 1 年,需定期更新 | 永久有效 |
| 网络路径 | 必须走 Clash 代理HTTPS 国内慢) | 443 端口直连 GitHub |
| 稳定性 | TLS 握手依赖代理链,大文件易挂断 | SSH 原生流控,错误信息清晰 |
| 推送速度 | 受 Clash 带宽 + rwnd 限制 | 实测稳定 4-6 MiB/s |
| 首次推送 758 MiB | 多次中断重试 | 约 2-3 分钟完成 |
### 步骤 1虚拟机生成 SSH 密钥
```bash
ssh-keygen -t ed25519 -C "zhangwenqi-orangepi-vm-github" \
-f ~/.ssh/github_ed25519 -N ''
```
生成后两个文件:
- `~/.ssh/github_ed25519`(私钥,权限 600
- `~/.ssh/github_ed25519.pub`(公钥)
### 步骤 2配置 `~/.ssh/config` 走 443 端口
```
Host github.com
HostName ssh.github.com
User git
Port 443
IdentityFile ~/.ssh/github_ed25519
IdentitiesOnly yes
ServerAliveInterval 30
```
**关键点**:
- `HostName ssh.github.com` + `Port 443` 绕过国内对 22 端口的封锁
- `IdentitiesOnly yes` 强制只用这个密钥,防止扔其他密钥被 GitHub 拒绝
- 此方案不依赖 Clash 代理,虚拟机可直连
### 步骤 3添加公钥到 GitHub
```bash
cat ~/.ssh/github_ed25519.pub
```
复制整行内容,到 https://github.com/settings/ssh/new 添加:
- Title`OrangePi-VM-Linux`
- Key typeAuthentication Key
- Key粘贴公钥
### 步骤 4测试连通性
```bash
ssh -T git@github.com
# 预期输出Hi Leo-z8! You've successfully authenticated
```
### 步骤 5切换仓库 remote 到 SSH
```bash
cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13
# 清除旧 HTTPS 配置(如果之前用过 PAT
rm -f ~/.git-credentials
git config --local --unset credential.helper 2>/dev/null
git config --local --unset http.proxy 2>/dev/null
git config --local --unset https.proxy 2>/dev/null
# 改 remote 为 SSH
git remote set-url origin git@github.com:Leo-z8/OrangePi_CM5_Project.git
git remote -v
# 推送(永久免密)
git push -u origin main
```
### 备选方案HTTPS + PAT不推荐作为长期方案
仅在没有 SSH 配置权限或临时应急时使用:
```bash
# 配置 git 代理HTTPS 必须走 Clash
git config http.proxy http://192.168.6.57:7890
git config https.proxy http://192.168.6.57:7890
git config http.postBuffer 524288000 # 增大缓冲,大仓库必需
git remote set-url origin https://github.com/Leo-z8/OrangePi_CM5_Project.git
git config credential.helper store
# 提示时:用户名 = GitHub 账号,密码 = PAT 令牌
git push -u origin main
```
> **PAT 生成**https://github.com/settings/tokens/new → 勾 `repo` → 生成后立即复制。
> 推送完成后建议立即 Revoke一次性使用因为 PAT 明文存在 `~/.git-credentials` 有泄露风险。
## 8.8 推送后日常 push
SSH 方式配置后完全免密:
```bash
cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13
git add kernel-5.10/drivers/nfc/
git commit -m "添加 PN532 NFC 驱动"
git push # 免密,永久免代理
git pull # 同理
```
## 8.9 备份策略
| 资产 | 备份位置 |
|------|---------|
| 驱动/配置修改 | GitHub 仓库(`Leo-z8/OrangePi_CM5_Project`Private |
| SDK 原始源码分卷9个 tar.gz | Windows 电脑(永久保留,不能删) |
| Docker 镜像定义 | `~/OrangePi_CM5/docker/Dockerfile` |
| 编译产物update.img | 按需保留,体积大不进 Git |
| 被 `.gitignore` 排除的大文件 | 需单独备份(见 8.10 |
## 8.10 GitHub 推送踩坑实录2026-04-22 首次推送)
### 踩坑 1GitHub 单文件 100MB 硬性限制
**现象**HTTPS 推送数据上传完后 "远端意外挂断了"SSH 推送明确报错:
```
remote: error: File device/rockchip/rk3588/rk3588m_car/preinstall/camera360.apk
is 120.48 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected.
! [remote rejected] main -> main (pre-receive hook declined)
```
**根因**GitHub pre-receive hook 在服务端验收阶段拒绝 >100MB 单文件。HTTPS 协议表现为 TLS 连接异常终止难诊断SSH 协议会直接打印错误(易诊断)。
**教训****大文件推送问题要用 SSH 调试**HTTPS 的"远端挂断"往往掩盖真实原因。
### 踩坑 2扫大文件要用 `git ls-tree`,不能用 `git rev-list`
```bash
# ❌ 错误方式:按 blob 扫描Git 去重会掩盖多路径
git rev-list --objects --all | \
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
awk '$1=="blob" && $3>=100000000'
# ✅ 正确方式:按 HEAD 中的路径扫描
git ls-tree -r -l HEAD | awk '$4>=100000000 {printf "%.1f MB %s\n", $4/1024/1024, $5}'
```
**根因**:两个产品目录下存在完全相同的 `camera360.apk`(内容 hash 相同Git 按 blob 去重存储,`rev-list` 只列出一个 blob`ls-tree` 会展开所有路径。
**教训**:初次 `git rm --cached` 只去掉一个路径,第二次推送时另一个路径的 APK 仍会撞限,必须一次性用通配符覆盖所有。
### 踩坑 3`.gitignore` 用具体路径易遗漏,通配符更健壮
```gitignore
# ❌ 窄规则:只管一个路径
device/rockchip/rk3588/rk3588m_car/preinstall/camera360.apk
# ✅ 通配符:所有产品配置下的预装 APK 一次性处理
device/rockchip/*/*/preinstall/*.apk
```
**教训**多产品配置项目中rk3588m_car / rk3588m_s / …)类似的二进制资源可能分布在多个目录,写 `.gitignore` 规则时默认用通配符。
### 踩坑 4HTTPS + Clash 代理的 TCP rwnd 瓶颈
推送过程 `ss -tni` 显示 **`rwnd_limited: 95.1%`** —— 95% 时间卡在 GitHub 端接收窗口Clash 代理到 GitHub 的上行链路成瓶颈,平均速度被压到 1-2 MiB/s。
切到 SSH 443 直连后 **`rwnd_limited: 0.8%`**,速度稳定 4-6 MiB/s。
**结论**:大仓库首次推送坚决用 SSH不要 HTTPS。
### 踩坑 5凭证泄露风险
HTTPS + PAT 方案下,凭证明文存在 `~/.git-credentials`
```
https://用户名:PAT@github.com
```
即使 PAT 只用一次,也要:
1. 推送完成后到 https://github.com/settings/tokens 立即 Revoke
2. `rm -f ~/.git-credentials`
3. `git config --unset credential.helper`
**SSH 方式无此风险**:私钥只存本地 ~/.ssh/,不会经过对话或日志。
### 本次推送完整大文件排除流程(已落地)
```bash
cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13
# 1. 扫出所有 >100MB 路径
git ls-tree -r -l HEAD | awk '$4>=100000000 {printf "%.1f MB %s\n", $4/1024/1024, $5}'
# 2. 从索引移除(磁盘文件保留)
git rm --cached device/rockchip/rk3588/rk3588m_car/preinstall/camera360.apk
git rm --cached device/rockchip/rk3588/rk3588m_s/preinstall/camera360.apk
# 3. .gitignore 追加通配符规则
cat >> .gitignore << 'EOF'
# 排除所有预装 APKGitHub 100MB 限制 + 非驱动开发必需)
device/rockchip/*/*/preinstall/*.apk
EOF
# 4. amend 原 commit
git add .gitignore
git commit --amend --no-edit
# 5. 验证 HEAD 里无 >100MB 文件
git ls-tree -r -l HEAD | awk '$4>=100000000' # 应无输出
# 6. 推送
git push -u origin main
```
### 需要单独备份的大文件清单
以下文件已从 Git 历史排除,需另存(网盘/内网文件服务器):
| 文件 | 大小 | 路径 |
|------|------|------|
| camera360.apk (rk3588m_car) | 120 MB | `device/rockchip/rk3588/rk3588m_car/preinstall/` |
| camera360.apk (rk3588m_s) | 120 MB | `device/rockchip/rk3588/rk3588m_s/preinstall/` |
这些是产品预装 APK不是驱动开发所需完整 SDK 部署时再从备份恢复即可。
## 8.11 GitHub 推送关键数据(本次首次推送)
| 指标 | 数值 |
|------|------|
| 本地仓库大小(`.git` | 774 MB |
| 追踪文件总数 | 96,600 |
| 上传 pack 大小 | 约 518 MiB移除两个 120MB APK 后) |
| 网络路径 | 虚拟机 → Tailscale不经 Clash`ssh.github.com:443` |
| 实测速度 | 4-6 MiB/sSSH 443 直连,无 rwnd 瓶颈) |
| 首次推送耗时 | 约 2-3 分钟(纯网络时间,排除多次重推) |
| 最终 commit | `c79995a30a9db560899bf0845440720edf3e5e3d` |
| 远程仓库 | https://github.com/Leo-z8/OrangePi_CM5_Project |
---
文档版本: 3.1
最后更新: 2026-04-22
适用系统: Ubuntu 20.04/22.04 LTS (x86_64), macOS
网络环境: 跨网络远程开发Tailscale + ClashX Pro 共存 + GitHub SSH 443
主要变更v3.1:
- 4.5 新增 SMB 挂载方式Mac 端轻量文件访问方案)与 Remote-SSH 对比
- 8.7 首次推送 GitHub 改为 SSH 密钥为主PAT 降为备选
- 8.10 新增首次推送踩坑实录(单文件 100MB 限制、Git 去重陷阱、rwnd 瓶颈等)
- 8.11 新增首次推送实测数据