最近折腾出来一个很好玩的事情,分享一下 现在,我可以自由的开关我的电脑,随时在不同设备上访问和使用,还挺方便实用的。

涉及内容

  • BIOS设置和网卡驱动
  • DDNS
  • 服务器和Node.js
  • 微软远程桌面

(太长不看:简要步骤 1.BIOS允许网卡启动;2.网卡驱动设置允许wake on lan; 3.设法监听路由器动态IP;4.使用休眠替代关机;5.发送魔包唤醒PC 6.远程连接使用)

打开开关

关于BIOS的设置其实只有一处,即在主板的启动选项里设置允许网卡启动。但是有几点需要说明一下:

  1. 系统挂起有S1~S5五种,其中S3(挂起到内存),S4(挂起到硬盘),和S5(关闭所有设备)对应于windows的睡眠、休眠和关机。更高的状态拥有更低的功耗,而唤醒的难度则更大,事实上,我只做到了在休眠模式下唤醒PC,不过这对我来说是足够好的。
  2. 在BIOS里,有一项网卡相关的设置,其中会有一个 wake on Lan 的选项,不过,对于我的Intel i219-v 此项没提供除[N/A]以外的选项。
  3. 显然,远程唤醒意味着网卡需要始终处于供电状态并接收数据包,也就意味着,网卡的指示灯和路由器对应的LAN口的指示灯是常亮的。
  4. 除了设置BIOS选项以为,更为重要的,是在系统的网卡驱动选项中开启远程唤醒功能,但是想要此功能完美生效,一定要确保安装了最新的显卡驱动。需要注意的是,windows自动安装的网卡驱动可能不是最新的,使用某些驱动管理软件更新的网卡驱动也可能不是最新的。直接去Intel官网下载最新的驱动,可以节省不少力气。
  5. 另外,注意要关闭windows的快速启动。
  6. 以及,避免网卡自动唤醒windows: 如果在网卡的属性设置里勾选了“唤醒模式匹配”,电脑将经常忽然从休眠态自动醒来。可以通过命令powercfg -lastwake查看最近一次唤醒原因。取消勾选此选项,不会影响魔包唤醒。

唤醒PC

一种称为“魔包”的特殊数据包被发送到网卡,作为唤醒PC的指令。我们不需要关心魔包的具体内容,只需要配置好正确的mac地址、ip和端口号,魔包可以由代码自动生成。

DDNS

网卡的mac地址是固定的,端口号也由我们指定。但是对于国内常见的家庭宽带用户,运营商分配给我们的IP通常不固定。因此实时获知IP地址,成为远程连接的第一步。 当前有一些提供免费动态域名解析服务的网站,经过观察,我猜测其流程大概是:首先由路由器负责把IP实时汇报给网站服务器,收到IP的服务器更新其DNS服务使得在其域名下分配的某个子域名可以解析到对应IP。即使用固定的域名对动态的IP进行了封装。 于是

如果你刚好拥有一台服务器

是的,如果你刚好有一台属于自己的服务器,其实完全不需要这些第三方服务商也能保持IP的更新。 起初,我很好奇路由器是如何汇报动态IP的,于是便在路由器的DDNS相关配置里写上了我自己的服务器地址,在服务器端查看nginx的访问日志,可以看到每当IP变化时,我的路由器便会以1分钟的间隔向我发送5次连续的GET请求,请求内容比我想象的还简单(实际ip被我手动打码了):

114.250.***.*** - - [02/Dec/2018:21:13:18 +0800] "GET // HTTP/1.0" 502 173 "-" "-" "-"
114.250.***.*** - - [02/Dec/2018:21:14:18 +0800] "GET // HTTP/1.0" 502 173 "-" "-" "-"
114.250.***.*** - - [02/Dec/2018:21:15:18 +0800] "GET // HTTP/1.0" 502 173 "-" "-" "-"
114.250.***.*** - - [02/Dec/2018:21:16:18 +0800] "GET // HTTP/1.0" 502 173 "-" "-" "-"
114.250.***.*** - - [02/Dec/2018:21:17:19 +0800] "GET // HTTP/1.0" 502 173 "-" "-" "-"
114.250.***.*** - - [02/Dec/2018:21:18:19 +0800] "GET // HTTP/1.0" 502 173 "-" "-" "-"

此时,一切水到渠成。只需要写一个服务,接收IP更新的请求,保存最新的IP,甚至每当IP变化时通过邮件通知自己。

nginx 把请求转给node处理:

server {
    listen 31111;
    location / {
            # get request ip
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:31112;
    }
}

使用Node.js处理路由器的IP更新请求:github地址

更新邮件

(由于会动态变化,其实打码不是很必要)

至此一切准备就绪


真远程唤醒

强调“真”是因为一些资料里所谓的远程唤醒其实是局域网唤醒,实际意义实在有限。

远程唤醒的工具各个平台都有,甚至有一些网站也提供在线唤醒工具

借助一些开源工具, 也可以交给服务器来做:

nginx 配置和上面类似,转交给node做唤醒:

#wakeup home pc
location /wake {
    proxy_pass http://127.0.0.1:31113;
}

使用Node.js简单几行代码实现的唤醒接口:github地址

远程桌面

微软远程桌面(RD Client)在主流平台都有提供,如果是mac系统,目前App Store下架了,国内ID可以考虑下载beta版。配置很简单(这是个假ip): RDConf 端口号默认是3389所以这里其实可以不写 唯一的麻烦是需要经常翻邮件并手动替换这里的地址

结果很酷

现在,我随时随地都可以在我的 MBP, iPad,小米,甚至我4寸的SE上访问家里的主机啦。前两天在公司刷IT之家,看到Steam上尘埃4搞特价,于是随手连上家里的PC,打开steam,下单,安装,甚至还小窗玩了一小会儿。

小窗的原因不是因为在公司,而是带宽不够。即便尽可能把窗口开到最小,帧率大概也没超过10吧。想自己搭一个“云游戏主机”还需要再等等。