# Technical Documentation: galaxy-s10/billd-desk

> ℹ️ **Provenance:** Multi-Tier Ingestion · [CodeWiki Reference](https://codewiki.google/github.com/galaxy-s10/billd-desk)

### Overview (`README.md`)

BilldDesk Pro | [BilldDesk 开源版](./README_OpenSource.md)

<p align="center">
  <a href="https://desk.hsslive.cn" target="_blank">
    <img
      width="200"
      src="https://github.com/galaxy-s10/billd-desk/blob/main/readme_img/icon.png"
    />
  </a>
</p>

<h1 align="center">
  BilldDesk Pro
</h1>

<p align="center">
  跨平台远程桌面控制，实现了类似 ToDesk/向日葵等远程软件的功能。
</p>

## 实测

- [x] 支持2K + 60 Fps
  - [x] 被控端：系统：Windows 10，显卡：NVIDIA GeForce RTX 3060 Laptop
  - [x] 主控端：Chrome浏览器/BilldDesk客户端
- [x] 支持2K + 120 Fps
  - [x] 被控端：系统：Windows 11，显卡：NVIDIA GeForce RTX 5070
  - [x] 主控端：Chrome浏览器/BilldDesk客户端
- [x] 支持1080P + 60 Fps
  - [x] 被控端：系统：Windows 10，显卡：NVIDIA GeForce RTX 2070 Laptop
  - [x] 主控端：Chrome浏览器/BilldDesk客户端
- [x] 支持1080P + 60 Fps
  - [x] 被控端：系统：Windows 10，显卡：NVIDIA GeForce GTX 1060 6G
  - [x] 主控端：Chrome浏览器/BilldDesk客户端

## 功能

- [x] `web网页` 控制 `电脑端`
- [x] `web网页` 控制 `安卓端`
- [x] `web网页` 控制 `web网页`（仅观看）
- [x] `电脑端` 控制 `电脑端`
- [x] `电脑端` 控制 `安卓端`
- [x] `电脑端` 控制 `web网页`（仅观看）
- [x] `安卓端` 控制 `电脑端`
- [x] `安卓端` 控制 `安卓端`
- [x] `安卓端` 控制 `web网页`（仅观看）
- [x] 硬件加速
  - [x] 开启/关闭编码硬件加速
  - [x] 开启/关闭解码硬件加速
  - [x] 开启/关闭零拷贝
  - [x] NVIDIA显卡（H264/H265/AV1），显卡驱动需要570.0+版本
  - [x] AMD显卡（H264/H265/AV1）
- [x] 主流编解码协议
  - [x] H264/H265
  - [x] AV1
  - [x] VP8/VP9
- [x] 驱动级键鼠（避免游戏风控）
- [x] 鼠标模式
  - [x] 使用主控端鼠标
  - [x] 使用被控端鼠标（fps游戏）
  - [x] 智能鼠标
- [x] 屏幕墙
  - [x] 支持Windows/macOS/Android
  - [x] 支持单控
  - [x] 支持群控
- [x] 多台设备同时远程一台设备
- [x] 一台设备同时远程多台设备
- [x] 多屏操作
- [x] 连接鉴权
- [x] 自定义设备码/连接密码
- [x] 自定义中继服务器
- [x] 自定义接口（wss、api）
- [x] 码率/帧率/画质调整
- [x] 按键映射
- [x] 剪贴板同步
- [x] 分辨率同步
- [x] 文件传输
  - [x] 主控->被控
  - [x] 主控<-被控
- [x] 文字互动
- [x] 本机被控结束后锁屏
- [x] 仅允许同账号远程
- [x] 远程开机（WOL）
- [x] 远程更新客户端版本（Windows）
- [x] 系统托盘
- [x] 开机自启（无人值守）
- [x] 进程保活（windows）
- [x] 在线更新/主控端远程更新被控端（windows）
- [x] 帧率模式
  - [x] 根据画面变化，智能降帧率，优化带宽占用
- [x] 网络模式
  - [x] 默认
  - [x] 低延迟
- [x] 快捷键/常用操作
  - [x] Ctrl+Alt+Del
  - [x] 显示桌面
  - [x] 打开设置
  - [x] 任务视图
  - [x] 任务管理器
  - [x] 资源管理器
  - [x] 重启
  - [x] 关机
  - [x] 注销
  - [x] 锁定
- [x] 批量群控
- [x] 隐私屏
  - [x] 自定义隐私屏图片
  - [x] 自定义隐私屏文字
- [x] 虚拟屏
- [x] 扩展屏
- [x] 设备分组
- [x] 后台管理
- [x] 私有化部署
- [ ] Docker一键部署

## 对比ToDesk

> 作者使用过很多远程软件：TeamViewer、向日葵、ToTesk、AnyDesk、RustDesk、UU远程、连连控，还有qq自带的远程协助等等，但用ToDesk比较多，因此用ToTesk和BilldDesk作对比~

|                                        | BilldDesk    | BilldDesk Pro                                     | ToDesk                                                 |
| -------------------------------------- | ------------ | ------------------------------------------------- | ------------------------------------------------------ |
| 连接限制                               | 无限制，免费 | 无限制，免费                                      | 80h/月，200次/月，24h/次，超出需要购买专业版（¥24/月） |
| 画质限制                               | 无限制，免费 | 限制1080p，免费                                   | 限制1080p，免费                                        |
| 帧率限制                               | 无限制，免费 | 限制30帧，免费                                    | 限制30帧，免费                                         |
| 安卓被控                               | 不支持       | 支持，免费                                        | 支持，需要购买专业版（¥24/月）或购买插件（¥15/月）     |
| 自定义设备码                           | 支持，免费   | 支持，免费                                        | 不支持                                                 |
| 设备分组管理                           | 支持，免费   | 支持，免费                                        | 支持，免费                                             |
| 开机自启/无人值守                      | 不支持       | 支持，免费                                        | 支持，免费                                             |
| 隐私屏                                 | 不支持       | 支持，免费                                        | 支持，需要购买专业版（¥24/月）                         |
| 虚拟屏                                 | 不支持       | 支持，免费                                        | 支持，需要购买性能版（¥95/月）                         |
| 远程时录屏                             | 不支持       | 支持，免费                                        | 不支持                                                 |
| 屏幕墙                                 | 不支持       | 支持，阶梯收费                                    | 支持，需要购买技术版（¥218/月）                        |
| 批量群控                               | 不支持       | 支持，屏幕墙自带                                  | 不支持                                                 |
| web网页发起远程控制                    | 支持，免费   | 支持，免费                                        | 支持，需要购买专业版（¥24/月）                         |
| 后台管理                               | 不支持       | 支持，免费                                        | 支持，免费                                             |
| 远程控制web网页（仅观看）              | 支持，免费   | 支持，免费                                        | 不支持                                                 |
| 通道数限制（同账号多主控同时发起远控） | 无限制，免费 | 无限制，免费                                      | 限制1个，增加需要购买插件（¥233/月）                   |
| 私有化部署/二次开发                    | 支持，免费   | 支持，[订阅源码](https://desk.hsslive.cn/#/price) | 支持，需要ToDesk企业版，定价未知                       |

## 跨平台支持

- [x] Windows 系统
  - [x] Windows 10、Windows 11
  - [x] Windows Server 2022
  - [x] Windows Server 2019
  - [ ] Windows 7 不支持
  - [ ] 其他版本未实际测试
- [x] macOS 系统
  - [x] macOS 15
  - [ ] 其他版本未实际测试
- [x] Android系统
  - [x] Android 8 至 Android 16
  - [x] Android 7，被控时支持观看，暂不支持操作
  - [ ] ~~Android 6，不再支持安卓6~~
  - [ ] 其他版本未实际测试
- [x] Web浏览器（[Chrome](https://www.google.com/intl/zh-CN/chrome/)、[Edge](https://www.microsoft.com/zh-cn/edge/download)、[Firefox](https://www.firefox.com/zh-CN/)、[Via](https://viayoo.com)、[Safari](https://www.apple.com/safari/)）
- [ ] iOS系统
- [ ] Linux 系统

## 技术架构

框架/第三方库：

- Flutter
- Vue
- Koa2
- ...

编程语言：

- JavaScript/Typescript
- Dart
- Kotlin
- C++
- Swift
- ...

Api：

- WebRTC
- Win32
- Cocoa
- AccessibilityService
- ...

## 客户端下载

[https://desk.hsslive.cn/#/download](https://desk.hsslive.cn/#/download)

## 预览

快速体验：[https://desk.hsslive.cn](https://desk.hsslive.cn)

### web网页/电脑端控制电脑端



### web网页/电脑端控制安卓端



### web网页/电脑端控制web网页

> 仅观看模式



### web网页移动端

> 首页



> 控制页



### 屏幕墙



### 批量群控



### 设备分组



### 隐私屏

> 支持自定义隐私屏（图片、文字）



### 虚拟屏



### 鼠标、键盘仿真



### 安卓端控制电脑端【TODO】

### 安卓端控制安卓端【TODO】

### 安卓端控制web网页【TODO】

> 仅观看模式

### 文件传输



### 跨平台支持



### [后台] 控制台



### [后台] 黑名单



### [后台] 设备分组



### [后台] 远程管理

- 远程记录



- 在线远程



- 在线设备



## BilldDesk Pro免费吗？

- **免费**，你可以直接下载BilldDesk客户端，开始流畅的远程体验。
- 有付费功能（隐私屏、虚拟屏、屏幕墙、高码率/帧率/画质），如果你经常使用到BilldDesk，推荐你购买任意VIP套餐（包月6元/月、包年4.2元/月）。

## 常见问题

[https://desk.hsslive.cn/#/faq](https://desk.hsslive.cn/#/faq)

## 问题反馈

欢迎提 [issue](https://github.com/galaxy-s10/billd-desk/issues)

## 联系作者

[https://desk.hsslive.cn/#/hi](https://desk.hsslive.cn/#/hi)

## BilldDesk Pro源码

- BilldDesk开源：[源码](./README_OpenSource.md)
- BilldDesk Pro不开源，源码需要购买：[https://desk.hsslive.cn/#/price](https://desk.hsslive.cn/#/price)

---

### Doc Start Client (`doc/start-client.md`)

## billd-desk(pro)

## 安装依赖

> 使用 node 版本：v18.19.0，建议18版本
> 使用 pnpm 版本：9.1.3，建议9版本

```bash
pnpm i
```

> 更新 billd 相关依赖：

```bash
pnpm i billd-deploy@latest billd-utils@latest billd-scss@latest billd-html-webpack-plugin@latest
```

## 运行

> 配置文件：**`src/spec-config.ts`**，请在该文件填写对应的信息。

```bash
npm run dev
```

## 打包

> 打包时会先使用[`standard-version`](https://github.com/conventional-changelog/standard-version#readme)进行发版，请确保当前项目初始化了 git，否则打包会失败。

- web

> 打包成功后，资源输出在`dist`目录

```bash
npm run build:web
```

- windows、macos、linux 包

> 打包成功后，资源输出在`electron-release`目录

```bash
npm run build
```

- windows 包

> 打包成功后，资源输出在`electron-release`目录

```bash
npm run build:win
```

- macos 包

> 打包成功后，资源输出在`electron-release`目录

```bash
npm run build:mac
```

- linux 包

> 打包成功后，资源输出在`electron-release`目录

```bash
npm run build:linux
```

---

### Doc 交流群（开发） (`doc/交流群（开发）.md`)

## BilldDesk 开发交流群（beta）

1. 建群目的：
   1. 设置 1%的门槛，就能筛选 99%的无关开发者。
   2. 从中筛选具有参与 BilldDesk 开发能力的开发者。
2. 进群费用：200 元/人，交流 BilldDesk 最新进展以及相关技术。
3. BilldDesk 是一个跨平台的项目，涉及到的技术非常广泛，如果你希望从该项目学到什么，欢迎进群。
4. 注意，进群了并不代表作者一定会解决你提出的问题，作者大多数情况下会给你一个方向。

---

### Doc 交流群（用户） (`doc/交流群（用户）.md`)

## BilldDesk 用户交流群

1. ~~官方交流群的用户数量不小（目前群人数累计 1000 人），作者一人精力有限，鼓励用户自行建群~~。
2. ~~后续有开发者加入的话，会新增官方交流群。~~
3. ~~BilldDesk 还很小，等 BilldDesk 足够壮大了，再重新开放官方交流群。~~
4. 先填写问卷：[https://hcnb6r23b8d2.feishu.cn/share/base/form/shrcnlM40x0sVpK2HANrlkMQT9d](https://hcnb6r23b8d2.feishu.cn/share/base/form/shrcnlM40x0sVpK2HANrlkMQT9d)，
5. 填完再添加微信`shuisheng9905`
6. 必须备注：`已填问卷，加BilldDesk微信群`
7. **请大家诚信，如发现备注了但没填问卷（目前已发现多个案例），将踢出官方群，并永久拉黑**

---

### Doc 关于开源 (`doc/关于开源.md`)

## ❤️ 开源

- 愿大家不忘初心，砥砺前行。

## TLDR

- https://nutjs.dev/blog/money
- https://nutjs.dev/blog/i-give-up

---

### Doc 常见问题 (`doc/常见问题.md`)

## windows 环境，安装后打不开/打开闪退

1. 安装.net 运行时：https://dotnet.microsoft.com/zh-cn/download/dotnet-framework/thank-you/net481-web-installer
2. 安装 c++运行时：https://aka.ms/vs/17/release/vc_redist.x64.exe

## mac 环境，安装提示已损坏，无法打开

解决办法：https://zhuanlan.zhihu.com/p/135948430

## ⚠️ 你永远满足不了所有人

1. 每个用户都希望方便自己，下载客户端时，作者总不能在百度网盘、迅雷云盘、夸克网盘，123 云盘等等各大盘都上传一遍。
2. 目前 BilldDesk 从未发布 1.0 稳定版，而这对于某些开发者来说，他们只会开骂（可以去 issue 查看），这里作者建议骂之前先看下这篇文章：[前端之被包养就不要谈独立人格](https://www.hsslive.cn/article/139)。

---

### Doc 思路 (`doc/思路.md`)

- 客户端打开后，判断缓存有无uid

  - 有uid和token，验证uid和token，连接Websocket
  - 没有uid和token，调接口获取uid

- 打开客户端，ws连接，join的时候，带上desk_user_id，在redis里添加一个记录desk_user_uuid，设置他的过期时间为10秒
- 设置心跳为5秒一次，每次心跳都更新desk_user_uuid的过期时间
- 给desk_user_uuid添加过期订阅，过期的时候判断为远程连接断开
- 发起远程连接的时候，发送billdDeskStartRemote，带上desk信息

- 锁屏的时候

  - websocket是否会断开
    - 会断开。
  - webrtc是否会断开
    - 会断开。

- 主动断开远程连接如何判定？

---

### Doc 性能测试 (`doc/性能测试.md`)

# 远程端延迟性能测试报告

## 1. 测试目的
主要测试各个端远程时的延迟，评估系统在不同网络环境和终端下的响应速度，为优化用户体验和系统架构提供数据支持。

## 2. 测试环境
- **测试端类型**：PC端、移动端、Web端等
- **网络环境**：
  - 局域网（LAN）
  - 广域网（WAN）
  - 4G/5G移动网络
- **服务器部署位置**：本地/云端
- **测试工具**：ping、traceroute、专业延迟测试工具（如iperf、WebPageTest等）
- **时间**：202X年X月X日

## 3. 测试方法
1. **准备工作**：
   - 确认各端设备已连接至指定网络
   - 记录设备型号、操作系统、浏览器/客户端版本
2. **测试流程**：
   - 使用ping命令测试端到服务器的基础网络延迟
   - 通过应用实际操作（如页面加载、远程桌面、文件传输等）记录端到端响应时间
   - 每种场景下重复测试不少于5次，取平均值
3. **数据记录**：
   - 记录每次测试的延迟(ms)
   - 标注异常情况（如丢包、超时等）

## 4. 测试结果
| 端类型 | 网络环境 | 平均延迟(ms) | 最小值(ms) | 最大值(ms) | 备注 |
|--------|----------|--------------|------------|------------|------|
| PC端   | 局域网   |              |            |            |      |
| PC端   | 广域网   |              |            |            |      |
| 移动端 | 4G       |              |            |            |      |
| Web端  | 5G       |              |            |            |      |
| ...    | ...      |              |            |            |      |

> 请根据实际测试补充数据

## 5. 结论与建议
- **结论**：
  - 各端在局域网下延迟最低，广域网和移动网络下延迟有所增加。
  - 某些端或网络环境下存在偶发高延迟或丢包现象。
- **优化建议**：
  - 优化服务器部署位置，靠近主要用户群体
  - 针对高延迟场景优化数据传输协议
  - 增强网络异常处理能力，提升用户体验

---
如需详细原始数据或测试脚本，请联系测试负责人。

---

### Doc 技术架构 (`doc/技术架构.md`)

## 框架/第三方库

- Electron
- Flutter
- Vue
- Node
- ...

## 编程语言

- JavaScript/Typescript
- Dart
- Kotlin
- C++
- Swift
- ...

## Api

- WebRTC
- Win32
- Cocoa
- AccessibilityService
- ...

---

### Doc 本地环境 (`doc/本地环境.md`)

## docker 安装 mysql

### 拉镜像

```bash
docker pull mysql:8.0
```

### 复制配置文件到本地

先查看配置文件位置：

```bash
docker run --rm mysql:8.0 mysql --help | grep my.cnf
```

查看配置文件位置结果：

```bash
➜  billd-desk-server git:(master) ✗ docker run --rm mysql:8.0 mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
➜  billd-desk-server git:(master) ✗
```

意思是按照/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 路径按优先排序。

```bash
➜  billd-desk-server git:(master) ✗ docker run --rm mysql cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
省略...
➜  billd-desk-server git:(master) ✗
```

可以得到镜像中 mysql 配置文件路径为：/etc/my.cnf

创建一个临时的容器，在它里面复制配置文件到本地：

> 注意，本地需要存在/Users/huangshuisheng/Desktop/docker/mysql/conf 这个目录

本地复制时用这个命令：

```bash
LOCAL_DOCKER_MYSQL_PATH=/Users/huangshuisheng/Desktop/docker/mysql \
DOCKER_MYSQL_TMP=`docker run -d mysql:8.0` \
&& docker cp $DOCKER_MYSQL_TMP:/etc/my.cnf $LOCAL_DOCKER_MYSQL_PATH/conf \
&& docker stop $DOCKER_MYSQL_TMP \
&& docker rm $DOCKER_MYSQL_TMP
```

### 启动容器

```bash
# 使用自定义 MySQL 配置文件
# billd-desk-mysql是docker容器名，/Users/huangshuisheng/Desktop/docker/mysql是映射到本机的mysql，123456是密码

LOCAL_DOCKER_MYSQL_PATH=/Users/huangshuisheng/Desktop/docker/mysql \
&& docker run -d \
-p 3306:3306 \
--name billd-desk-mysql \
-e MYSQL_ROOT_PASSWORD=mysql123. \
-v $LOCAL_DOCKER_MYSQL_PATH/conf/my.cnf:/etc/my.cnf \
-v $LOCAL_DOCKER_MYSQL_PATH/data:/var/lib/mysql/ \
mysql:8.0
```

## docker 安装 redis

### 拉镜像

```bash
docker pull redis:7.0
```

### 复制配置文件到本地

> https://raw.githubusercontent.com/redis/redis/7.0/redis.conf

在/Users/huangshuisheng/Desktop/docker/redis/新建 conf 目录
在/Users/huangshuisheng/Desktop/docker/redis/新建 data 目录

将项目根目录的/docker/redis/conf/redis.conf 和 users.acl 复制到/Users/huangshuisheng/Desktop/docker/redis/conf

### 本地启动容器

```bash
# 使用自定义 redis 配置文件
# billd-desk-redis是docker容器名，/Users/huangshuisheng/Desktop/docker/redis是映射到本机的redis

LOCAL_DOCKER_RESIS_PATH=/Users/huangshuisheng/Desktop/docker/redis \
&& docker run -d \
-p 6379:6379 \
--name billd-desk-redis \
-v $LOCAL_DOCKER_RESIS_PATH/data:/data \
-v $LOCAL_DOCKER_RESIS_PATH/conf/redis.conf:/etc/redis/redis.conf \
-v $LOCAL_DOCKER_RESIS_PATH/conf/users.acl:/etc/redis/users.acl \
redis:7.0 redis-server /etc/redis/redis.conf
```

## docker 安装 coturn

> 本地环境时，不需要用 coturn

### 拉镜像

```bash
docker pull coturn/coturn
```

### 启动容器

```bash
LOCAL_DOCKER_COTURN_PATH=/Users/huangshuisheng/Desktop/docker/coturn \
&& docker run -d --network=host  \
--name billd-desk-coturn \
-v $LOCAL_DOCKER_COTURN_PATH/coturn.conf:/my/coturn.conf \
coturn/coturn -c /my/coturn.conf
```

---

### Doc 流程 (`doc/流程.md`)

# 一对一远程

没什么好说的

# 多对一远程

> 多个用户同时控制一个客户端
> 被控端都有自己的房间（唯一）

- 开始远程控制
  - 控制端，用户点击连接，发送billdDeskStartRemote消息，开始远程控制。
  - 被控端，监听billdDeskStartRemote消息，收到billdDeskStartRemote消息后，判断stream
    - 没有stream，调原生接口获取stream
    - 有stream，开始updateWebRtcRemoteDeskConfig，开始走webrtc流程（offer、answer等）
- 操作问题，所有进入远程控制的用户都可以进行操作（或者可以加个限制或者切换，一种是控制模式，另一种是观看模式）。
- 结束远程控制，用户结束远程控制。
  - 一对多，断开一个不能影响其他连接
  - 被控端判断有没有用户连接，只有当所有用户都断开连接的时候，才显示已断开远程连接。

# 实际

- a用户远程客户端
- 客户端收到a用户的远程请求，获取stream，然后和a用户进行webrtc处理
- b用户远程客户端
- 客户端收到b用户的远程请求，获取stream，然后和a用户进行webrtc处理

---

### Doc 设计资源 (`doc/设计资源.md`)

# 图标

## iconfont

阿里云官网：https://www.iconfont.cn/collections/detail?cid=16472

---

### Doc 项目代码 (`doc/项目代码.md`)

## 项目代码

1. BilldDesk 从未发布 1.0 稳定版，因此不建议开发者使用，当然了，你仍然可以从 github commit 获取。

## 参与 BilldDesk 开发

能量是守恒的。作者自认为不聪明，但执行力 100%，BilldDesk 整个项目都是经过不断的试错得到的结果。要想参与 BilldDesk 开发，必须满足下面条件之一：

1. 你让我觉得你对 BilldDesk 的开发有实际帮助（1+1=2）。
2. 你让我觉得你对 BilldDesk 的开发有非常多帮助（1+1>2）。
3. 你使用钞能力（1+1<2）：[https://desk.hsslive.cn/#/price](https://desk.hsslive.cn/#/price)

---

--- METRICS ---
- Files Extracted: 13
- Estimated Token Budget: ~3722 tokens
- Canonical Reference: https://codewiki.google/github.com/galaxy-s10/billd-desk
