我们为什么需要 Matter:飞利浦 Hue 的跨平台联动探索记录
2022-11-28 16:5:11 Author: sspai.com(查看原文) 阅读量:38 收藏

我们为什么需要 Matter:飞利浦 Hue 的跨平台联动探索记录

折腾前的提醒:玩机有风险,刷砖以后可以自己救,救不了的只能动用钞能力。

前不久,因为拍摄的需要,我购买了一个绿米(Aqara)的魔方控制器。这个小玩意可以通过翻转、平面旋转和摇一摇来控制多个设备,可以说玩法颇为丰富。于是,我便决定将它放在起居室,用来控制这里的三盏灯和一片窗帘。

不过在这之前,我需要解决一个小问题:我家的灯是飞利浦 Hue,并不能直接加入到米家或是绿米的 Aqara Home app 中进行操作。而魔方控制器又不支持 HomeKit,所以就需要通过一些方法才能将它们联动。

也许在用上了跨平台的 Matter 协议之后,要解决这个问题只需将 Hue 灯泡通过 Matter 接入到 Aqara 平台,简简单单几分钟就能搞定。然而就在「Matter 大一统」的前夜,我却因为上面这个小小的需求深切感受到了智能家居平台之间的壁垒和割裂。

大方向:接入 Home Assistant

Home Assistant 是一个基于 Python 开发,历史悠久且开源的智能家居平台。经营多年的它不但拥有丰富的官方支持,还有海量第三方开发者开发的插件,帮助我们接入多个品牌的设备。

在过去的这半年时间,我几乎将家里所有的智能家居都接入了 Home Assistant,来实现跨平台的自动化联动和 HomeKit 集中控制。例如,我可以用 Aqara 的人体存在传感器 FP1 来控制易微联开关的通断,自动打开或关闭浴室的灯和排气扇;又比如我可以让米家的无线开关与飞利浦 Hue 灯联动,轻松在家里各个地方操作起居室的灯光开关。

来自易微联的单火开关,来自绿米的人体存在传感器和温湿度传感器,来自小米的亮度传感器,在 Home Assistant 中实现相亲相爱

到这里方法显而易见是有了。只需要把魔方控制器也接入到 Home Assistant,一切的问题就迎刃而解。可让我没想到的是,这个过程却无比艰难。

Home Assistant 的两种接入方式

在开始之前,我们先要来说说 Home Assistant 在这里会用到的几种接入方式。

第一种,是官方提供了接口和插件,或是官方提供接口有第三方开发者开发了插件,将对应的设备接入到 Home Assistant。由于这种方式使用的是官方的开放接口,所以操作简单且几乎不需要代码基础,典型的例子有易微联官方提供的 Sonoff Home Assistant 插件和第三方开发者开发的 Xiaomi Miot Auto 插件。

第二种则是官方没有提供接口和插件,或是官方提供的接口并不多,而第三方开发者通过软件解锁、自购 Zigbee 网关等方式接入的设备。这种接入方式适合更加专业的智能家居玩家使用,可以获得更高级的权限和设备信息,典型的插件是 Xiaomi Gateway 3、Zigbee2MQTT 等。

而第三种则是 HomeKit 反接入方式。它与上面两种接入方式不同,只能支持 HomeKit 的设备接入(无论是原生 HomeKit 还是 HomeBridge 桥接的设备)。HomeKit 反接入是一个快速将 HomeKit 设备连接到 Home Assistant 的方法,操作简单且无需输入任何代码。不过它的缺点也很明显:HomeKit 里不支持的设备、参数或操作,在这里都不会显示。

为了做更智能的自动化,我基本已经不会将支持 HomeKit 的设置先添加到 Apple 家庭,而是反接入到 Home Assistant 后再用 HASS Bridge 桥接

目前,我家的飞利浦 Hue 通过 Home Assistant 官方提供的集成接入,而 Aqara M1S 网关和下面的子设备则通过反接入的方式接入。但上面已经说到,反接入的设备必须要能支持 HomeKit 才能显示在 Home Assistant 中,而恰好魔方控制器并不能在 HomeKit 中使用,因此并不能简单将它添加为 M1S 的子设备来接入 Home Assistant。

折腾前必读的温馨提示

如果你也和我一样类似的需求,那么请务必注意这一部分的内容。

下面提到用于将小米 / Aqara 网关(M1S / M2 / 空调伴侣 P3 / G2H 摄像头等)解锁并接入 Home Assistant 平台的插件名为 AqaraGateway,而作者 niceboy 在 GitHub 页面中用加粗的字体写了两个必须注意的点:

注意:该插件只能在刷过自定义固件的设备(Aqara M2 网关)或启用了 telnet 的网关上工作。

注意2:绿米联创公司(Aqara 产品的制造商)已经开始大规模封禁 post_init_.sh 脚本。如果你坚持想使用这一插件,请不要更新网关的最新固件。如果你已经更新,那么 telnet 将失效。想要再次使用就必须要切换到米家模式后重新打开一次 telnet,然后刷入自定义固件方能生效。

所以,如果你也想和我一样折腾,那么请务必留意你的设备固件是否为 3.X 旧版本。

若你已经将网关更新到 4.0 或更新版本固件,那么就必须根据你设备的型号不同,刷入作者提供的自定义固件:

  • 对于 M2 网关、H1 面板这些无法添加到米家平台的设备,则需要拆机连接 USB 转 TTL 模块连接电脑进行刷机
  • 对于 M1S 网关 / 空调伴侣 P3 / E1 网关可以添加到米家平台的设备,除了可以使用有线刷机外,还可以将它们以米家模式连接网络,然后开启 telnet 进行无线刷机。

千万不要在 4.0 以上版本的官方固件上进行下面的操作。轻则没有效果,重则和我一样,将两个空调伴侣 P3 刷成砖头,永远卡在启动中的状态(如下图)。

当然,救砖的方法也还是有的,只不过操作起来非常复杂,而且对设备有要求,后面我们在救砖的部分会提到。

空调伴侣 P3 接入 Home Assistant 的方法

再次提醒:以下教程仅适用于空调伴侣 P3 的固件为 3.X 的版本。若以最新版本固件操作,有极大概率将设备刷成砖头。即使能够成功,一段时间之后脚本就会被检测到并屏蔽,所有设备都将在 Home Assistant 中呈现为「不可用」状态。

要将空调伴侣 P3 接入到 Home Assistant,大致可以分为以下几步:

  1. 将设备重置并连接到米家 App;
  2. 获取设备的 IP 地址和 Token;
  3. 开启 talnet;
  4. 注入 MQTT 支持的相关文件

将设备切换为米家模式并获取 IP 和 Token

首先,如果你的设备是直接连接在 Aqara Home App 中的,则需要将它切换为米家模式。操作方式为连续按下空调伴侣 P3 的操作按钮 10 次来恢复出厂设置,然后在听到「恢复出厂设置成功后」的 5 秒内快速再按操作按钮两下,听到「噔」一声后即成功切换为米家模式。

此时要是你不确定设备的模式状态,只需要在指示灯黄灯闪烁时单按一下操作按钮,听取语音提示即可。如果没有操作成功,可以重复上面的步骤再试几次。

切换为米家模式后,按照提示将它添加到米家中,接着我们就能获取它的 IP 地址和 Token。

进入 Home Assistant 操作页面,通过手动或 HACS 商店的方式将 Xiaomi Gateway 3 集成安装好。重启 Home Assistant 后即可在 Xiaomi Gateway 3 集成中登陆小米账号,然后查看到设备的 IP 地址和 Token。

如果你觉得这个操作太麻烦,还可以直接下载一位俄罗斯开发者制作的「Get Mi Home devices token」App,登陆小米账号后即可一键查询。

开启空调伴侣 P3 的 talnet

在新版本的空调伴侣 P3(包括 Aqara M1S /M2 网关等)官方固件中,Aqara 默认关闭了设备的 telnet,因此我们需要手动将其打开,方便后续的刷机 / 命令操作。

获取到 IP 和 Token 信息后,我们就可以按照 Aqara Gateway 开发者提供的方法,一步一步打开空调伴侣 P3 的 telnet。

不过在此前,你需要在你的电脑上做好下面的准备工作。

#安装好 HomeBrew:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

#安装好 Python:
brew install python
brew install python3

#安装好 Python-miio:
pip3 install python-miio

这里我用的设备是 MacBook Pro,其它设备的安装命令或许有所不同,请以实际使用的设备为准。安装好上面的这些必须项目后,我们就可以用下面的命令来开启空调伴侣 P3 的 telnet:

miiocli device --ip 空调伴侣的IP地址 --token 空调伴侣的token raw_command set_ip_info '{"ssid":"""","pswd":"123123 ; passwd -d admin ; echo enable > /sys/class/tty/tty/enable; telnetd"}'

开启 MQTT 支持

开启空调伴侣 P3 的 telnet 之后,我们就可以用对应的 telnet 软件来连接设备,给它加入支持 MQTT 的新文件,以便用第三方开发者的专业插件接入 Home Assistant。

打开 macOS 上的 Welly 或 Windows 平台中的 putty,输入空调网关的 IP 之后,用 telnet 登陆到空调伴侣 P3。telnet 登陆的账号是 admin,密码无需输入,直接回车即可。

登陆成功后,依次输入下面的命令:

# 新建并切换到 /data/bin 目录
mkdir /data/bin
cd /data/bin
# 从互联网上下载 curl 程序,并赋予可运行权限
wget -O /data/bin/curl "http://master.dl.sourceforge.net/project/mgl03/bin/curl?viasf=1"
chmod +x /data/bin/curl
#从互联网保存一个第三方修改工具包,并赋予修改工具包所有用户组一个可运行权限
data/bin/curl -k -L -o /data/bin/mosquitto https://raw.githubusercontent.com/niceboygithub/AqaraM1SM2fw/main/binutils/mosquitto
chmod a+x /data/bin/mosquitt

完成上面的操作后,你可以使用 ls -l 命令来查看文件是否正确放到对应目录且拥有读写权限。接下来,继续输入下面的命令:

#新建并切换到 /data/scripts 目录
mkdir /data/scripts
cd /data/scripts
#从互联网保存一段代码,并赋予代码可运行权限
/data/bin/curl -k -L -o /data/scripts/post_init.sh https://raw.githubusercontent.com/niceboygithub/AqaraM1SM2fw/main/binutils/post_init.sh
chmod +x /data/scripts/post_init.sh

同理,这一步完成后也建议使用 ls -l 命令来查看 post_init.sh 文件的状态。

然而,我在这一步却遇到了问题。由于一些网络原因,我并不能正确下载 raw.githubusercontent.com 上的文件,每次都会因为 443 超时问题而导致下载失败。如果你也遇到了这样的情况,建议你在电脑上先将文件下载,然后将它上传到国内可以解析的 OneDrive、Gitee 等平台,然后再用对应的文件链接替换掉原有的 raw.githubusercontent.com 链接。

确定文件地址和权限无误后,最后在 telnet 中输入 reboot 重启网关设备即可。

安装 AqaraGateway 插件并接入空调伴侣 P3

重启后,进入 Home Assistant 里,手动或用 HACS 安装 AqaraGateway 插件,然后根据提示接入空调伴侣 P3 即可。

操作失败的救砖可能性

严格来说,智能家居设备大都可以「开盖」,然后用 USB 转 TTL 模块连接对应的接口或触点来刷入新的固件。而网上也有一小部分人和我有类似的经历,只是他们在折腾的时候是把 M1S 刷成了砖头。好在其中一位作者表示,他后来死马当活马医,成功用连线刷机的方法救活了他的 M1S。

经过查询,AqaraGateway 的作者 niceboy 在 GitHub 对应的项目中存放了一些网关的官方和自定义固件,涵盖了 M1S / M2 / P3 / H1 / G2H 等设备,部分设备还给出了相应的 TTL 连接口图片

M1S 的 TTL(UART)接口,图片依然来自 niceboy 的 GitHub

但如果你的设备是空调伴侣 P3,那么恭喜你,你来到了一片未知的黑暗森林。

我下载了空调伴侣 P3 的官方固件,试图使用 TTL 进行刷机,然而拆开它之后我惊呆了 —— 空调伴侣 P3 与 M1S 完全不同,没有标注任何 RXD 和 TXD 的丝印,而是密密麻麻引出了一堆名为「TPXX」的触点。这意味着,如果我要刷机救砖,意味着我就必须查阅芯片的数据手册,然后用万用表一个一个测量触点连接的管脚……

愿意花点耐心尝试的话,或许是可以成功的,而且将会成为第一个吃螃蟹的人。然而此时我的万用表刚好坏了,救砖的这条路就被阴差阳错地堵死。

开启 Aqara G2H 摄像头的 telnet 及 MQTT 支持

除去空调伴侣 P3,我也用 G2H 摄像头尝试过。虽然具体的代码略有不同,但操作步骤与空调伴侣 P3 大同小异。

开启 telnet

折腾的第一步,当然还是先得开启被官方固件锁定的 telnet。但相比前者,Aqara G2H 摄像头开启 telnet 的方式简单得多。

第一步,打开 macOS 的终端,然后输入 touch hostname 来新建一个名为「hostname」的文件。

第二步,在个人文件夹中找到这个文件,用 VSCode 等文本编辑软件打开它,并将下面的命令复制到文件中:

#!/bin/sh
passwd -d root
echo WITH_TELNET=y >> /etc/.config

接着,保存文件修改,然后将「hostname」这个文件复制到 G2H 摄像头的 SD 卡中。将 SD 卡插入到摄像头卡槽里并重新启动设备,就能打开 telnet。而在成功打开 telnet 后,这个文件就可以功成身退,住进废纸篓等待倾倒了。

注入 MQTT 支持

到这里同样需要注意的是,开启 MQTT 支持的文件也不适用于新版的官方固件(2.1.X 或以上)。在新版本官方固件中直接注入 mosquitto 虽然不会导致设备变砖,但却不会生效,令 Home Assistant 无法读取 G2H 摄像头和子设备的任何消息。

G2H 的折腾更为复杂,甚至需要拆除某些芯片才能做到。若非必须,建议尽量使用其它设备来操作。

若你满足条件,则同样使用 telnet 软件登陆(登陆名称也是 admin,密码无需输入直接回车)到 G2H 摄像头,依次运行以下代码来开启:

#新建并切换到 /data/bin 文件夹
mkdir /data/bin
cd /data/bin

#从互联网下载 curl 工具,并赋予可执行权限
wget -O /tmp/curl "http://master.dl.sourceforge.net/project/aqarahub/binutils/curl?viasf=1"; chmod +x /tmp/curl

#从互联网下载修改后的工具包,并赋予全用户组的可执行权限
/tmp/curl -s -k -L -o /data/bin/mosquitto https://raw.githubusercontent.com/niceboygithub/AqaraCameraHubfw/main/binutils/mosquitto; chmod a+x /data/bin/mosquitto

我在这里还是遇到了 raw.githubusercontent.com 连接 443 超时的问题,后来通过 Gitee 的文件链接解决了它。需要注意的是,G2H 摄像头开启 MQTT 不需要重启,运行完上面的命令即可到 Home Assistant 的 AqaraGateway 插件中添加设备。

就算上面的方式都失败了,别气馁,总会成功的

在探索了两个空调伴侣 P3 和一个 G2H 摄像头均告失败后,我总结了前面的踩坑经历和更多前人成功接入魔方控制器的帖子,决定最后再赌一把。毕竟如果现在选择放弃的话,就相当于前面的努力全部付之东流,魔方控制器就只能控制留在起居室当窗帘遥控器。

很显然,一切的问题都出在我更新网关固件太勤快上,而上述设备要重新刷机的操作都非常复杂。所以,寻找一款方便折腾的新网关是首要考虑的事情。详细阅读了 Xiaomi Gateway 3 插件和 Aqara Gateway 插件的文档后,我发现 Aqara E1 网关是个不错的选择:

  • 可以使用 Xiaomi Gateway 3 一行命令开启 Telnet;
  • 刷固件的方式比起上面的设备都更加简单(甚至可以插 USB 接口刷);
  • 自定义固件更新速度很快,基本上官方固件发布后几天,插件作者就更新了。

开启 E1 网关 telnet 并刷入自定义固件

要开启米系智能家居网关的 telnet,万变不离其宗的是需要先将他们接入米家 App。不过在完成之后,E1 网关的操作就很简单了。

我们只需要在 Home Assistant 中新添加一个 Xiaomi Gateway 3 集成,然后在弹出的输入框里找到自动检测到的 E1 网关。点击提交,Xiaomi Gateway 3 还会帮你填好 E1 网关的 IP 和 Token,你只需要输入下面的命令就能开启 talnet:

{"method":"set_ip_info","params":{"ssid":"""","pswd":"123123 ; /bin/riu_w 101e 53 3012; telnetd"}}

实际上到了这一步,连接在 E1 网关下的魔方控制器就已经可以添加到 Home Assistant 中使用了。只不过未来我可能还是会切换到 Aqara Home 模式使用,为了能够继续保持与 Home Assistant 的连接,所以仍旧选择给它刷入了自定义固件

给 E1 网关刷固件并不难,而且日后升级也只需使用同样的命令再运行一次就能搞定。不过要注意的是,E1 网关的 talnet 登陆名称从 admin 换成了 root,密码则还是一样不需要输入回车即可。

在 telnet 客户端里连接好 E1 网关后,依次输入下面的命令:

#同样是切换到 /tmp 文件夹,下载 curl 并给予可执行权限
cd /tmp && wget -O /tmp/curl "http://master.dl.sourceforge.net/project/aqarahub/binutils/curl?viasf=1" && chmod a+x /tmp/curl

#下载一段来自互联网的升级代码,给予可执行权限并运行
/tmp/curl -s -k -L -o /tmp/e1_update.sh https://raw.githubusercontent.com/niceboygithub/AqaraCameraHubfw/main/modified/E1/e1_update.sh
chmod a+x /tmp/e1_update.sh && /tmp/e1_update.sh

对了,固件刷完之后,telnet 需要过几秒才会提示你手动给设备拔电重启。尽管这时它已经显示自定义固件刷入完成,但最好还是等待一会。我没有尝试过在刷完之后就立刻拔掉电源,如果你财力雄厚的话,可以尝试一下。

至此,E1 网关的刷机已经完成。

Hi!魔方控制器!

现在,只需将魔方控制器添加为 E1 网关的子设备,我们就能在 Xiaomi Gateway 3 下 Aqara E1 网关的设备列表里找到它了。

点击它进入到设备的详细信息页面。如果连接成功,在传感器下的「Action」这一栏中,我们就能看到操作魔方时的反馈结果,右侧的日志则会记录近期的操作记录。试着将它翻转 90 度,平推一下,或者摇一摇,如果都能正确地识别到,意味着魔方控制器已经成功接入了 Home Assistant。

自动化操作

成功看似近在眼前,但如果这时候我们马上就急着要到 Home Assistant 的自动化里给它设置操作,那么我们还是会扑个空 —— 如果你在这里创建自动化,那么与魔方控制器相关的触发条件只有一条:当它的电池电量变化。

为什么会这样?不是已经能成功识别魔方控制器的操作状态了吗?

别急,隆重介绍「蓝图」功能

在 Home Assistant 2020.12.0 版本中,全新引入了一项叫 Blueprint(蓝图)的新特性:

自动化蓝图是预先创建的、具有用户自定义选项的自动化。这允许分离自动化的逻辑和设备输入。听起来有点复杂对吧?但事实上,它将使很多事情变得可复用且更容易。 

假设有这么一个自动化的「蓝图」,用一个传感器来控制灯光自动开关,它允许你配置运动传感器触发,并控制灯光。 

现在可以创建两个自动化,每个自动化对此蓝图都有自己的配置,并且完全独立运行,但是却可以基于相同的自动化配置。

在不讲人话这方面,不少软硬件产品的官方技术文档一直都很有经验。怎样来理解这个晦涩的定义?其实举个例子就很好理解。比如现在你有三个人体传感器,需要控制三盏灯,那么有了「蓝图」,你就只需要创建一个「人来亮灯」的自动化蓝图模板,然后再在里面选择不同的设备套用三次同样的操作就可以,不用再一步一步新建三个自动化来实现了。

如果还是不理解也没关系,直接把它想象成就是人家做好的自动化分享给你,你在这里添加你的设备就可以了。

想要在 Home Assistant 里使用魔方控制器,我们就需要一个自动化蓝图。由于我们使用的是 Xiaomi Gateway 3 插件接入的魔方控制器,因此需要使用的是下面这个蓝图:Xiaomi Gateway 3 - Aqara Magic Cube (9 Actions)

这个蓝图支持检测魔方控制器的九个操作,分别为

  • 唤醒:魔方控制器在静止放置一段时间后产生任何新位移;
  • 双击:握住魔方控制器轻敲两下桌面;
  • 移动:平移魔方控制器到任何一个方向;
  • 下落:把魔方控制器丢在空中并在下落时接住(接不住就是别的故事了);
  • 摇一摇;
  • 翻转 90 度;
  • 翻转 180 度;
  • 向右旋转;
  • 向左旋转。

我们只需要点击下面的「IMPORT BLUEPRINT」按钮,即可将蓝图添加到我们自己的 Home Assistant 中。接着再在自动化里点击「创建自动化」,并选择刚刚加入的蓝图,选择你的魔方控制器实体,就可以设定对应的操作了。

到这一步,所有的初始目标宣告达成。Aqara 的魔方控制器终于可以操作起居室的飞利浦 Hue 灯了。

进阶玩法

在这之后,我还发现了更多关于魔方控制器的进阶玩法。例如将它添加为一些第三方 Zigbee 网关(例如 Sonoff 推出的 Zigbee Dongle)的子设备,通过 ZHA 或 Zigbee2MQTT 来接入 Home Assistant,甚至可以解锁上百种玩法。

就拿 ZHA(Zigbee Home Automation)的方法来举例,由于它可以识别魔方控制器的哪一面朝上,因此可以读取高达 57 个动作。只要你记得住每个动作对应的控制设备,你甚至可以用一个魔方控制器来操作家里所有的智能家居。

但实际上,我使用 Xiaomi Gateway 3 插件提供的 9 个动作就已经满足了需求,因此就没有再继续向前探索。不过,我还是利用手头上有的 Sonoff Zigbee Dongle 网关测试了一下,发现 Aqara 的魔方控制器在搭配第三方网关通过 Zigbee2MQTT 接入 Home Assistant 的时候,似乎有些问题:它能够连接且正确识别,但却无法读取操作。

在 Zigbee2MQTT 插件的官方文档中提到过,小米和 Aqara 并不是标准的 Zigbee 协议,而是进行了一些修改,魔方控制器也在此列。我不知道是因为我技术水平不过硬没正确设置好 Zigbee 网关的原因,还是问题出在其他地方 —— 这些都只能留待日后需求变动的时候来解决了。

Matter 前夜的阵痛

不得不说,这一次探索的成本还是挺高的。为了一个几十块钱的魔方控制器,送走了两个空调伴侣 P3,还新买了一个 E1 网关,属实是为了一碟醋整出来了一桌满汉全席。

但至于亏不亏,其实我觉得能接受。一方面在我看来这样的刨根问底和跨越生态是某种「不妥协的极客精神」,如同此前嫌弃小区办新门禁卡要 30 多块钱太贵,转而花 300 多买个 Proxmark 3 自己复制了十几张卡的爽快感觉;而另一方面也让我深深地感受到,能够跨平台连通的 Matter 协议有多么重要。

在过去,打破壁垒这件事情是普通用户难以企及的操作,只能是懂代码和原理的开发者或技术用户们通过 Home Assistant 这样的平台来实现。普通用户选择智能家居,要么忍受同时安装好几个 App,同时用好几个语音助手,要么就只能被牢牢地套在一家产品的生态中。

相反的是,用户的多样化需求必然不可能全靠一家的产品就能实现,谁都会向往更便宜、更满足自己痛点的软硬件解决方案。然而,横亘在不同智能家居设备之间的生态「护城河」,却严重制约了智能家居的发展,违背了智能家居「方便」的初衷,也击溃了「自动化」这一智能家居与传统家具的核心竞争力。

从我历时半个月的艰难探寻可以发现,想要实现如此简单的跨平台联动功能,所付出的成本却近乎是成倍提升。作为略懂一些进阶操作的我都已如此深感费力,普通大众消费者就更不用想了。

好在暌违许久的 Matter 协议给了我们一丝曙光。真心希望我是 Matter 1.0 协议正式到来之前的黑夜中,最后一个碰壁者。

> 少数派请你做地图:城市声音收藏夹火热征集中,期待你创作的城市之声 🎧

> 下载少数派 2.0 客户端 、关注少数派公众号,解锁全新阅读体验 📰

> 实用、好用的正版软件,少数派为你呈现 🚀

宛潼

以前叫 JohnHarrod。用不停创作来对抗焦虑,欢迎合作或投喂。公众号:约翰斯库


文章来源: https://sspai.com/post/76922
如有侵权请联系:admin#unsafe.sh