对 v2c 进行了一次前端的重构
2024-09-17 20:24:00
0x0自从 2019 年把博客迁移到 Typecho,再到 2020 年用 React 自己写了博客的前端进行了前后端分离后,我的博客前端就几乎没怎么动过了。期间其实也多次想开始重构,但总是因为工作忙...
如何让 uTools 通过代理服务器连接网络
2024-06-18 14:35:00
总的来说就是为 uTools 添加启动参数 --proxy-server 即可通过代理访问网络。备注:此方法只能代理掉 chromium 侧的流量,无法覆盖 uTools 本身非渲染进程的流量、插件 ...
关于这三年:我也是当过美食博主了
2024-05-26 22:15:00
是的,I am back!很久没有更新博客了,一方面是忙于工作无心更新(这是个借口),另一方面是自从 2021 年 8 月发生了丢失数据的问题,导致很多历史文章都消失在互联网长河中。虽然尽了很大的努力...
[家宴 · 2021]也许是今年最认真的一顿饭,红红火火锅
2021-12-31 23:33:00
在 2020 年,我曾经搞过几次家宴,邀请了一众好友来家里吃吃喝喝。甚至在 V 站加了不少好友,对他们说『下次家宴有空来家里一起吃』,但是事实上因为种种原因,2021 年非但没有邀请 V 友来家里吃饭...
【一场灾难】多站点数据丢失说明
2021-08-23 21:47:16
大概在一个多月前,包括 我的博客、LoveLive.tools(渣男:说话的艺术)、Mr.Task 等网站突然无法访问,服务器无法连接。本来以为只是服务提供商突发故障(之前也出现过,后来都正常恢复),...
[LoveTime] 一个与爱情和时间线相关的项目
2021-03-20 11:11:00
0x0 为什么做这个项目大概在一年前,我注册了 lovetime.tools 的域名。说来也是奇怪,我总是喜欢在脑子里冒出一个想法之后立刻注册相关的域名,但是往往实际完成上线的时间都会拖很久。比如 渣...
有目的 (di) 地 (de) 瞎折腾 —— 为了温暖的被窝而实现远程开机
2021-01-09 13:14:00
0x0这个冬天真的太 TM 的冷了,冷到我想一天 24 小时都呆在床上哪儿也不去。本来在这个美好的周六是可以实现这个同样美好的愿望,但是一大早同事来的电话击碎了我的梦想 —— 线上项目出了点问题需要排...
[家宴・2020] 入冬的第一次聚会,是带些许火辣的味道
2020-11-18 20:00:00
0x0是入冬的日子了,终于送走了盘踞在头上小两三个月的秋老虎。说来也是奇怪,在我记忆中大概七八年前,大概还是我上初中的时候,总是能精准的掐着日子算到什么时候要入冬了,左右不过是国庆过后五六天就可以翻出...
[家宴・2020] 开学季的聚餐,迟来的总结
2020-10-25 20:00:00
我大概是一个很不喜欢社交活动的人,如果让我和不怎么熟悉的人一起吃饭或者进行什么活动,那我大概会原地尴尬的用脚趾在地上抠出三室两厅两位的大户型来。因此我是一个朋友很少的人,仅有的朋友就是在小区里遛狗认识...
2019年度小结 - 其他方面
2019-12-31 00:22:00
2019 年过的真快,感觉一闭眼还能看到年初的日子。今年喜提了家里第三只猫,是一只海豹色手套布偶,看起来的确比一脸厌食的加菲(们)好看多了,当然我还是爱着我家的两只肥仔加菲的。这只猫来的也巧,有一天半...
2019年度小结 - 技术方面
2019-12-29 23:39:00
今年是我从全栈偏后端转向全职前端的一年,也是我脱离舒适圈从一个小公司的技术 Leader 跳到大公司当齿轮的一年,也是我业余时间做了比较多有意思的开源项目/网站的一年。就开源项目来说,勉强算下来也只有...
为什么我们需要爱国
2019-11-04 18:28:00
仔细回忆了一下我人生的前二十年,对于国家和执政党的态度的确是从一个极端走向了另一个极端。还是学生时代的我就像一个愤青,自以为读了几本自由主义的书、了解了一些不为大众所知的历史就想当然的认为“国家腐朽、...
[ T9 x 触控 ·0x0 ] 为便携触控式 Windows 设备打造 T9 输入法
2019-10-21 03:09:00
为什么要做它起因还是我习惯了半躺在床上抱着 Surface 聊天、刷网页,但是 Windows 10 自带的屏幕虚拟键盘只有全键盘模式,在单手输入的场景下对着 Surface 那 12.3 英寸的屏幕...
最近关于工作和感情的一些闲谈
2019-10-14 23:44:50
0x0 工作到今天为止,是我跳槽来 ND 第四个月,脱离曾经的舒适圈四个月。从全栈偏后端转型到纯前端的这段时间,算是感慨颇多,也算是从几个中小型公司到大公司的一种体验。曾经在做后端的时候,写代码考虑的...
再战运营商缓存之 使用 iptables 对付死 X 缓存劫持
2019-10-07 04:55:00
起因与移动的缓存问题进行斗争要追溯到两年前,那时候因为移动竟然连 cnpm 的数据都进行缓存。并且令人喷饭的是:移动的缓存服务器不但经常速度慢到堪比万年王八跑马拉松,甚至还经常宕机,导致我只想安安静静...
Lode.Api:为什么要开发它
2019-09-22 03:15:00
0x0 Lode.Api 是什么Lode.Api 是一个用于 Nukkit/Bukkit(like)(1) 服务器的插件。提供了访问服务器各种数据和功能的 Http Api 接口。你可以通过这些接口来...
[性感渣男在线教学] 一个教你说情话的网站
2019-06-02 07:03:00
先直奔主题网站地址:渣男: 说话的艺术( https://lovelive.tools )这是什么让大家慧眼识渣男让大家参考一下说情话的艺术,毕竟成为一个有趣的人更能吸引他人。网站的灵感来自于骂人宝典...
一次感情的复盘
2019-05-10 01:35:00
为什么这次的感情会失败?经过昨天的思考,我认为还是要归咎于我个人性格不成熟的原因,当然这是一方面,另外一方面是烧碱对自我认知的缺失。先从我个人原因说起:和之前的某些情况类似,我在感情中过于患得患失,当...
无题
2019-05-06 01:34:00
感情啊,真是一个奇妙的东西。仿佛不管用多少年修炼出来的宠辱不惊在感情面前都会变成一滩废物。总感觉自己不会因为各种感情的问题而影响到自己的情绪,可是每次次都是被杀的丢盔卸甲,屁滚尿流。可能这就是传说中的...
谈理性的“理性对待”
2019-05-05 05:34:00
让人保持理性的思考果然是不可能的(或者说很困难的),写过的文章十有八九都是“理性的面对”、“如何正确对待”、“在……中保持理智”诸如此类长篇大论一些堂而皇之的话,却没法自己做到。到底是被感情冲昏了头脑...
下一篇
弹出
关闭

有目的 (di) 地 (de) 瞎折腾 —— 为了温暖的被窝而实现远程开机

0x0

这个冬天真的太 TM 的冷了,冷到我想一天 24 小时都呆在床上哪儿也不去。本来在这个美好的周六是可以实现这个同样美好的愿望,但是一大早同事来的电话击碎了我的梦想 —— 线上项目出了点问题需要排查一下问题。虽然不情愿,但是寄人篱下给人打工哪能不低头(……),只好抄起枕边的 Surface 看一下到底是啥情况。粗略看了一下发现应该只是配置问题,去后台修改配置项就可以解决。

正当庆幸不是什么大问题改完就能继续 V 坡(本地方言睡觉)时我突然悲剧的发现:登录后台的账号密码入口在内网的一个服务上,公司的 VPN 只装在距离我床大概两米的台式机上,平时只要远程连过去就可以,但是台式机昨晚上被我手贱关机了…… 如果要开机势必要爬出温暖的被窝。就是在这么一个 2021 年冬日的早晨,从被窝到书桌,两米的距离好似咫尺天涯,就像鱼儿与飞鸟一个在天上一个在深海;又好似我与喜欢的人,永远不会有交会的轨迹(……)。我大概尝试了 25565 种体位,不管怎么探出手抑或用拖鞋辅助,都没法实现人在床上摸到电脑开机键。万般无奈下只好跳出被窝 — 冲去开机 — 杀回被窝(天知道这么冷为什么我还要裸睡)。

0x1

经过这么一番折腾也没啥心思接着睡觉了,为了生活的美好和温暖的被窝,我决定思考一下如何实现远程开机。正常情况下是可以借助 WOL ( Wake On LAN )来实现,但是前段时间网线坏了,所以一直都是用 WiFi 联网,然而大部分无线网卡是不支持 WOL 的。既然目前 WOL 这条路走不通,那就从硬件方面下手。

主板控制电脑开机是通过 Power SW( Power Switch )的两个引脚开合状态来控制的,通常情况下这两个引脚的状态是 ON(常开),当这两个引脚的闭合(短接)时间超过一定阈值主板则进行开关机操作,当时间更长一点则进行强制关机的操作。所以我们只要想办法远程控制这两个引脚的开合就可以实现远程开机和远程强制关机(当远程操作的时候电脑宕机了就会发现远程强制关机多么重要……),同时顺便把 WOL 给支持进去。

0x2

了解了主板开机的原理后开始考虑下如何实现目标。大概的上网搜索了一下信息,发现了一个 Blinker 平台提供了一大坨非常方便入手的 SDK 和文档之类的,配合廉价的 ESP 8266 模块可以快速搭建物联网设备。这样我们可以通过 ESP 8266 + 继电器 + Blinker 平台并稍微动手接一下电路构建一个远程开关机模块。

需要的物料:

  • ESP 8266 ESP-01s 模块
  • ESP-01s 继电器模块(上游厂家已经组装好的配合 ESP 8266 ESP-01s 的继电器模块,通过 ESP 8266 的 GPIO 0 控制,低电平激活)
  • 杜邦线若干
  • CH340C 烧录器


需要的软件(点击可查看或下载)

Arduino IDE 配置

  • 首选项 - 附加开发板管理器网址 输入 https://arduino.esp8266.com/stable/package_esp8266com_index.json
  • 工具 - 开发板 - 开发板管理器 - 搜索 8266 并安装
  • 项目 - 加载库 - 加载 .ZIP 库 - 选择下载的 Blinker SDK
  • 安装 CH340 驱动
  • 工具 - 开发板 - ESP8266 Boards - 选择 Generic ESP8266 Module
  • ESP 8266 插烧录器,烧录器插 USB
  • 工具 - 端口 - 选择烧录器所使用的的端口

需要的工具

  • 螺丝刀
  • 脑子和手

其他

需要先在点灯的 App 中参照下图添加设备:

0x3

获取到 Secret Key 并且添加功能按钮结束后参照如下代码(代码写的烂请多见谅;其中包括硬件启动和 WOL ):

#define BLINKER_WIFI
// 不加密通信,减小固件体积,我提供的固件编译后较小可以去掉这一行
#define BLINKER_WITHOUT_SSL
// 继电器为 ESP 8266 的 GPIO 0 控制
#define RELAY 0

#include <Blinker.h>

const char *auth = "{申请的 Secret Key}";
const char *ssid = "{2.4G WiFi 名称}";
const char *pwd = "{WiFi 密码}";

WiFiUDP UDP;
char wolBuffer[102];
// 目标主机 MAC 地址
const char mac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

// 绑定 Button
BlinkerButton PowerButton("btnTogglePower");
BlinkerButton HardShutButton("btnHardShut");
BlinkerButton WakeOnLANButton("btnWakeOnLAN");

void setup() {
  Serial.begin(115200);

  BLINKER_DEBUG.stream(Serial);

  // 定义 GPIO 0 为输出端
  pinMode(RELAY, OUTPUT);
  // 默认 GPIO 0 高电平,继电器模块为低电平激活
  digitalWrite(RELAY, HIGH);

  Blinker.begin(auth, ssid, pwd);

  // 绑定事件
  PowerButton.attach(OnPowerButtonTap);
  HardShutButton.attach(OnHardShutButtonTap);
  WakeOnLANButton.attach(OnWakeOnLANButtonTap);
  
  UDP.begin(9);
  WOLPacketInit();
}

void loop() {
  Blinker.run();
}

// 生成 WOL 数据包
void WOLPacketInit(){
  int i, j;
  
  for(i = 0; i < 6; i++){
    wolBuffer[i] = 0xFF;  
  }
  
  for(i = 0; i < 16; i++){
    for(j = 0; j < 6; j++){
      wolBuffer[6 + i * 6 + j] = mac[j];  
    }
  }
}

void SendWOLPacket(){
  // 向指定广播地址播报 WOL 数据包
  // Broadcast 可以通过 ifconfig 查看,WOL 端口是 7 或 9 可以自己尝试
  UDP.beginPacket("{Broadcast (广播地址)}", 9);
  UDP.write(wolBuffer);
  UDP.endPacket();
}

void OnPowerButtonTap(const String & state) {
  digitalWrite(RELAY, LOW);
  // 200ms 短按开机
  Blinker.delay(200);
  digitalWrite(RELAY, HIGH);
}

void OnHardShutButtonTap(const String & state) {
  digitalWrite(RELAY, LOW);
  // 5000ms 长按强制关机
  Blinker.delay(5000);
  digitalWrite(RELAY, HIGH);
}

void OnWakeOnLANButtonTap(const String & state){
  SendWOLPacket();
}

将上述代码通过 CH340C 烧录到 ESP 8266 中,等待烧录成功

可以提前打开 工具 - 串口监视器 查看,出现下面这些信息即为烧录成功,可以在点灯 App 上点击按钮操作一下看一下是否正常(在代码里相应位置写一下日志输出,我没写……)。

0x4

软件和烧录部分准备结束,下面要把模块接入到机箱里面。首先一个问题是模块的供电从哪里来,第一想到的是改一个 USB 接口然后通过外接电源供电,但是这样就要额外拖一条线在外面总感觉很蠢。突然想起来电脑的电源肯定是有持续供电的,否则一些电脑的关机后 USB 口持续供电功能怎么来的。查阅了一下 24 PIN 电源针脚定义,发现的确是有持续供电的针脚( PIN 9,5V SB ),刚好满足继电器模块的工作电压范围( DC 5V - 12V )。

所以我们只需将供电正极接在 PIN 9,负极接在随便一个 GND (接地)针脚即可(距离 PIN 9 最近的 GND 是 PIN 7 ),如图所示:

继电器模块提供了 NO、COM、NC 三个接口,其中 NO 是常开端(电路非闭合),NC 是常闭端(电路闭合),COM 是公共接口。所以我们只需要用到 NO 和 COM 两个接口,平常是常开状态,根据上文的代码当 ESP 8266 收到对应指令后会将 GPIO 0 口输出低电平进而控制继电器闭合,模拟开机按键的操作,GPIO 0 口输出低电平的时间就是按下电源按键的时间,短按开机长按强制关机。

按照要求接好线:

然后将 Power SW 线接回主板控制针脚,主机上电试一下:

(此处假装有动图或者视频)

可以看到手机上点击电源后伴随着继电器一声清脆的 “咔哒” 声,电脑成功开机~点击硬关机后电脑也成功强制关机,WOL 功能因为没有网线所以暂时没法测试,不过大差不差应该是没问题的。

0x5

最后要考虑的问题是,怎么把这个模块稳妥的放在机箱内。毕竟有很多裸露的触点机箱内又有金属部分很容易误触导致短路,轻则模块 工作异常,重则主板 GG 。

经过慎重的考虑…… 我决定发挥垃圾佬的精神,用一个地上捡的自封袋把模块装起来(绝缘),然后用扎线带绑在内部的电源线上(固定),这样最低成本解决两个问题简直美哉~

0x6

至此,这套远程开机模块已经可以完美的初步运行,接下来可以考虑进行一系列的优化:

  • 设备运行状态判断

    • 可以通过主板上 Power LED 针脚判断,如果主板正常上电则 Power LED+ 为高电平,判断此针脚电平高低即可得知设备是否正常启动。
    • 其次可以通过 Ping 去判断设备是否运行并正常进入系统且连接网络。
  • 接入其他智能设备

    • Blinker 提供的 SDK 可以将我们的设备接入诸如 “小爱同学”、“Siri” 之类的智能设备 / 语音助手,可以实现躺在床上手机都不用拿起来,直接来一句 “Hey Siri,打开老子的电脑”
  • OTA 更新固件

    • 看了下 Blinker 的文档,似乎是支持远程更新固件,这样就不用每次更新程序都要拆开机箱拿出芯片再烧录(天知道当时我为什么要买这么个全铝闷罐子机箱,拆卸困难散热费劲简直垃圾)。不过这个功能要付费买专业版才可以( 99 一年也不贵),等心情好再去折腾。

做完之后算了一下成本,ESP 8266 + 继电器模块大概 16 元左右,杜邦线原来用剩下的大概几毛,烧录器 10 块左右可以用到把我送走。其实这价钱可以买一个成品的远程开机设备了,但是毕竟自己瞎折腾才算是 Geeker 嘛。享受一下自己从查资料到动手最后实现目标功能的过程才是最大的乐趣。