# 远程日志调试策略

## 问题

产品安装在自行车转盘上，运行时无法连接开发板查看日志，但日志对开发和维护很重要。

## 方案对比

### 方案 1：BLE NUS (Nordic UART Service) ✅ 推荐

**优点**：
- 标准 BLE 服务，Nordic 官方支持
- 可以实时查看日志
- 不需要额外硬件
- 可以通过手机 App 或电脑连接查看
- 支持双向通信（可以发送命令）

**缺点**：
- 需要 BLE 连接才能查看日志
- 如果 BLE 断开，日志会丢失
- 可能影响 BLE 性能（如果日志量大）
- 需要额外的 BLE 连接（如果已经有其他 BLE 服务）

**实现复杂度**：中等

### 方案 2：日志缓冲 + BLE 传输

**优点**：
- 可以缓存最近的日志（即使 BLE 断开）
- 连接后可以读取历史日志
- 不影响实时性能

**缺点**：
- 需要 RAM 缓冲（有限）
- 实现较复杂

**实现复杂度**：高

### 方案 3：Flash 日志存储

**优点**：
- 可以记录大量日志
- 即使设备重启也能保留
- 不需要实时连接

**缺点**：
- Flash 写入次数有限（寿命问题）
- 需要读取机制（通过 BLE 或 USB）
- 可能影响实时性能（Flash 写入较慢）

**实现复杂度**：高

### 方案 4：混合方案（推荐）⭐

**组合**：
1. **实时日志**：BLE NUS（开发/调试时）
2. **关键日志**：Flash 存储（错误、重要事件）
3. **日志级别控制**：生产环境只记录错误，开发环境记录所有

**优点**：
- 灵活性高
- 适合不同场景
- 平衡性能和功能

**实现复杂度**：中高

## 推荐方案：BLE NUS + 日志级别控制

### 架构设计

```
日志系统
├─> 日志级别过滤（生产/开发模式）
├─> 实时输出：BLE NUS（如果连接）
├─> 关键日志：Flash 存储（错误、警告）
└─> 本地缓冲：RAM 环形缓冲区（最近 N 条）
```

### 实现步骤

1. **启用 BLE NUS**
   - 在 `prj.conf` 中启用 NUS
   - 创建 NUS 服务实例

2. **日志后端**
   - 创建自定义日志后端，输出到 BLE NUS
   - 保留 RTT 后端（开发时使用）

3. **日志级别控制**
   - 生产模式：只记录 ERR/WRN
   - 开发模式：记录所有级别

4. **可选：日志缓冲**
   - 环形缓冲区存储最近日志
   - BLE 连接后可以读取历史

## 实施建议

### 阶段 1：基础 BLE NUS 日志（最简单）

- 启用 BLE NUS
- 将日志输出到 NUS
- 使用手机 App（如 nRF Connect）查看日志

### 阶段 2：增强功能

- 添加日志级别控制
- 添加日志缓冲
- 支持日志命令（清除、设置级别等）

### 阶段 3：高级功能（可选）

- Flash 日志存储
- 日志压缩
- 日志统计

## 使用场景

### 开发阶段
- 使用 RTT（开发板连接时）
- 使用 BLE NUS（实际测试时）

### 生产/现场
- BLE NUS 实时查看
- Flash 存储关键错误
- 通过手机 App 读取日志

## 手机 App 推荐

1. **nRF Connect**（Nordic 官方）
   - 支持 NUS
   - 可以查看实时日志
   - 免费

2. **自定义 App**（可选）
   - 可以添加日志过滤
   - 可以保存日志到文件
   - 可以发送命令

## 注意事项

1. **性能影响**：
   - 日志量大时可能影响 BLE 性能
   - 建议使用日志级别控制

2. **连接稳定性**：
   - BLE 连接可能不稳定（运动时）
   - 建议添加日志缓冲

3. **安全性**：
   - 生产环境可能需要禁用或限制日志
   - 避免泄露敏感信息

4. **功耗**：
   - BLE 传输会增加功耗
   - 可以按需启用/禁用

