Help us understand the problem. What is going on with this article?

RaspberryPi使って遠隔地から自宅PCをスリープ復帰させる

More than 1 year has passed since last update.

目的

我が家はマンション契約の無料インターネットでグローバルIPがもらえません。そのため遠隔地からの自宅PCからのリモートデスクトップ接続は諦めていたのですが、最近chromeリモートデスクトップの存在を知りました。これで接続できる!!となったら、次はPCを常時起動しっぱなしなのが気になりはじめたので、Wake-on-LANとbeebotteを利用して、外出先からpcのスリープを解除してみました。

概要

同じローカル環境内にWindowsPCに対して、Raspberry piがwake_on_lanを送信。発動タイミングとしては、Raspberry piがbeebotteを監視して、beebotteにリクエストがあればwolが仕込まれたスクリプトをキックする。

名称未設定-1.jpg

WOLの設定(windows側)

以下のページを参考にwindowsPCで実施できるようにしました

Wake on Lan で Windows 10 の PC を遠隔で起動する

この時点でAndroidアプリWake On Lanとか使ってLAN環境下であれば、スマホからスリープ復帰できるようになるので便利ですね。ただ外出先ではまだ出来ず。

wolを設定する

wol用のpythonライブラリとかも調べてたんですけど、あんまり良さそうなのがなかったため、バイナリを使おうと思います。
ほぼこの方の記事の通りですが、一応手順を書いておきます。

1.wgetで下記のファイルを取得する

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

2.gccでコンパいる

gcc wol.c -o wol

これでwolというバイナリファイルが生成されたと思います。
起動オプションとして、スリープから復帰したいpcのipアドレスとmacアドレスを渡します。

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

これでスリープから復帰させたいpcが、同じネットワーク上にいる場合はラズパイから起動できるようになりました。やったね。まだまだこれでは役に立たん。次はラズパイの監視先を作ります。

beebotteの設定

beebotteに行き、アカウント作成。その後channel -> Create Newで新規チャンネルを作成
channel Name: raspberrypi
channel Description: ラズパイ
resource name: action
resource description:アクション
image.png

上記の設定で作りましたが、全部好きな値にして大丈夫です。
ただあとで、channel Nameとresource nameは使うので自分の設定値を覚えておいてください

出来たらこんな感じ。
image.png

で、チャンネル名クリックして、channel Tokenをメモっとく

image.png

raspberrypiからbeebotteを監視する

今回はpython3を使います。

beebotteを監視するためのライブラリインストール

sudo pip3 install paho-mqtt

beebotteを監視するためのスクリプト

wol.py
import paho.mqtt.client as mqtt
import json

TOKEN = "[beebotteのトークン]"
HOSTNAME = "mqtt.beebotte.com"
PORT = 8883
ADDRESS = "raspberrypi/action"

def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))
    client.subscribe(ADDRESS)

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

client = mqtt.Client()
client.username_pw_set("token:%s"%TOKEN)
client.on_connect = on_connect
client.on_message = on_message
client.connect(HOSTNAME, port=PORT, keepalive=60)
client.loop_forever()

これで繋がったタイミングと、何かしらのメッセージがbeebotteに来たタイミングで文字が出力されるようになりました。あとはon_messageの関数内でwolを起動できるようになればOKです。

pythonからwolを起動する

pythonから外部プログラムを起動するのはsubprocessってのが良さそう。
ということでsubprocessを使って同じディレクトリにあるwolのバイナリを呼び出します。

wol.py
import paho.mqtt.client as mqtt
import json
import subprocess #追加

TOKEN = "[beebotteのトークン]"
HOSTNAME = "mqtt.beebotte.com"
PORT = 8883
ADDRESS = "raspberrypi/action"
MACADDR = "[対象pcのMACアドレス]" #追加
IPADDR = "[対象pcのIPアドレス]" #追加

def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))
    client.subscribe(ADDRESS)

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))
    #subprocessは配列でオプション渡す
    subprocess.call(["./wol",IPADDR,MACADDR]) # 追加

client = mqtt.Client()
client.username_pw_set("token:%s"%TOKEN)
client.on_connect = on_connect
client.on_message = on_message
client.connect(HOSTNAME, port=PORT, keepalive=60)
client.loop_forever()

あとはこのwol.pyを実行しつつ、何かしらのメッセージをcurlでbeeboteを送ってみましょう。

curl -i -H "Content-Type: application/json" -X POST -d '{"data":"Hello World"}' http://api.beebotte.com/v1/data/publish/raspberrypi/action?token=[大分上のほうでメモったchannel Token]

スリープ状態のpcが復帰すれば完成です。
raspberrypiでこのpython実行しっぱなしにしておけばいつでもインターネット上から家のpcがスリープ復帰できますね。やったね。

ここからIFTTTと連携したりして、beebotteへのwebリクエストをslackからとかgoogle homeからとかにすると更にドヤれますが、もう私は疲れたので各自やっておくように。以上です。

参考サイト

Raspberry PiからWOL(Wake On Lan)
IFTTTとBeebotteを使ってGoogleHomeからRaspberryPiを操作する

forstartups
「世界で勝負できる産業、企業、サービス、⼈を創出し、⽇本の成⻑を⽀えていく」 ために、「for Startups」というビジョンのもと、成長産業領域特化型の起業⽀援と転職⽀援を中⼼に事業を推進。 スタートアップ企業への戦略的資⾦⽀援や、成長産業領域に特化した情報プラットフォーム「STARTUP DBの運用、及び、大企業とのビジネス共創モデルによる産業エコシステム強化にも取り組む。
https://forstartups.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away