外出先から使えるように、ダイナミック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が使えること
- スマートフォン
- iOS 9.3以降のiPhone
作業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の場合
- 下記コマンドが起動時に実行されるようにする。
- ethtool -s eth0 wol g
MACアドレスを後で参照するので、確認してメモしておきます。
- Windowsの場合
- コマンドプロンプトからipconfig /all
- Linuxの場合
- シェルからifconfig -a
作業2 Raspberry Piにetherwakeをセットアップ
etherwakeをインストールして、一般ユーザーからもWake-on-LANのマジックパケットを送信できるようにします。
- sudo apt-get install -y etherwake
- sudo chmod +s /usr/sbin/etherwake
- 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
- 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と表示されます。
以下、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で自動的に起動するように設定します。
続いてこのプログラムを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)「ステートにコネクターを追加」をクリック
- (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を入力。一番下の「閉じる」をクリック。
シナリオの動作中は、スマートフォンのConnectアプリ上で、「PC起動」ボタンがアクティブになります。このボタンを押したら自宅のPCが起動します。
0 件のコメント:
コメントを投稿