King-of-Infinite-Space / thoughts

3 stars 0 forks source link

探索远程唤醒电脑的方法 #70

Closed King-of-Infinite-Space closed 2 years ago

King-of-Infinite-Space commented 3 years ago

English title (for SEO): exploring ways to remotely wake up computer

打算晚上把笔记本电脑锁在办公室里。走路来回背着总感觉是个累赘(尽管只有1.25kg)。每天空手而来、空手而归,身轻如燕、健步如飞,岂不美哉?

主要数据通过Google Drive同步到了台式电脑,但主力机上的某些软件还是更顺手一点,所以希望必要时能用TeamViewer之类的软件远程控制。最简单粗暴的方法是保持开机。这个方法当然有效,就是有点浪费电。这里的测量数据显示,我目前使用的MacBook Air (2018)在插电且空闲的情况下能耗为 3~8 W,而插电睡眠时仅有 0.3 W。(其实前者不过相当于一个LED灯泡的功率,而且不需要每天开着或整晚开着,所以耗电并不多。)理想的方案是在需要时远程唤醒电脑。尽管目前需求不强,还是想探索一下这个方案在技术上的可能性。

注:一些辅助设备可以实现通过互联网远程唤醒,比如向日葵开机棒。(但该产品必须通过网线连接到路由器。无线连接理论上应该可行?)另外,该公司还有智能插座,通过AC recovery实现远程开机。仅供参考,实效未知。

方案1: Wake On LAN + VPN

近年来的电脑主板应该都支持Wake on LAN,可以通过局域网被唤醒。其基本原理是,电脑在睡眠时并未完全断电(甚至某些情况下关机后也是如此),网卡接收到特定的数据包时会通过主板将电脑唤醒(或开机)。较新的电脑还支持通过无线局域网 (WLAN) 唤醒。

初步思路是先通过VPN连接到学校的网络,然后用Wake On WLAN唤醒电脑。可以预见的困难在于能否通过VPN访问电脑所在的局域网。我不了解学校的网络具体是如何架设的,想必比较复杂,而且可以观察到通过VPN连接和直接连接获得的ip地址非常不同。(甚至同一地点的两个设备都未必能自动连接到同一个子网。)网上也有人提到『If you use a VPN service (to home or office for example), you may have issues as well unless your equipment supports WoL over layer 3 (an ip helper or directed broadcast support will be required).』

然而,VPN的问题根本没轮到,我在自家路由器局域网内的测试都不成功。首先在Mac上开启设置:System Preferences --> Battery --> Power Adapter --> Wake for network access。这样电脑在睡眠时不会关闭wifi,可以被局域网下的其他设备ping到。然而,其他设备向其发送Wake On LAN信号后,电脑纹丝不动。尝试在路由器上设置了端口转发,也没有效果。我没有网线转换器,无从测试有线连接的情况。

奇怪的是,网上关于远程唤醒Mac的资料很少,较新的只有Apple Developer Forums一个帖子里的两个失败案例(一个有线一个无线)。本来简单直接的功能莫明其妙不好使,不知道是不是贵果又从中作梗。总之,直接利用Wake On LAN的尝试以失望告终。随即想到抽屉里闲置的旧手机——或许可以把手机作为中介,用某种方式远程控制手机,让手机唤醒电脑。(手机待机时耗电量显然比电脑空闲时小得多。)

方案1.5: Wake On LAN + 手机 USB tethering

以前试过安卓手机的USB tethering功能,即将手机的网络 (Wi-Fi或移动网络) 通过USB分享给电脑。我猜测此时手机相当于路由器,所以想尝试用手机通过有线连接(USB)向电脑发送Wake On LAN数据包。

把手机插到MacBook上之后发现无法开启此功能,一查才知道MacOS竟不支持。(似乎是某种专有协议的原因。)好在有人开发了驱动HoRNDIS: Android USB tethering driver for Mac OS X。再一看,由于MacOS >=10.15版本的某种系统目录保护机制,无法直接安装。(某些功能自身不支持且罢,用户想自行安装还各种阻挠。贵果欠揍。顺便,这个项目的README写道:HoRNDIS (pronounce: "horrendous")。)

办法还是有的。照着Issues里的步骤去恢复模式里暂时调整安全设置,略经曲折,装上了驱动。尽管速度很慢,至少可以通过USB tethering联网了。绕完了路,回到一开始的目的。电脑开启时的确可以被手机ping到,但是睡眠后网络就中断了。所以这个方案也行不通,看来需要考虑Wake On LAN之外的方法了。

方案0:手机 + 物理装置

序号是乱写的,但也不是毫无道理。既然通过网络的方法行不通,何不回归更原始的办法?比如,远程控制手机 (振动?) 触发某种机械装置 (小锤?) 敲击键盘以唤醒电脑?

可行性还是有的,但需要巧妙设计。成功率就不好说了。(如果没有复位装置,那就是一锤子买卖。字面意思。)其实,智能家居产品里有遥控按开关的装置,而且可以通过配套的wifi hub实现经过互联网的远程控制。为此专门买一套实在没有必要,而自制装置想来不怎么靠谱,所以这个方案只是想想而已。

方案2:手机模拟蓝牙键鼠

在前面的探索过程中,发现MacOS的蓝牙设置里有一个选项——允许蓝牙键鼠唤醒电脑。一些应用可以将手机模拟为蓝牙键鼠。于是我试了这个在Google Play Store上排名前列的Serverless Bluetooth Keyboard & Mouse for PC/Phone。连接成功。最重要的是,蓝牙连接在电脑睡眠后不会中断,可以将电脑唤醒!

最重要的步骤已经实现了。远程控制手机不是什么难事。在作为中介的手机上用自动化应用Tasker设置以下任务:当插件AutoRemote接收到特定指令时,切换到模拟蓝牙键鼠应用,并用插件TouchTask模拟点击屏幕 (相当于点击蓝牙鼠标以唤醒电脑)。这样,只要保证手机模拟的蓝牙键鼠与电脑保持连接且上述应用在后台运行,用任意设备访问AutoRemote提供的网址即可向其发送指令来触发此任务唤醒电脑。

测试效果不错。至于稳定性如何?呃,自从升级到MacOS 11之后,电脑动不动就在睡眠中重启。。So, on that terrible disappointment, it's time to end... 总之,还是找到了一个通过手机间接远程唤醒电脑的办法。不管以后是否用到,总算不枉这番工夫。