# QSJNIC MCU 通信全链路测试报告

## 基本信息

| 项目 | 内容 |
|------|------|
| 日期 | 2026-05-28 |
| 项目 | QSJNIC 车载 Android 中间件 |
| 版本 | v1.0.0-beta6 |
| MCU 固件 | `swVersion=0302_20260527` |
| MCU 硬件 | `hwVersion=PAJERO69XZA0120018` |
| 测试设备 | 车机 192.168.0.66 |
| 协议文档 | `docs/MCU_ARM_Reference/20260513/` |

---

## 一、测试范围

对 Android 中间件与 MCU 之间的全部三个业务域进行了端到端测试：

| 域 | MsgType | 测试项 | M2A | A2M |
|----|---------|--------|-----|-----|
| Public（车辆信号） | 0x01 | LINE_DETECT, MCU_VERSION, TIME_INFO, SYS_STATUS, TFT_DUTY, 等 | 6 项 | 5 项 |
| Radio（收音机） | 0x05 | FREQ, PS_PTY, RT, SEEK | 3 项 | 1 项 |
| Key（方控按键） | 0x02 | KEY_M2A_KEY, KEY_A2M_KEY | 0 项 | 3 项 |

---

## 二、Radio 域 — MCU 固件缺陷（已证实）

### 2.1 发现

搜台后 `valid`、`signal` 始终为 0，`onPsPty` 和 `onRadioText` 回调无数据。

### 2.2 排查方法

在 `FrameRouter.handleRadio()` 中增加原始 hex dump，直接打印 MCU 发来的 body 字节，绕过所有软件解析层。

### 2.3 实测数据

**FREQ 帧（cmd=0x01）— 搜台中：**
```
FREQ_BODY[7]=26 B0 00 42 00 00 00 | Byte12=0x00 (valid=0) Byte14(signal)=0x00
```
- 频率 P0-P1: `26 B0` → `26 C4`（99.04→99.24 MHz）✓
- 波段 P2: `00`=FM ✓
- 搜台模式 P3: `42`=SEEK_FF+STEREO ✓
- **valid P4 Byte12: `0x00`（bit7=0）** ✗
- **PTY P5 Byte13: `0x00`** ✗
- **signal P6 Byte14: `0x00`** ✗

**PS_PTY 帧（cmd=0x02）：**
```
PS_PTY[9]=00 00 00 00 00 00 00 00 00 | PTY=0x00 PS="(empty)"
```
- 9 字节全部为零

**RT 帧（cmd=0x03）：**
```
RT[64]=00 00 00 ... 00 00 | RT="(empty)"
```
- 64 字节全部为零

### 2.4 软件层排查

| 层 | 检查项 | 结果 |
|----|-------|------|
| C 协议层 `mcu_protocol.c` | payload 从 `raw+6` 开始 | ✓ |
| JNI `jni_bridge.cpp` | `body = payload+2`, `body_len = payload_len-2` | ✓ |
| Java FrameRouter | payload 直接传递 | ✓ |
| DomainBus → RadioFeature | body 原样转发 | ✓ |
| RadioFeature | `valid = (p[4]>>7)&1`, `signal = p[6]&0xFF` | ✓ |
| Decoders.parsePsPty | `pty = body[0]`, `ps = trimUtf8(body, 1, 8)` | ✓ |
| AIDL → SDK → App | 回调传递 | ✓ |

### 2.5 结论

**MCU 固件 `0302_20260527` 的 Radio 域 M2A 帧（FREQ/PS_PTY/RT）结构正确但数据载荷全为零。这是 MCU 固件缺陷，不是 Android 端软件问题。**

---

## 三、Public 域 — 全部正常 ✓

### 3.1 M2A（MCU→ARM）测试结果

| cmd | 接口 | 实测值 | 状态 |
|-----|------|--------|------|
| 0x01 | LINE_DETECT | IG=0, ACC=1, Brake=0, Back=0, LTurn=1, RTurn=0 | ✓ |
| 0x02 | MCU_VERSION | "PAJERO69XZA0120018" | ✓ |
| 0x03 | TIME_INFO | 2025-01-01 01:42:08（未设置） | ✓ |
| 0x05 | SYS_STATUS | firstPwrOn=0 | ✓ |
| 0x08 | TFT_DUTY | 0% | ✓ |
| 0x13 | VERSION_STR | sw="0302_20260527", boot="03" | ✓ |

### 3.2 A2M（ARM→MCU）测试结果

通过 Vehicle Demo App 触发：

| cmd | 操作 | 返回值 | 状态 |
|-----|------|--------|------|
| 0x82 | Mute ON | rc=0 | ✓ |
| 0x82 | Mute OFF | rc=0 | ✓ |
| 0x84 | Backlight 50% | rc=0 | ✓ |
| 0x84 | Backlight 100% | rc=0 | ✓ |
| 0x81 | Refresh Init | rc=0 | ✓ |

### 3.3 结论

**Public 域 M2A/A2M 双向通信全部正常。MCU 固件缺陷仅影响 Radio 域。**

---

## 四、Key 域 — 协议一致，存在按键映射不匹配

### 4.1 M2A（MCU→ARM）

未触发（需物理方控按键），但代码路径验证通过。

### 4.2 A2M（ARM→MCU）测试结果

通过 Vehicle Demo App 触发：

| 按键 | keyValue | keyStatus | seq | 状态 |
|------|----------|-----------|-----|------|
| MODE | 0x01 | 0x01（短按） | 23 | ✓ |
| 音量+ | 0x0A | 0x01（短按） | 24 | ✓ |
| 音量- | 0x0B | 0x01（短按） | 25 | ✓ |

`seq` 为有效值证明帧已通过串口发送给 MCU 且收到了 ACK。

### 4.3 协议一致性

| 项目 | 协议 Key.xlsx | 代码 | 结果 |
|------|-------------|------|------|
| MsgType | 0x02 | `MsgType.KEY = 0x02` | ✓ |
| M2A cmd | 0x01 | `Cmds.Key.M2A_KEY = 0x01` | ✓ |
| A2M cmd | 0x81 | `Cmds.Key.A2M_KEY = 0x81` | ✓ |
| P0 KeyValue | Byte8 | `body[0] & 0xFF` | ✓ |
| P1 KeyStatus | Byte9 | `body[1] & 0xFF` | ✓ |

### 4.4 按键值映射不匹配

Key.xlsx 定义了四套按键映射表，SDK 使用了 MC3 映射，但帕杰罗车机实际使用"其它项目"映射：

| 功能 | SDK 常量 (MC3) | 帕杰罗实际值 (其它项目) |
|------|---------------|----------------------|
| 音量- | 0x0B | 0x08 |
| 音量+ | 0x0A | 0x09 |
| 上一曲 | 0x08 | 0x0E |
| 下一曲 | 0x09 | 0x0F |
| 接听 | 未定义 | 0x18 |
| 挂断 | 未定义 | 0x19 |
| 摄像头 | 未定义 | 0x25 |

此外 `Commands.Key.key()` 校验范围为 `0x00-0x0B`，帕杰罗的扩展值（0x0E-0x25）会触发异常。

### 4.5 结论

**Key 域协议帧结构正确。但 SDK 按键常量使用 MC3 映射表，与帕杰罗车型的"其它项目"映射表不匹配。由于当前 A2M Key 暂不使用（自测文档明确"KEY_A2M_KEY暂时不用实现"），实际功能不受影响。**

---

## 五、软件层全局审计结论

对全部 7 层软件链路进行了逐模块审计：

| 层级 | 文件 | 检查结果 |
|------|------|---------|
| C 协议 | `mcu_protocol.c` | 帧编解码正确 |
| C 传输 | `mcu_transport.c` | 串口 I/O、回调链正确 |
| JNI | `jni_bridge.cpp` | body 字节传递正确 |
| Java 分发 | `FrameRouter.java` | msgType/cmd 路由正确 |
| Java 业务 | `VehicleFeature.java` | Public 26 个 M2A cmd 映射正确 |
| Java 业务 | `RadioFeature.java` | Radio 5 个 M2A cmd 映射正确 |
| Java 业务 | `KeyFeature.java` | Key 1 个 M2A cmd 映射正确 |
| Java 解析 | `Decoders.java` | 全部解析器与协议一致 |
| Java 编码 | `Commands.java` | 全部编码器与协议一致 |
| Java 发送 | `McuLink.java` | 帧组装正确 |
| SDK | `McuClient.java` 等 | 回调转发正确 |

**Android 中间件软件层的 MCU 通信代码没有 bug。**

---

## 六、问题汇总

| 编号 | 问题 | 严重程度 | 责任方 | 状态 |
|------|------|---------|--------|------|
| #1 | Radio FREQ 帧 P4-P6 全部为零 | 高 | MCU 固件 | 待修复 |
| #2 | Radio PS_PTY 帧 9 字节全部为零 | 高 | MCU 固件 | 待修复 |
| #3 | Radio RT 帧 64 字节全部为零 | 高 | MCU 固件 | 待修复 |
| #4 | Key 按键映射不匹配（MC3 vs 帕杰罗） | 低 | SDK | 待修复 |

---

## 七、建议

1. **紧急**：将 #1-#3 的 MCU 固件缺陷报告发给 MCU 供应商，要求修复 Radio 域数据填充
2. **后续**：修复 #4 的 Key 映射问题，在 SDK 中增加帕杰罗车型的按键常量
3. **后续**：将 `sendKeyEvent` 的日志补全（当前 `McuBinder` 和 `McuKeyClient` 无日志）
