クラウド全盛の世の中ですが、自宅のPCでないとできないこと、たくさんありますよね。外出先から使いたくなることもたまにあります。
外出先から使えるように、ダイナミックDNSとポート開放を設定してあっても、肝心の電源が入っていなければ使えません。とはいえ、たまにしかないことのために、電源入れっぱなしは電気代がもったいないし、セキュリティも気になります。
そこで、自宅でRaspberry Piを常時起動しておいて、Raspberry Pi経由でPCをWake-on-LANで必要なときだけ起動するように設定しましょう。外出先からの起動の起点には、スマートフォンアプリのボタンを使います。
全体像は下記の通りです。
(スマートフォン)→(Codyl Connect)→(自宅Raspberry Pi)→(自宅PC)
前提知識
この記事では、下記の説明は省略します。
自宅ネットワークの固定グローバルIPまたはダイナミックDNS設定手順
自宅ネットワークのポート開放手順
用意するもの
PC
OSはWindowsまたはLinux
有線LAN
マザーボードや有線LANのネットワークアダプターがWake-on-LANをサポートしていること
Raspberry Pi
SDカードにraspbianインストール済み
有線LANまたは無線LAN
ネットワーク環境
インターネットに常時接続
グローバルアドレスで接続されていること
固定グローバルIPまたはダイナミックDNSが使えること
スマートフォン
作業1 PCのWake-on-LAN設定
PCがマジックパケットでWake-on-LANできるように設定します。マザーボードやOSにより設定方法が違うので、ポイントだけ紹介します。マザーボードの設定とOSの設定を両方行わないといけないケースが多いと思います。
マザーボードの設定
PCのBIOS画面からWake-on-LANを有効にする
OSの設定
Windowsの場合
デバイスマネージャー → ネットワークアダプター → (有線LANのアダプター) → プロパティ
ネットワークアダプターのドライバーによって異なるが、「詳細設定」や「電力の管理」にWake-on-LANの設定があることが多い。Magic PacketでのWake-on-LANをオンにする。
Linuxの場合
MACアドレスを後で参照するので、確認してメモしておきます。
作業2 Raspberry Piにetherwakeをセットアップ
etherwakeをインストールして、一般ユーザーからもWake-on-LANのマジックパケットを送信できるようにします。
sudo apt-get install -y etherwake
sudo chmod +s /usr/sbin/etherwake
PCをシャットダウンさせた状態で、テストしてみましょう。下記のeth0はRasbperry Piが有線LANに接続されている場合の例です。無線LANの場合はwlan0に変更してください。また、XX:XX:XX:XX:XX:XXはPCのMACアドレスに書き換えてください。
etherwake -i eth0 -b -D XX:XX:XX:XX:XX:XX
コマンド実行してPCが起動すればOKです。
作業3 Raspberry Piでwebhookを作成
外出先からetherwakeを起動するために、Raspberry Piでwebhookサービスを起動しましょう。nodejsを使えば簡単なプログラムで実装できます。まずは最新の安定版nodejsをセットアップしましょう。
sudo apt-get install -y nodejs npm
sudo npm cache clean
sudo npm install n -g
sudo n stable
node --version
このブログ執筆時点では7.10.0がインストールされました。続いて、webhookのプログラムです。
sudo apt-get install -y uuid-runtime
mkdir webhook_etherwake
cd webhook_etherwake/
npm install express
npm install body-parser
下記の内容をwebhook_etherwake.jsというファイル名で保存します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env node
// parameters to be modified
var TOKEN='XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'; // Your own secret token
var MACADDR='XX:XX:XX:XX:XX:XX' // MAC address of your PC
var PORT=9003
//
var command='/usr/sbin/etherwake -i eth0 -b -D ' + MACADDR;
var express = require('express');
var bodyParser = require('body-parser');
var exec = require('child_process').exec;
var app = express();
app.set('port', process.env.PORT || PORT);
app.use(bodyParser.json());
app.post('/wake', function (req, res) {
var wake_event = req.body;
console.log('incoming event:' + JSON.stringify(wake_event));
if (!wake_event.token ||
wake_event.token != TOKEN) {
console.log('invalid token');
res.send('invalid token');
return;
}
var child = exec(command,function(error, stdout, stderr){
console.log('exec command:' + command);
console.log(stdout);
res.send('OK');
});
});
var server = app.listen(app.get('port'), function() {
console.log('Listening on port %d', server.address().port);
});
プログラムの先頭のTOKENとMACADDRとPORTは書き換えます。TOKENはuuidgenコマンドで生成したランダムなUUIDを使うのが良いでしょう。これが漏洩すると、誰でもあなたのPCを起動できるようになります(大した実害はないかもしれませんが)。MACADDRはPCのMACアドレスに書き換えます。PORTはポート開放に使用するポート番号です、すでに9003を他のポート開放で使っていなければそのままで良いでしょう。
以下、XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXは、セットしたTOKENに置き換えてください。
準備ができたら早速起動してみましょう。下記のコマンドで起動したらListening on port 9003と表示されます。
chmod +x webhook_etherwake.js
./webhook_etherwake.js
別のシェルから下記のコマンドを実行して動作確認します。
curl -X POST -H "Content-type:application/json" -d '{"token":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"}' http://localhost:9003/wake
OKと表示されて、PCが起動することを確認しましょう。
続いてこのプログラムをRaspberry Piで自動的に起動するように設定します。
crontab -e
@reboot /usr/local/bin/node $HOME/webhook_etherwake/webhook_etherwake.js > /dev/null 2>&1 &
リブート後、先ほどのcurlコマンドをもう一度実行して、正しく動作することを確認します。
作業4 ポート開放
Raspberry Piのポート9003をインターネットからアクセスできるようにポート開放します。
作業5 Connectアプリをインストール
スマートフォンにCodyl Connectアプリがインストールされていなければ、インストールします。AppStoreでcodylで検索するか、下記のリンクから開いてください。
Connectのアカウント登録がまだであれば、Connectアプリからアカウント登録が可能です。アカウント登録を済ませて、ログインしましょう。
作業6 シナリオ作成
(2)わかりやすいシナリオ名に変更
(3)説明を書く
(4)再実行頻度を0分に変更
(5)「イベントウォーク新規作成」をクリック
(6)mainの箱の下のプラス記号をクリックしてステートを追加
(7)追加されたステート(state2)をクリック
(8)「ステートにコネクターを追加」をクリック
(9)新しいコネクターを作成を選んで、「ボタン」を選択
(10)4つのボタンのうち好きなものを選択
(11)「作成」をクリック
(12)メソッドに「TRIGGER: when pushed」を選択
(13)textの値に「PC起動」と記述。この文字列がスマートフォンのボタンに表示されます。一番下の「閉じる」をクリック。
(14)state2の下のプラス記号をクリックしてステートを追加、追加されたステート(state5)をクリック。
(15)「ステートにコネクターを追加」をクリック
(16)新しいコネクターを作成を選んで、「WebHook」を選択
(17)わかりやすい名前を入力(例:「WebHook(PC起動)」)
(18)外部サービスのURLに、「http://自宅のアドレス:9003/wake」と入力。自宅のアドレスには固定IPの場合はIPアドレス、ダイナミックDNSの場合はDNSホスト名を入れます。
(19)「作成」をクリック
(20)メソッドに「ACTION: post message」を選択
(21)tokenの値にRaspberry Piで設定したTOKENを入力。一番下の「閉じる」をクリック。
(22)上部のリストからシナリオ名をクリックしてシナリオプロパティ画面に戻る
シナリオの動作中は、スマートフォンのConnectアプリ上で、「PC起動」ボタンがアクティブになります。このボタンを押したら自宅のPCが起動します。