Skip to content

Commit 6eed189

Browse files
author
global_name
committed
Add Day 103: DuckyClaw Remote Desktop Assistant
Signed-off-by: global_name <global_email@email.com>
1 parent 4ef881b commit 6eed189

2 files changed

Lines changed: 377 additions & 0 deletions

File tree

Lines changed: 377 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,377 @@
1+
---
2+
layout: post
3+
title: "Day 103: DuckyClaw 图鸦智能桌面搭子:远程桌面助手"
4+
author: iosdevlog
5+
date: 2026-05-06 00:00:00 +0800
6+
category: [AI, IoT]
7+
tags: [DuckyClaw, T5AIBoard, RemoteDesktop, MJPEG, WebSocket, TuyaOpen, 远程桌面]
8+
---
9+
10+
# Day 103: DuckyClaw 图鸦智能桌面搭子:远程桌面助手 🖥️
11+
12+
13+
## 视频
14+
15+
b站视频:<https://www.bilibili.com/video/BV1B1RJBREcn/>
16+
17+
将 T5 AIBoard 变身为智能远程桌面显示器!通过语音控制启动服务,实时投射 PC 屏幕到 480x854 LCD,支持触摸控制鼠标操作。基于 MJPEG 硬件解码和 WebSocket 通信,延迟低至 100ms。
18+
19+
![Remote Desktop Demo](/assets/images/AI/Day103/remote_desktop_demo.jpg)
20+
21+
## 功能亮点 ✨
22+
23+
- 📺 **实时屏幕投射**:PC 桌面画面实时传输到 T5 LCD 屏幕
24+
- 🖱️ **触摸控制**:通过触摸屏控制电脑鼠标移动和点击
25+
- 🎯 **硬件加速**:使用 T5 芯片的 MJPEG 硬件解码器
26+
- 🗣️ **语音控制**:语音命令启动/停止远程桌面服务
27+
- 📡 **WiFi 连接**:基于 WebSocket 协议的局域网通信
28+
-**低延迟**:端到端延迟 < 100ms
29+
30+
## 技术参数 📊
31+
32+
| 参数 | 规格 |
33+
|------|------|
34+
| 显示分辨率 | 480 x 854 像素 |
35+
| 色彩深度 | RGB565 (16-bit) |
36+
| 目标帧率 | 10-15 FPS |
37+
| 视频编码 | MJPEG |
38+
| 网络协议 | WebSocket (端口 18789) |
39+
| 延迟 | < 100ms (局域网) |
40+
41+
## 快速开始 🚀
42+
43+
### 1. 启动 T5 远程桌面服务
44+
45+
**语音启动(推荐):**
46+
47+
```
48+
"你好涂鸦,打开远程桌面"
49+
```
50+
51+
**串口命令:**
52+
53+
```bash
54+
rd_start
55+
```
56+
57+
### 2. 获取 T5 IP 地址
58+
59+
**语音查询:**
60+
61+
```
62+
"你好涂鸦,查询 WiFi 信息"
63+
```
64+
65+
T5 会报告 IP 地址,例如:`192.168.3.117`
66+
67+
### 3. 启动 PC 客户端
68+
69+
```bash
70+
cd pc_client
71+
pip install -r requirements.txt
72+
python main.py --ip 192.168.3.117 --fps 15 --quality 75
73+
```
74+
75+
**参数说明:**
76+
- `--ip`:T5 开发板的 IP 地址
77+
- `--fps`:目标帧率(建议 10-15)
78+
- `--quality`:JPEG 压缩质量(50-90,默认 75)
79+
80+
### 4. 开始使用
81+
82+
启动成功后:
83+
- T5 LCD 屏幕显示您的电脑桌面
84+
- 可以通过触摸屏控制鼠标移动和点击
85+
- PC 终端显示实时传输统计信息
86+
87+
```
88+
Stats: 74 frames sent, 0 failed, 14.8 FPS
89+
```
90+
91+
## 系统架构 🏗️
92+
93+
```
94+
┌─────────────────┐ WebSocket ┌──────────────────┐
95+
│ PC 客户端 │◄──────────────────────────►│ T5 AIBoard │
96+
│ │ │ │
97+
│ - 屏幕截图 │ ──► MJPEG 视频流 ──► │ - MJPEG 解码 │
98+
│ - 图像压缩 │ │ - LCD 显示 │
99+
│ - 鼠标/键盘控制 │ ◄── 触摸事件 ◄── │ - 触摸输入 │
100+
└─────────────────┘ └──────────────────┘
101+
```
102+
103+
### T5 端核心模块
104+
105+
- `remote_desktop.c`:主控制器,协调各模块
106+
- `rd_video_decoder.c`:MJPEG 解码和 LCD 显示
107+
- `rd_touch_handler.c`:触摸输入处理和坐标映射
108+
- `rd_protocol.c`:WebSocket 消息解析
109+
- `ws_server.c`:WebSocket 服务器(端口 18789)
110+
111+
### PC 端核心模块
112+
113+
- `main.py`:主程序入口和协调
114+
- `screen_capture.py`:屏幕截图和 JPEG 编码
115+
- `input_controller.py`:鼠标/键盘控制
116+
- `websocket_client.py`:WebSocket 通信
117+
118+
## 通信协议 📡
119+
120+
### PC → T5 消息
121+
122+
**配置消息:**
123+
```json
124+
{
125+
"type": "config",
126+
"screen_width": 1920,
127+
"screen_height": 1080,
128+
"quality": 75,
129+
"fps": 15
130+
}
131+
```
132+
133+
**视频帧消息:**
134+
```json
135+
{
136+
"type": "video_frame",
137+
"width": 480,
138+
"height": 854,
139+
"frame_id": 12345,
140+
"data": "<base64-encoded-mjpeg>"
141+
}
142+
```
143+
144+
### T5 → PC 消息
145+
146+
**触摸事件消息:**
147+
```json
148+
{
149+
"type": "touch_event",
150+
"action": "down|move|up",
151+
"x": 240,
152+
"y": 427,
153+
"screen_x": 1920,
154+
"screen_y": 1080
155+
}
156+
```
157+
158+
**状态消息:**
159+
```json
160+
{
161+
"type": "status",
162+
"status": "started|stopped|configured"
163+
}
164+
```
165+
166+
## 性能优化 ⚡
167+
168+
### 低延迟模式(适合交互操作)
169+
170+
```bash
171+
python main.py --ip 192.168.3.117 --fps 15 --quality 70
172+
```
173+
174+
### 高质量模式(适合观看内容)
175+
176+
```bash
177+
python main.py --ip 192.168.3.117 --fps 10 --quality 85
178+
```
179+
180+
### 省带宽模式(适合弱网环境)
181+
182+
```bash
183+
python main.py --ip 192.168.3.117 --fps 5 --quality 60
184+
```
185+
186+
## 故障排查 🔧
187+
188+
### 问题 1:PC 客户端连接失败
189+
190+
**症状:** `Connection refused``Connection timeout`
191+
192+
**解决方案:**
193+
1. 确认 T5 远程桌面服务已启动
194+
2. 检查 IP 地址是否正确
195+
3. 确认 PC 和 T5 在同一局域网
196+
4. 检查防火墙是否阻止端口 18789
197+
5. 尝试 ping T5 的 IP 地址
198+
199+
### 问题 2:画面卡顿或延迟高
200+
201+
**症状:** FPS 低于 5 或延迟超过 200ms
202+
203+
**解决方案:**
204+
1. 降低帧率:`--fps 10`
205+
2. 降低质量:`--quality 60`
206+
3. 检查 WiFi 信号强度
207+
4. 减少网络中其他设备的流量
208+
209+
### 问题 3:触摸控制不响应
210+
211+
**症状:** 触摸屏无法控制鼠标
212+
213+
**解决方案:**
214+
1. 检查触摸屏是否正常工作
215+
2. 确认配置中启用了触摸支持
216+
3. 查看串口日志中的触摸事件
217+
4. 重启远程桌面服务
218+
219+
## 技术实现细节 🔍
220+
221+
### MJPEG 硬件解码
222+
223+
使用 TuyaOpen 的 `tkl_jpeg_codec` 抽象层:
224+
225+
```c
226+
// 获取 JPEG 信息
227+
TKL_JPEG_CODEC_INFO_T jpeg_info = {0};
228+
tkl_jpeg_codec_img_info_get(mjpeg_data, data_len, &jpeg_info);
229+
230+
// 解码到 RGB565
231+
tkl_jpeg_codec_convert(mjpeg_data, rgb565_out, &jpeg_info, JPEG_DEC_OUT_RGB565);
232+
```
233+
234+
### 触摸坐标映射
235+
236+
```c
237+
// 将 480x854 触摸坐标映射到 PC 屏幕分辨率
238+
pc_x = (touch_x * pc_screen_width) / 480;
239+
pc_y = (touch_y * pc_screen_height) / 854;
240+
```
241+
242+
### 动态缓冲区分配
243+
244+
```c
245+
// 根据 base64 长度动态分配解码缓冲区
246+
size_t max_decoded_len = (base64_len * 3) / 4 + 4;
247+
frame->data = tal_psram_malloc(max_decoded_len);
248+
```
249+
250+
### WebSocket 大帧支持
251+
252+
```c
253+
// 动态分配 64KB 接收缓冲区(从 PSRAM)
254+
client->rx_buf = tal_psram_malloc(65536);
255+
client->rx_buf_size = 65536;
256+
```
257+
258+
## 语音控制命令 🗣️
259+
260+
| 语音命令 | 功能 | 示例回复 |
261+
|---------|------|---------|
262+
| "打开远程桌面" | 启动服务 | "远程桌面服务已启动" |
263+
| "关闭远程桌面" | 停止服务 | "远程桌面服务已停止" |
264+
| "查询 WiFi 信息" | 获取 IP 地址 | "当前 IP 地址是 192.168.3.117" |
265+
| "远程桌面状态" | 查询运行状态 | "远程桌面正在运行" |
266+
267+
## 串口命令参考 💻
268+
269+
```bash
270+
# 启动远程桌面服务
271+
rd_start
272+
273+
# 停止远程桌面服务
274+
rd_stop
275+
276+
# 查询服务状态
277+
rd_status
278+
279+
# 查询 WiFi 连接信息
280+
wifi_info
281+
```
282+
283+
## 开发者指南 👨‍💻
284+
285+
### 编译固件
286+
287+
```bash
288+
# 初始化环境
289+
cd TuyaOpen && . ./export.sh && cd ..
290+
291+
# 选择配置
292+
cp config/TUYA_T5AI_BOARD_LCD_3.5_CAMERA.config app_default.config
293+
294+
# 编译
295+
cd TuyaOpen && python3 tos.py build
296+
297+
# 烧录
298+
python3 tos.py flash
299+
300+
# 监控日志
301+
python3 tos.py monitor
302+
```
303+
304+
### 关键技术点
305+
306+
1. **内存优化**:使用 PSRAM 存储大缓冲区,避免 RAM 溢出
307+
2. **双缓冲显示**:避免画面撕裂,提供流畅体验
308+
3. **动态分配**:根据实际帧大小分配解码缓冲区
309+
4. **硬件加速**:利用 T5 芯片的 MJPEG 解码器
310+
5. **协议设计**:JSON over WebSocket,易于扩展
311+
312+
## 未来计划 🚀
313+
314+
- [ ] 支持 H.264 编码(更高压缩率)
315+
- [ ] 多点触控手势(双指缩放、滚动)
316+
- [ ] 音频传输
317+
- [ ] 文件拖放传输
318+
- [ ] 多客户端支持
319+
- [ ] 互联网远程访问
320+
- [ ] 会话录制功能
321+
322+
## 常见问题 FAQ ❓
323+
324+
**Q:支持哪些操作系统?**
325+
326+
A:PC 端支持 Windows、macOS 和 Linux。T5 端运行 TuyaOpen 固件。
327+
328+
**Q:可以同时连接多个 PC 吗?**
329+
330+
A:当前版本仅支持单个 PC 连接。多客户端支持在未来版本中实现。
331+
332+
**Q:触摸屏支持多点触控吗?**
333+
334+
A:当前版本仅支持单点触控。多点触控手势在未来版本中实现。
335+
336+
**Q:可以通过互联网远程连接吗?**
337+
338+
A:当前版本仅支持局域网连接。互联网远程访问需要配置端口转发或 VPN。
339+
340+
**Q:延迟有多少?**
341+
342+
A:在良好的局域网环境下,端到端延迟通常在 50-100ms 之间。
343+
344+
## 项目地址 📦
345+
346+
- **GitHub**: [DuckyClaw_RemoteDesktop](hhttps://github.com/jiaxianhua/DuckyClaw_RemoteDesktop)
347+
- **完整文档**: [远程桌面使用指南](https://github.com/jiaxianhua/DuckyClaw_RemoteDesktop/blob/master/docs/远程桌面使用指南.md)
348+
349+
## 致谢 🙏
350+
351+
感谢以下开源项目:
352+
353+
- **TuyaOpen SDK**:提供底层硬件抽象
354+
- **mss**:跨平台屏幕截图
355+
- **Pillow**:图像处理
356+
- **websockets**:WebSocket 通信
357+
- **pynput**:输入设备控制
358+
359+
---
360+
361+
**更新日期:** 2026年5月6日
362+
**版本:** v1.0.0
363+
**适用固件:** DuckyClaw_RemoteDesktop v1.0.0+
364+
365+
## 总结 📝
366+
367+
通过 T5 AIBoard 的远程桌面功能,我们实现了:
368+
369+
1. ✅ 实时屏幕投射(10-15 FPS)
370+
2. ✅ 触摸控制鼠标
371+
3. ✅ 语音启动/停止服务
372+
4. ✅ 硬件 MJPEG 解码
373+
5. ✅ 低延迟通信(< 100ms)
374+
375+
这个功能展示了 T5 AIBoard 作为智能桌面搭子的潜力,未来还将支持更多高级特性!
376+
377+
#DuckyClaw #T5AIBoard #RemoteDesktop #IoT #TuyaOpen #智能硬件
241 KB
Loading

0 commit comments

Comments
 (0)