# DTU-RemoteLCD - 远程显示通信工具

与 **RemoDispBus** 协议兼容的远程 LCD 显示与按键模拟工具。通过网络连接 DTU 装置，在 Web 浏览器中实时查看 LCD 画面并模拟按键操作，适用于调试、监控等场景。

## 功能特性

- **实时屏幕显示**：将装置 LCD 显存以 1bpp 位图形式拉取并渲染为 PNG
- **按键模拟**：支持方向键、确认、返回、复归等按键
- **WebSocket 传输**：采用 Socket.IO，服务端主动推送，约 100ms 刷新
- **跨平台**：浏览器访问，无需安装客户端

## 环境要求

- Python 3.7+
- 与 DTU 装置网络互通（默认端口 7003）

## 快速开始

### 1. 安装依赖

```bash
pip install -r requirements.txt
```

### 2. 启动服务

```bash
python remo_disp_server.py [装置IP]
```

启动后访问 **http://localhost:8181**。

### 3. 使用说明

- 点击「连接」→ 输入装置 IP 和端口（默认 7003）→ 连接
- 左侧显示装置 LCD 画面（约 100ms 刷新）
- 右侧使用方向键、确认、复归、返回进行按键操作
- 点击「断开」断开与装置的连接

**可选预连接**：启动时传入 IP 可预连接装置，例如：

```bash
python remo_disp_server.py 192.168.253.3
```

## 项目结构

```
DTU-RemoteLCD/
├── remo_disp_server.py    # Web 服务（Flask + Socket.IO）
├── remo_disp_ui.html      # Web 前端页面
├── requirements.txt      # Python 依赖
├── static/                # 静态资源（可选）
│   └── favicon.ico       # 网站图标
└── README.md
```

## 协议说明（RemoDispBus）

与 `HMI/RemoeDisp/RemoDispBus.c` 兼容：

| 项目 | 说明 |
|------|------|
| **端口** | 7003 |
| **工具 → 装置** | `[0xAA][功能码][长度高][长度低][数据...][CRC]` |
| **装置 → 工具** | `[0xBB][功能码][长度高][长度低][数据...][CRC]` |
| **CRC** | 数据区逐字节异或，取低 8 位 |

**功能码**：

| 码 | 名称 | 说明 |
|----|------|------|
| 0 | KEEPLIVE | 保活 |
| 1 | INIT | 初始化，获取屏幕宽高、显存大小 |
| 2 | KEY | 按键 |
| 3 | LCDMEM | 读取显存（屏幕画面） |

## 按键映射

| 键名 | 协议码 | 说明 |
|------|--------|------|
| U | 0x02 | 上 |
| D | 0x40 | 下 |
| L | 0x10 | 左 |
| R | 0x08 | 右 |
| ENT | 0x20 | 确认 |
| ESC | 0x01 | 返回/取消 |
| RESET | 0x04 | 复归 |
| F2 | 0x80 | F2 |

## 依赖说明

| 依赖 | 用途 |
|------|------|
| Flask | Web 框架 |
| flask-socketio | WebSocket 支持 |
| python-socketio | Socket.IO 服务端 |
| Pillow | 1bpp 位图转 PNG |

## 配置说明

- **Web 服务端口**：默认 8181，在 `remo_disp_server.py` 的 `main()` 中修改
- **装置端口**：默认 7003，连接时可输入自定义端口
- **Favicon**：将 `favicon.ico` 放入 `static/` 目录即可显示网站图标

## 许可证

本项目仅供内部调试使用。
