0x00. 现状

去年国庆在家里组装了一台台式机,旧笔记本电脑宣布退役,台式机正式上位成为主力机。朝九晚五的打工仔没法时时陪伴在台式机身边,工作之余会担心她在家里过得好不好、有没有被笔记本欺负,所以我需要远程看下她的状态。
家里有人的时候,就请他们按下开机键。没人的时候,那就没辙了。

0x01. 解决方案

通过上网冲浪,找到了几个解决方案:

一、手指机器人

简单粗暴,直接模拟手指物理开关机。不过类似产品很多,部分只支持蓝牙链接,如果想WiFi链接需要配合网关使用,也有宣称不需要网关直接远程控制的,选购时需要认真辨别。

二、智能开关

通过控制电源的通断,配合主板通电自动开机食用。

三、开机棒/开机盒子

  1. 通过商品介绍以及连接方式可以看出使用开机棒或开机盒子需要具备以下条件:
    • 主机通过网线连接到交换机或路由器
    • 主机支持wol唤醒
    • 开机棒仅支持网线连接到交换机或路由器,开机盒子还支持WiFi连接
  2. 开机棒或者开机盒子能提供的功能如下:
    • 支持发送wol指令
    • 支持互联网远程访问开机棒或者开机盒子
  3. 其实经常折腾路由器的人,一看就能找到替代方案,直接远程调用路由器wol唤醒主机即可。
    • wol,一般路由器都会自带
    • 远程访问
      • 若宽带有公网IP,那直接访问就完事
      • 若宽带支持IPv6,那直接通过IPv6地址访问(理论可行,未尝试)
      • 使用frp、natapp、ngrok等内网穿透

0x02. 实施

方案选择

手指机器人、智能开关太过简单,不够极客(其实是穷),开机棒和开机盒子可以使用现有功能代替,所以可以利用现有条件使用方案三实现我远程开机的需求。

网络拓扑图

困难

根据方案三,台式机主机需要通过网线连接到交换机或路由器上,但我的台式机常年放在书房,平常通过WiFi连接到客厅的路由器上。客厅没有合适的地方放置主机,书房也没预留网口,如果直接拽根网线连接的话,网线横在过道里也很难看。

解决办法

简化下方案三的开机原理,就是主机需要开启wol唤醒,然后通过网线给主板发一个wol数据包。发包的工具可以使上面说的开机棒/开机盒子,也可以是路由器,当然也可以是其他设备,比如树莓派、N1盒子。
我这里使用N1盒子作为开机盒子,使用网线连接到主机上,然后N1通过WiFi连接到路由器上,N1盒子双网卡的优势就体现出来了。新的拓扑图如下:

bot程序

我使用golang语言开发了一个简单的web程序,接收到请求后向主机mac地址发送wol数据包。

花样开机

  1. 远程到N1盒子,直接使用etherwake命令开机
  2. 打开钉钉,想机器人发送 wol 命令开机
  3. 配置快捷路径发送http请求,siri开机
  4. postman发请求开机