Raspberry Pi 3でWoL(PCを遠隔電源ON)

以前ラズパイを使ってエアコンを遠隔操作する工作をした。

しかしながら信号の飛距離に難があるのと「家に帰ってからエアコンを付けても数分我慢すれば涼しくなるやん」という真理に辿り着いた結果、使用することはなくなってしまった。おしまい。

 

Wake On Lanのおはなし

ところで外出中、自宅PCの電源を点けて何やら操作したいと思ったことはないだろうか。一度はあるよな。

実は我が家では既にこのPC遠隔起動の環境が整っている。とはいっても以下のような流れだ。

[スマホ]→Chrome Remote Desktop→[自宅でつけっぱなしのVAIO P(Windows7)]→WoL信号を送信→[メインPC]が起動

 

Chrome Remote Desktopを使ってスマホから自宅のVAIO Pにリモートデスクトップ接続し、そこから「WoL信号を送るbatファイル」を起動してメインPCの電源を入れている。正直面倒臭い。

しかももうじきWindows7のサポート延長期間も切れるため、VAIO Pをインターネットに接続してつけっぱなしにするのも危険。この代替として眠っているラズパイを使えないか、と考えた次第だ。

 

 

 

面倒なのは外からの接続

これまでChrome Remote Desktopを使う面倒臭い方法を採用していたのは、外から自宅内PCに安全に接続する方法が確立できていなかったからだ。

しかし改めて以前の記事を見直してみたら、Discordのbotを使って外部からリモコンコマンドを叩いていた。これ使えるやん。これでWoLコマンドを送ってやればいいだけなのでは。天才か?

 

ラズパイからWoLを送る方法

ググったらすぐ見つかった。さすがラズパイ。技術知識の集合知すばらしい。

WOL送信部分は仙石浩明さんというすごい人が作ってくださっているようなので、以下のコマンドを叩きソースをDL。

wget http://www.gcd.org/sengoku/docs/wol.c

そして以下を叩いてコンパイルしたら終わり。

gcc wol.c -o wol

あとはWoL起動したいIPアドレス、MACアドレスを指定して起動するだけ。超簡単。

wol 192.168.x.x xx:xx:xx:xx:xx:xx

 

外から繋ぐDiscordのbot周りはそのまま流用

以前挑戦した際に!evalコマンドで文字通り何でもコマンドが叩けるようにしてある。

discord.png

なので、以下のようにbotに送信すればそのままWoLパケットを送ってくれるようになる。

!eval wol 192.168.x.x xx:xx:xx:xx:xx:xx

ただし、前回も書いたように、この方法ではラズパイ上で叩けるコマンドは何でも叩けてしまうためセキュリティ的には最悪。

evalコマンドを許さず、discordrbのスクリプト内できちんと新しいコマンドを定義してやる必要がある。

 

!wolコマンドを作成

以前書いたdiscordrbスクリプトをもとに、evalコマンドを削除しwolコマンドを追加

#wolコマンドを定義します
bot.command(:wol, help_available: false) do |event|
#!wolコマンド受信時に実行したいコマンドを定義します
comstr = '/home/pi/wol 192.168.x.xxx xx:xx:xx:xx:xx:xx'

# Discordの自分のユーザIDを指定することで、自分からのメッセージだけに反応するようにします。
if event.user.id == 自分のユーザーID then
event.respond 'WOLパケットを送信します:sunglasses:'
puts ( '[eakon bot/INFO]'+event.user.name+'(id:'+event.user.id.to_s+')'+'がwolコマンドを実行しました')
else
#自分以外が!wolコマンドを叩いた場合、追い返してログを標準出力します
event.respond '貴様は誰だ!:japanese_goblin:'
puts ( '[eakon bot/INFO]'+event.user.name+'(id:'+event.user.id.to_s+')'+'がwolコマンドを試行しました')
break
end

begin
#コマンドを実行します
result = system(comstr)
puts ( '[eakon bot/INFO]コマンド ' + comstr + ' を実行しました')
puts ( '[eakon bot/INFO]実行結果 ' + result.to_s )
if result
event.respond 'コマンドの実行に成功しました:blush:'
else
event.respond 'コマンドの実行に失敗しました:poop:'
end
rescue => e
'An error occurred: ' + e.message
end
end

コード全文はサンプルdiscordrb_wol.txtを確認してほしい。

 

実際にDiscordでコマンド送信

仕組み部分は変わっていないので問題ないと思いきや、WoLコマンドを送信してもPCが起動しない。

ラズパイをWi-Fi接続から有線LAN接続に変更し、こちらの記事を参考にetherwakeを使ってWoLパケットを送ることで起動できた。

001.png

結局何度も試してみると、元々のwolでは起動したりしなかったりで安定しない。起動することもあるのだが。

スリープ、休止状態ともに同様の現象。謎。

おそらくルーターかネットワーク周りが原因っぽいので、ラズパイは有線LAN固定にしてしばらくはwolとetherwakeを併用して様子を見てみる。

ひとまず動くようになったので今回はここまで。

コメントする