# Display Demo 测试环境启动流程

> 本文档仅用于 mcutest 分支测试，不合并到 main。
> 文档位置：`docs/display-demo-test-flow.md`

## 一、先确认网络环境

1. 本机 Mac 连上 `qs` WiFi
   - 期望 IP：`192.168.0.x`
   - 网关：`192.168.0.1`

2. 确认 ZeroTier 在线

   ```bash
   sudo zerotier-cli status
   sudo zerotier-cli listnetworks
   # 本机 ZeroTier IP 应为 192.168.192.41
   ```

3. 确认能 ping 通车机

   ```bash
   ping 192.168.0.66
   ```

## 二、启动本机 display_server 后台

### 手动启动

```bash
cd /Users/admin/workspace/jyq/qsjnic
source .venv-display/bin/activate
python3 scripts/display_server.py \
    --ws-port 5174 \
    --http-port 18080 \
    --base-path /yiren \
    --db /Users/admin/workspace/jyq/qsjnic/mcu_display.db
```

参数说明：

- `--ws-port 5174`：车机 display demo 连接的本机 WebSocket 端口
- `--http-port 18080`：dashboard 页面端口
- `--base-path /yiren`：让 dashboard 生成 `/yiren/events` 和 `/yiren/ws` 路径，配合 nginx 反向代理

### 推荐：用 screen 后台保持运行

```bash
screen -dmS display_server bash -c 'cd /Users/admin/workspace/jyq/qsjnic && source .venv-display/bin/activate && python3 scripts/display_server.py --ws-port 5174 --http-port 18080 --base-path /yiren --db /Users/admin/workspace/jyq/qsjnic/mcu_display.db'
```

常用 screen 操作：

- 查看日志：`screen -r display_server`
- detach（不停止服务）：`Ctrl+A` 然后按 `D`
- 停止服务：`screen -S display_server -X quit`

### 验证后台是否起来

```bash
curl http://127.0.0.1:18080/health
# 应返回 ok

lsof -i :5174
# 应看到 Python 在监听
```

## 三、确认车机 display demo APP 在运行

1. 确认车机已连 `qs` WiFi（IP 应为 `192.168.0.66`）
2. 启动 APP：

   ```bash
   adb connect 192.168.0.66
   adb shell am start -n com.qsjnic.demo.display/.MainActivity
   ```

3. 在 APP 里点 **Start** 按钮，APP 会连接 `ws://192.168.0.83:5174/ws`
4. 看日志确认连接成功：

   ```bash
   adb logcat -d -s WsUploader:* | tail -5
   # 应看到：ws open ws://192.168.0.83:5174/ws
   ```

### 如果 APP 需要重新打包安装

```bash
cd /Users/admin/workspace/jyq/qsjnic/demos/display-demo
./gradlew assembleRelease
adb install -r app/build/outputs/apk/release/app-release.apk
```

APK 里的 WebSocket 目标已固定为 `ws://192.168.0.83:5174/ws`，相关源码：

- `demos/display-demo/app/src/main/java/com/qsjnic/demo/display/MainActivity.java`
- `demos/display-demo/app/src/main/java/com/qsjnic/demo/display/DisplayService.java`

## 四、远程访问

nginx 已配置在 `192.168.192.122` 的 Docker 里，通常会自动启动。直接访问：


```text
https://wtb.anzhitek.com/yiren/
```

如果 nginx 没起来，在 122 号机上检查：

```bash
ssh anzhitek
sudo docker ps | grep nginx
sudo docker exec nginx nginx -t
sudo docker exec nginx nginx -s reload
```

## 五、为什么用 `--base-path /yiren`

之前尝试用 nginx `sub_filter` 硬改写 HTML 失败，所以直接改 `display_server.py`，让它原生支持反向代理子路径：

- 没 `--base-path` 时：dashboard 用 `fetch('/events')` 和 `ws://host:5174/ws`
- 有 `--base-path /yiren` 时：dashboard 自动用 `fetch('/yiren/events')` 和 `wss://host/yiren/ws`

这样 nginx 只需要简单代理 `/yiren/`、`/yiren/events`、`/yiren/ws` 三个路径，不需要 `sub_filter`。

## 六、一键启动脚本（可选）

保存为 `/Users/admin/workspace/jyq/qsjnic/start_display_server.sh`：

```bash
#!/bin/bash
cd /Users/admin/workspace/jyq/qsjnic
source .venv-display/bin/activate
pkill -f display_server.py
sleep 1
screen -dmS display_server bash -c 'cd /Users/admin/workspace/jyq/qsjnic && source .venv-display/bin/activate && python3 scripts/display_server.py --ws-port 5174 --http-port 18080 --base-path /yiren --db /Users/admin/workspace/jyq/qsjnic/mcu_display.db'
echo "display_server started on screen session 'display_server'"
```

使用：

```bash
chmod +x start_display_server.sh
./start_display_server.sh
```
