跟着思兼学习Klipper(14) 卷起来了,手机与Klipper的四次结缘
## 跟着思兼学习Klipper(14) 卷起来了,手机与Klipper## 前言
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正交流。注意本文不是新手教程,仅做个人记录所用。
文章如有更新请访问 (https://mc.dfrobot.com.cn/thread-312807-1-1.html?fromuid=725344)。
欢迎对 Klipper 固件感兴趣,以及对改版 CNC 加工的 Voron 三叉戟、v0、v2.4 感兴趣的朋友加群交流(QQ Group:490111638)
【2022年7月28日 更新】Octo4a 是支持 STM32 虚拟串口打印机的
不得不说国内的Klipper上位机真是啥都有,树莓派,各种派,电视盒子,手机,x86电脑,虚拟机。
这段时间有在手机上运行 KlipperScreen 作为 Klipper 固件彩色触摸屏的实践,后来网友各种骚操作层出不穷。最初是在手机上使用 KlipperScreen 通过安装 `XServer XSDL`实现,后来经过网友 `摸摸头` 的不懈探索工作,成功在 红米2 手机上运行原生主线内核 Linux,再到如今,百花齐放,虽然个人以为折腾意义大于实际意义,不过仍然值得记录如下。
本文介绍 1 种手机作为 KlipperScreen 显示触摸屏的方案和 3 种手机作为 Klipper上位机的方案。
* Xserver XSDL
* Redmi_2 with Mobian Linux
* Android Mobilephone with Termux/Aidlux
* Android Mobilephone with Octo4a
## 1、XServer XSDL (显示触摸方案)
具体可以参考教程:(https://github.com/naruhaxor/AndroidKlipperScreen),以及十分推荐 [路特皮卡实验室](https://space.bilibili.com/453385733) 的独立视频教程 [如何使用安卓手机做KlipperScreen](https://www.bilibili.com/video/BV1V44y1n7Q4)。
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204091200310.png)
**原理:**
**X窗口系统**(**X Window System**,也常称为 **X11** 或 **X** )是 Linux 系统上常见的一种以位图方式显示的软件窗口系统)。Client 传输图形数据到 Server 上,与 Windows 不同,Server 和 Client 可以不在同一台设备上,用过 Xshell/MobaXterm 的 X 转发(X-Forward)功能的朋友应该都不陌生,这里不再赘述。
![](http://x11.gweb.info/X_Client_Server.gif)
【Fig 1】X-客户端与 X-服务端,Source:(http://x11.gweb.info/x11_0104_technology.html)
这里的原理就是在安卓手机上安装一个 X-Server 软件 XSDL,然后通过 adb 将 KlipperScreen 的图像显示到手机上,从而实现有线/无线触摸屏的功能,这在我之前的视频 [花式KlipperScreen玩法](https://www.bilibili.com/video/BV1pf4y1F7gK) 里有展示。
## 2、手机安装原生主线内核 Linux
**本方案的最大问题是挑机子,不通用。**
这个是最彻底的方法,感谢网友 `摸摸头`的探索工作。此方法适合硬核用户,原生 Linux 体验,缺点是挑机子,特定机型才能用。
**原理:**
在手机上安装完整的 Linux 系统,继而安装 Klipper + Moonraker + KlipperScreen + Fluidd(Optional),甚至可以通过 USB-OTG 接口连接下位机主板,算是 All-in-One 的方案。
## 2.1 安装 Linux 操作系统
Android 操作系统虽然基于 Linux,但是做了很多改动,缺少一些内容,无法获得完整的 Linux 操作体验,所以便有了一些适用于手机的操作系统,例如 Ubuntu Touch((https://ubports.com/zh_CN/))、(https://mobian-project.org/)、(https://postmarketos.org/) 等,但是由于 Android 手机型号众多,有很多专有硬件驱动,甚至不提供 Linux 内核源码,导致并不是所有设备都能良好支持。
### 2.1.1 操作系统选择
目前完成度比较好的为 PostmarketOS(以下简称 pos),其基于 `Alpine Linux`,而 Klipper 的安装脚本目前还不支持该系统,所以我们把目光转向 Mobian,其基于 `Debian`,用起来更加得心应手,同时使用 pos 的主线内核。
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204091248236.png)
### 2.1.2 手机设备选择
查看 (https://wiki.postmarketos.org/wiki/Devices)页面可以看到设备的支持情况,其中 (https://wiki.postmarketos.org/wiki/Xiaomi_Redmi_2_(xiaomi-wt88047)) 脱颖而出,除了目前基本都暂时无法驱动的摄像头外,都可以驱动。同时由于红米手机价格便宜,市场保有量大,所以闲鱼市场50~80就可以收到。这里说两个问题:
#### 为什么红米2支持这么好
最初关注 pos 的时候,最好的支持设备时诺基亚 N900,原因是其默认系统 `Maemo 5` 就基于 Linux,加上有侧滑键盘,所以是一个极佳的 Hacker Device。不过性能还是有些不足。
后来 ARROW 发布了一款 96boards 开发板 (https://wiki.postmarketos.org/wiki/Qualcomm_Snapdragon_410/412_(MSM8916)),基于 Qualcomm Snapdragon 410 处理器,受到高通和 Linaro 基金会的良好软件支持,所以一众使用 410/410c (MSM8916) 处理器的设备都坐上了飞机,红米2就是其中之一。
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204091452366.png)
【Fig 2】DragonBoard 410c 开发板,板载 GPS,是高通为数不多的不需要签署保密协议且价格低廉的开发板。
#### 购买什么型号的红米2
红米2型号众多,电信版、移动版,还有使用联发科处理器的红米2A,移动增强版2A,具体从microUSB接口打开后盖,查看手机电池下面的背板编号,图中所示为2014812:
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204091505977.png)
请确认购买的手机背码位以上。
1. 确认**手机背码**在下方列表内,有条件购买 wt88047:
*`2014811, 2014812, 2014817 2014818, 2014819, 2014821` 代表 `wt88047`
*`2014813`以及`2014112` 代表 `wt86047`
2. 建议购买配置为 2G 内存,16G 存储的**高配版**
3. 购买前确认手机 `IMEI` 码和背面**一致**,可以在拨号界面输入 `*#06#` 查看,以免买到组装机
4. 确认为**原装显示触摸屏**,目前测试发现非原装显示触摸屏刷入 Mobian 后触摸有问题无法使用
以上都是我真实遇到的,由此可见还是比较挑机子的。
### 2.1.3 烧录前准备
需要原来的系统版本为 5.x,因为要用到它的一些固件(firmware),如果手机系统是 Android 4.x 可以从这里下载 MIUI 5.1 官方系统进行升级:
* [红米 2 (wt88047) 国行版](https://xiaomirom.com/rom/redmi-2-redmi-2-pro-wt88047-china-fastboot-recovery-rom/) | 下载 [红米 2 开发版/内测版 Fastboot 线刷包 5.1](https://bigota.d.miui.com/7.11.16/wt88047_images_7.11.16_20171116.0000.00_4.4_cn_89f244a90d.tgz)
* [红米 2/2A (wt86047) 国行版](https://xiaomirom.com/rom/redmi-2-redmi-2-pro-wt86047-china-fastboot-recovery-rom/) |
使用 [小米刷机工具](https://xiaomirom.com/download-xiaomi-flash-tool-miflash) 或者 fastboot 进行烧录即可。
也可以烧录 (https://wiki.lineageos.org/devices/wt88047/),具体借助 TWRP Recovery,教程见此处:(https://wiki.lineageos.org/devices/wt88047/install) 。经常刷机的朋友轻车熟路了。
还可以参考 (https://wiki.postmarketos.org/wiki/Xiaomi_Redmi_2_(xiaomi-wt88047))。
### 2.1.4 烧录 Mobian Linux
教程可以参考 [红米2刷 Debian 系统](https://www.ruanx.net/redmi2-to-debian/amp/),预编译的系统镜像可以从 (https://github.com/Project-DragonPi/mobian-wt88047) 项目页面右侧 `release` 处下载。
1.进入手机原厂的 fastboot 模式(音量下+电源键),然后刷入lk2nd
```shell
fastboot flash:raw boot lk2nd.img
fastboot reboot
```
2. 在 lk2nd 界面中刷入 debian 的内核和文件系统
```
fastboot flash boot boot.img
fastboot erase userdata
fastboot flash userdata userdata.img
fastboot reboot
```
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204091612515.png)
【Fig 3】Mobian 的 **Phosh** 用户界面
* 默认用户名密码为 `mobian` `1234`,默认启用 SSH
* lk2nd 可以下载 [最新版](https://github.com/msm8916-mainline/lk2nd) 使用。选择 (https://github.com/msm8916-mainline/lk2nd/releases/download/0.12.0/lk2nd-msm8916.img) 即可。
* 最新版的内核可以移步 (https://github.com/msm8916-mainline/linux) 下载编译(5.15)
* MIUI 官方内核可以移步 (https://github.com/MiCode/Xiaomi_Kernel_OpenSource) 查看下载(3.x)
## 2.2 安装 Klipper 全家桶
注意 KlipperScreen 使用 X11 显示,Phosh 使用 Wayland 显示,所以我们要卸载 Phosh,并需要安装触摸驱动程序
```shell
## 1. 此镜像 mobian.list 源有问题,需要修改 unstable 为 bullseye,否则升级后声音会失效。
sudo sed -i 's/unstable/bullseye/g' /etc/apt/sources.list.d/mobian.list
## 2. 常规设置 Pypi 镜像加速
mkdir -p $HOME/.config/pip && sudo remove /etc/pip/pip.conf
cat << _EOF_ > $HOME/.config/pip/pip.conf
index-url=https://pypi.tuna.tsinghua.edu.cn/simple
# extra-index-url=https://www.piwheels.org/simple
timeout = 600
_EOF_
## 3. 设置 github 镜像加速
git config --global url."https://hub.fastgit.xyz/".insteadOf "https://github.com/"
# git config --global --unset url.https://hub.fastgit.xyz/.insteadof # 取消镜像
## 4. 以下略,请查看 Gemini 的设置文章
... 假装已经安装好 Klipper + Moonraker ...
```
## 2.3 安装 KlipperScreen
各单位注意,这个 KScreen 是基于 Raspberrypi OS 开发的,所以在其他操作系统上会出现依赖包没装全的问题。此外新版做了些优化同时引入了新的问题。
```shell
# 修改 scripts\KlipperScreen-install.sh,补充软件依赖
PKGLIST="${PKGLIST} xserver-xorg-legacy xserver-xorg-video-fbdev python3-pip fonts-wqy-zenhei librsvg2-common"
# bullseye 以上的 Armbian 有 xserver-xorg-video-fbturbo 包,buster 即使编译也不能用,如果软件源中没有此包则删除。
# 安装触摸驱动,由于 Wayland 自带 libinput,所以更换 X11 之后需要手动安装才能使用。
PKGLIST="${PKGLIST} xserver-xorg-input-libinput"
```
新版采用 `get-pip.py` 脚本安装pip,但是改地址有时候网络超时导致安装失败,换回老办法得了:
```diff
if [ ! -d ${KSENV} ]; then
- GET_PIP="${HOME}/get-pip.py"
- virtualenv --no-pip -p /usr/bin/python3 ${KSENV}
+ virtualenv -p /usr/bin/python3 ${KSENV}
- curl https://bootstrap.pypa.io/pip/3.6/get-pip.py -o ${GET_PIP}
- ${KSENV}/bin/python ${GET_PIP}
- rm ${GET_PIP}
fi
```
有的发行版缺少 `/etc/X11/Xwrapper.config` 文件,直接创建一个( [参考](https://github.com/jordanruthe/KlipperScreen/issues/2) )。
```shell
cat << _EOF_ > /tmp/Xwrapper.config`
needs_root_rights=yes
allowed_users=anybody
_EOF_
sudo mv /tmp/Xwrapper.config /etc/X11/Xwrapper.config
```
### 2.3.1 解决横屏显示及触摸校准问题
很多人卡在这里了,虽然竖着也能用,实际上了解 X11 的应该会想到修改 xorg.conf。其实官方文档有示例 (https://wiki.postmarketos.org/wiki/Display):
```shell
# 创建 /etc/X11/xorg.conf.d/00-fbdev-rotate.conf
sudo su
cat << _EOF_ > /etc/X11/xorg.conf.d/00-fbdev-rotate.conf
Section "Device"
Identifier "LCD"
Driver "fbdev"
Option "Rotate" "CW"
EndSection
_EOF_
```
同时修改触摸屏幕的对应矩阵:
```shell
# 查看连接到系统的输入设备,测试可知 generic ft5x06 (51) 为触摸屏
DISPLAY=:0 xinput --list
# 创建输入设备校准文件
# 实测 [屏幕 CW] 对应 [触摸 -270°]
cat << _EOF_ > /etc/udev/rules.d/98-touchscreen-cal.rules
ATTRS{name}=="generic ft5x06 (51)", ENV{LIBINPUT_CALIBRATION_MATRIX}="0 1 0 -1 0 1"
```
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204091737302.png)
### 2.3.2 杂项
安装 KScreen 之后无法关闭屏幕以及显示电量,可以写个宏借助 `shell_cmd` 组件输出到控制台,之前介绍过。
```shell
# 开关屏幕显示:
export DISPLAY=:0.0
xset dpms force off|on
# 显示电池电量,根据实际替换 ${BATTERY}
cat /sys/class/power_supply/${BATTERY}/capacity
```
设置显示中文:
```shell
# 安装中文字体文泉驿-正黑,此字体支持点阵显示,启用后更锐利
sudo apt install fonts-wqy-zenhei
# 设置系统时区
sudo timedatectl set-timezone Asia/Shanghai
# 生成并设置系统 locale,这段我不记得了,自己测试。Armbian 等可以直接设置。
# edit /etc/locale.gen,取消注释 zh_CN.UTF-8
locale-gen
sudo localectl set-locale LANG=zh_CN.UTF-8
# 修改 KScreen 配置文件或者从界面内选择中文显示即可。重启 KScreen 生效
sudo systemctl restart KlipperScreen
```
以上应该就可以了。其默认会读取以下三个地方的配置文件,根据情况修改即可。
1. *~/KlipperScreen.conf*
2. *${KlipperScreen_Directory}/KlipperScreen.conf*
3. *~/klipper_config/KlipperScreen.conf*
## 2.4 供电问题【重要】
现状:
* microUSB 接口的手机,此接口不支持同时充电 + OTG连接主板功能,即使购买 `Y 一分二 OTG线`,也似乎只能选择充电或者给下位机供电,导致使用电池时可能一个模型没打完就没电了
* TypeC 接口的手机,似乎支持同时 充电 + OTG功能,但是问题是长时间给电池充电会可能会导致电池鼓包、寿命下降并且有潜在风险,虽然通过改变充电策略,可以降低但无法消除此问题
目前比较好的方案就是使用假电池,改 DC 直供,手机需要检测电池信号,不能只接正负极。借鉴 `fix-猫` 的方案:
> 要拆了电池 拿出电池保护板,然后买一个dc-dc板子2元的,dcdc输入直接接usb的5v 和gnd 然后调电位器让他输出4.2V
> 4.2V调好了 直接把输出 代替电芯 焊接在电池保护板上,然后电池保护板那个塑料套回去保护板就转上去 滴上502即可。
> 或者打热熔胶,dcdc一并热熔胶弄在电池仓
其他想到再补充吧。
## 3、Termux + Klipper 全家桶
也就是网友 (https://space.bilibili.com/10231423) 的方案,感谢作者提供的新思路。
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204091829636.png)
Termux 是 一个运行在安卓系统上的终端模拟器和 Linux 运行环境(Terminal emulator and Linux environment for Android),共享宿主机内核空间,有些类似于 (https://www.cygwin.com/) 和 容器?我也没研究过,感觉可以这样理解。类似的还有国内的 (https://www.aidlux.com),值得一试。
还有一个 (https://github.com/meefik/linuxdeploy) 则是相当于 Android 虚拟机方案:
> The application creates a disk image or a directory on a flash card or uses a partition or RAM, mounts it and installs an OS distribution.
开发停滞,而且性能会差一些。
### 问题
1. 视频中最大的难点在于默认没识别串口模块,从而尝试去重新编译内核。
2. **其实 Termux 默认支持访问 USB串口模块,不需要 root,不需要重新编译内核。** 这样安装难度大大降低,极大提升安装体验和拓展了设备支持。
3. 看视频中手机摄像头帧率很低,不知道有没有启用 GPU 加速,Termux 支持吗? AidLux好像支持,IP Cam 是否效果更好?
以上,有空测试一下。
## 4、Octo4a + Klipper
**本方案的最大问题就是安装下载环境时需要挂代理加速。**
相信很多人都听说过 (https://github.com/feelfreelinux/octo4a) (以下简称 o4a)这个安卓软件,可以在支持 OTG 的老旧手机上安装 OctoPrint 服务器。
![](https://github.do/https://raw.githubusercontent.com/feelfreelinux/octo4a/master/.github/readme-banner.png)
**特点:**
* 傻瓜式操作,避免繁琐的配置
* 通过 USB-OTG 连接下位机主板,直接支持各种 USB 串口模块,**无需 ROOT 权限,无需重新编译内核**
* 支持调用手机内置摄像头,作为监控或者延时摄影
* 内置 SSH 远程访问服务
* 经网友 `Lynx` 的提醒,Octo4a 内置 Klipper 上位机软件的支持
## 4.1 第一回合:
而我们今天就要会一会 octo4a,简记如下
* 首先从项目主页下载 apk 安装到手机,注意你的手机要是 5.x 以上的系统,并且注意 CPU 是32位还是64位,比较新的手机一般是64位。
* 使用 `BifrostV` 这款地图软件,据说也可以使用 `Adguard home`这款软件添加 github host 文件,但是我没成功。
* 开启 VPN 后,打开 octo4a 软件,选择安装(Installation),等一会有可能在第三部安装依赖(Dependency)时因为网络失败导致闪退,但是再次打开 o4a 可以正常开启 OctoPrint 服务。如下图所示开启 SSH 服务并设置密码:
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204091909282.png)
## 4.2 到我登场表演了!
关闭地图软件,下面我们把舞台交给 MobaXterm,根据手机的 IP 地址登录,用户名 `octoprint`,密码就是你设置的那个,端口号 `8022`:
```shell
## 1. Linux环境为 Alpine,使用 apk 进行管理软件包,修改软件源并更新软件列表,不需要添加 sudo
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
apk update
## 2. 参考执行 scripts/里面的三个脚本,分别完成 octo4a/拓展插件/klipper 的安装配置
bash setup-octo4a.sh
apk add python3-dev build-base gcc g++
bash setup-klipper.sh
```
至此,Klipper 插件安装完成,由于没有安装编译链,所以不支持编译固件。同时也不需要 Moonraker API,由 OctoPrint 直接通讯。
## 4.3 配置 OctoPrint 和 Klipper
* 打开 OctoPrint,地址为 `IP:5000`,设置用户名密码后可以登录
* 安装 OctoKlipper 插件,这时候可以开地图软件,其他时候关闭
* 修改 Klipper 的 printer.cfg 文件,其位于 /root 目录,可以使用 `vi` 修改
* 下位机的串口地址填写为 `/dev/ttyOcto4a`,其他依样。
* 重启 octo4a APP,即可以通过 Klipper 连接打印机。
* 打开摄像头服务器即可以使用,闪光灯控制似乎有问题。
写到这有点泄气了,写累了,先把框架搭进去后面扩充吧。
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204092258905.png)
【Fig 】octo4a 自动识别并连接刷好 Klipper 固件的主板,**无需 root,无需重新编译内核**
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204092259383.png)
【Fig 】Klipper Ready!
## 4.4 OctoPrint APP
连接之后,一般的用法就是从网页或者APP登录,手机嘛就安安静静当个摄像头+上位机吧。如果你不甘寂寞,也可以在它上面安装 OctoPrint 的 APP,通过面板进行控制,这里介绍三款:
!(https://cdn.githubjs.cf/sjqlwy/blog_imgs/raw/default/images/202204092301622.png)
【Fig 】从左到右分别为 `OctoRemote`、`Printoid(Lite)` 以及 `OctoApp`,中间那个高级功能动不动就收钱,喜欢简洁用第 3 个,普通用户选择第 1 个。
详细的介绍可以移步文章: (https://all3dp.com/2/octoprint-android-octoremote-simply-explained/)
楼主请教下 这里有点问题
# 2. 参考执行 scripts/里面的三个脚本,分别完成 octo4a/拓展插件/klipper 的安装配置
bash setup-octo4a.sh
apk add python3-dev build-base gcc g++
bash setup-klipper.sh
“apk add python3-dev build-base gcc g++”输入有反应
bash那两条指令输入进去没反应,请教下该怎么做 pATAq 发表于 2022-5-17 00:22
执行即可。见4.2
在putty里面输入“bash setup-octo4a.sh”没反应提示“no such file or directory”,apk add python3-dev build-base gcc g++可以的安装的,bash setup-klipper.sh 也是没反应跳出来提示,这里能不能指导下该把脚本下载在哪里? 请教楼主 第二种用红米2A刷机的方式,一旦转换了横屏之后,重启就黑屏,klipperscreen不显示,查看service中Klipperscreen已经正常启动,单屏幕上就是无显示;
只能通过 sudo systemctl restart KlipperScreen才能正常显示; shenandyu 发表于 2022-5-14 22:26
楼主请教下 这里有点问题
# 2. 参考执行 scripts/里面的三个脚本,分别完成 octo4a/拓展插件/klipper 的安 ...
你从octo4a github下载这三个脚本还是本身目录里就有脚本我不记得了 pATAq 发表于 2022-5-15 12:57
你从octo4a github下载这三个脚本还是本身目录里就有脚本我不记得了
谢谢楼主,在octo4a github找到了3个脚本,请问这三个脚本是打开运行里面的命令还是怎么操作? shenandyu 发表于 2022-5-16 15:18
谢谢楼主,在octo4a github找到了3个脚本,请问这三个脚本是打开运行里面的命令还是怎么操作? ...
执行即可。见4.2 shenandyu 发表于 2022-5-17 08:14
在putty里面输入“bash setup-octo4a.sh”没反应提示“no such file or directory”,apk add python3-de ...
octo4a github项目主页 pATAq 发表于 2022-5-17 15:05
octo4a github项目主页
嗯嗯 感谢版主的热心帮助 你好,我使用的是方案二,都刷好了,但是连接不上下位机,是供电不足的原因吗?
qvGNmgo6nZK2 发表于 2022-7-20 01:06
你好,我使用的是方案二,都刷好了,但是连接不上下位机,是供电不足的原因吗?
...
不清楚,不感兴趣,不看好手机Klipper上位机,仅作记录也不想再耗费时间回答相关问题。 shenandyu 发表于 2022-5-22 22:14
嗯嗯 感谢版主的热心帮助
你是找到放在哪里了吗?我从GitHub主页下载了,但是不知道应该怎么用这两个插件,不知道应该放在那个目录下 大佬手机原本插上otg能正常使用 刷了linux系统后otg插上就没反应了 是什么原因啊?
大佬给指导下吧,按KLIPPER卡这里了 dakai 发表于 2022-11-26 11:08
大佬给指导下吧,按KLIPPER卡这里了
没有安装xinput 大佬求指点{:6_215:} 太初 发表于 2023-2-12 18:23
大佬求指点
按第一个修改即可 大佬,35521s的屏幕也能驱动了!https://www.bilibili.com/video/BV1As4y1i7BB/?spm_id_from=333.999.0.0&vd_source=da85a5aaf98de13fe62498b756772b8f Aomura 发表于 2023-5-30 21:24
大佬,35521s的屏幕也能驱动了!https://www.bilibili.com/video/BV1As4y1i7BB/?spm_id_from=333.999.0.0&v ...
谢谢提醒哈,不过我对手机Klipper兴趣不大 为啥看不了图片 会飞的包子 发表于 2023-6-28 15:26
为啥看不了图片
图片存在github上的,镜像崩了,有空修复下
页:
[1]
2