使用群晖唤醒局域网内其他设备
之前我写了一篇用树莓派唤醒内网设备的文章,现在再写一篇通过群晖唤醒内网设备的。当然还是要你稍微了解 Linux
系统才可以。用的代码和之前文章的一样。
代码目录
首先在群晖套件中心安装 Web Station 和 Node.js v8(v12 的 npm
安装会提示 zlip
有问题的)。通常 Node.js 会在你安装某些应用时候就会装上的,如果没有装你需要先安装一下。
安装好之后打开 File Station 左边的列表应该就会出现一个 Web
文件夹,在文件夹里建一个 node
文件夹作为存放相关代码文件用,并且在 node
文件夹中再新建一个 logs
文件夹存放日志用。
然后修改一下之前树莓派文章的代码,主要是 pm2_config.json
文件改为绝对路径。一般 Web
文件夹绝对路径是 /volume1/web/
,其中 volume1
是储存池的目录,如果你装了多个硬盘或者组阵列的话就需要你自己在终端查一下你 Web
文件夹的目录了。
{
"apps" : [{
"name" : "nodewol",
"script" : "/volume1/web/node/index.js",
"cwd" : "/volume1/web/node/",
"instances" : "1",
"log_date_format" : "YYYY-MM-DD HH:mm Z",
"log_file" : "/volume1/web/node/log/wol.log",
"error_file" : "/volume1/web/node/log/wol-err.log",
"out_file" : "/volume1/web/node/log/wol-out.log",
"watch" : true
}]
}
群晖唤醒方式
群晖上不能安装 waleonlan,所以我们需要使用 nodejs 的 wol 包来实现唤醒设备。
/**
* Post请求执行 shell 命令
* 只要向这个地址提交 {"mac":"设备 MAC 地址"}
* kaiyuan Hsie
* https://boxks.com
* */
//1. 导入express
var express = require('express');
// 解析器 需要安装 npm install -g body-parser
var bodyParser = require('body-parser');
// WOL 包 npm install wol
var wolfun = require('wol');
// 时间模块
var sd = require('silly-datetime');
var nowTime=sd.format(new Date(), 'YYYY-MM-DD HH:mm:ss');
// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false });
// 创建服务器
var router = express.Router();
router.post("*", urlencodedParser, function (request, response) {
//
if (!request.body) {
response.send("请提交设备 MAC 地址");
} else {
var thisMAC = request.body.mac;
wolfun.wake(thisMAC, function(error, postText){
if (error !== null) {
console.log('-wol- exec error: ' + error+' '+nowTime);
response.send('exec error: ' +error);
} else {
console.log("-wol- "+thisMAC+' '+postText+' '+nowTime);
response.send('已经叫咗电脑开机!');
}
});
}
});
module.exports = router;
安装 PM2
在群晖控制面板的「终端机和 SNMP」中勾选「打开 SSH」然后应用。
接着打开你电脑上的终端,Windows 上按 Win+R 然后输入 CMD,或者在开始菜单按钮上右键,选择打开 CMD。
打开只会输入 ssh user@192.168.2.117
这样的命令,其中 192.168.2.117
替换为你群晖的 IP。通常在群晖页面右下角的系统状况可以看到。而 user
替换为你群晖的账号名。然后会提示你输入密码,这个时候你输入任何内容都不会显示出来的,你不用管,直接输入密码只会按 Enter
就好了。
如果你 nodejs 默认是 v12,则先输入 nvm set 8.9.4
切换回 v8 才能正常使用 npm!
然后安装 PM2
npm install pm2 -g
等待安装好只会会直接显示 pm2 的路径的,注意记下来,因为后面我们要用绝对路径来运行 pm2 的。这个路径一般都是在 Node.js 目录下面。
/volume1/@appstore/Node.js_v8/usr/local/bin/pm2
or
/volume1/@appstore/Node.js_v8/usr/local/lib/node_modules/pm2/bin/pm2
你可以测试一下运行上传的代码。
/volume1/@appstore/Node.js_v8/usr/local/bin/pm2 start /volume1/web/node/pm2_config.json
如果没有提示红色错误,直接显示表格运行状态的话就 OK 了。然后现在关掉这个测试。因为我们要用群晖的任务计划让他开机自动启动。
/volume1/@appstore/Node.js_v8/usr/local/bin/pm2 stop /volume1/web/node/pm2_config.json
设置开机启动
打开群晖的控制面板,选择任务计划,新增>触发的任务>用户定义的脚本。
任务名称随便你填写一个,用户账号选择 root。然后在任务设置页面「用户定义的脚本」上面测试的那段代码,然后按确定。
保存好只会记得勾选刚新建的项目前面的勾,然后右键>运行。这样就完成了。
设置反向代理
在控制面板中的「应用程序门户」里面的「反响代理服务」新增一项。
描述随便填,协议选择 Https
,端口就是你想用来访问的端口,例如 10505
(填5位数可以防止和常用端口冲突),勾选「启动 HTTP/2」,下面的「目的地」就是填 node.js 应用的信息,地址就是 127.0.0.1
,端口就是应用的端口 5050
。然后确定。
这样就可以把 mac
地址通过 post
发给 https://192.168.2.117:10505/wol
这个地址来唤醒局域网内的设备了。
至于 https 证书问题,如果你用群晖的 DDNS 就不需要额外操作,如果你是用自己的域名就需要用 acme 申请Let’s Encrypt证书了。
当然你要在外网访问还要在路由器上设置端口映射。我之前的文章有写,这这里就不重复了。