ポート開放なしで家のパソコンを遠隔起動したいよ

家のデスクトップを外から起動したいと思い立ち、その方法を探しました。
起動さえできてしまえばchromeのリモートデスクトップでどうにでもなります。
ポート開放してWakeOnLanすればいいらしいのですが、
家で使ってるルーターはアパートに元からついてるものなので、ポート開放なしでできるだけ最小費用でパソコンを遠隔起動する方法を模索しました。
最終的にラズパイをルーターにしてRealVNCで接続してWokeOnLanで起動することにしました。
この方法で外出先からパソコンだけでなくスマホからでも自宅のパソコンを起動することが可能です。


#環境
Winodws 10 Pro
Raspberry Pi Zero W (OSはRaspibian)

#BIOS／UEFIとOSの設定
最初にWakeOnLanという遠隔起動を有効にするためにBIOSとOS両方で設定行う必要があります。

まずはBIOSで設定をします。
BIOSそれぞれで方法が違うのですが、とりあえず自分が設定したものを書いておきます。
・内蔵LANから起動>有効
・ACPI設定>PCIEデバイス電源ON>有効
自分はこの２つを設定しました。
上のリンクに書いてあるように
・［WOL］
・［Wake On LAN ～］
・［Remote Wakeup］
・［PME Event Wake Up］
・［Power On by PCI Device（PCIによる電源ON）］ 
・［Power On By PCIE Device（PCIEによる電源ON）］
など様々な書き方があるようです。

次はOSの設定です。
ここでもネットワークアダプターによって様々です。
今回はWinodows10のやり方のみ書きます。
デバイスマネージャー>ネットワークアダプター>Realtek PCIe GBE Family Controller>詳細設定
から
ウェイクオンマジックパケットを有効

---
ちなみに自分のRealtek PCIe GBE Family Controllerのバージョンは10.31.828.2018です。
[Windows10にアップデートしたらWOLが出来なくなった](https://sukejob.com/contents/pc/windows10-wol.html)
上のリンクのように9.1.2015のようにドライバーが古いと使えないという報告もあるので気をつけましょう。
ドライバーのダウンロードのリンクが先程の記事とは変わっているように思えるので念の為貼っておきます。
https://www.realtek.com/ja/downloads

---

参考:
[Wake on Lan で Windows 10 の PC を遠隔で起動する](https://qiita.com/gam0022/items/4c2a3fdc29ac4977b51c)
[Wake On LANでコンピュータを起動する (1/2)](http://www.atmarkit.co.jp/ait/articles/0602/25/news014.html)
[Wake On LANでコンピュータを起動する (2/2)](http://www.atmarkit.co.jp/ait/articles/0602/25/news014_2.html)

#ラズパイでVNCの設定

RealVNCのアカウントを作成することで、クラウドを介してインターネット越しのVNCにアクセスすることができます。
クラウドを介してくれるので自分でポートを開放したりする必要がないわけです。
https://www.realvnc.com/
アカウントはHome版で大丈夫です。
アカウント作成完了後、自分のキーが発行されます。
![REALVNCアカウント黒塗り.png](https://qiita-image-store.s3.amazonaws.com/0/246279/1f3307fb-cc4e-05ae-d003-76ce84281bb1.png)
このキーは後ほど使います。

RealVNCを使用するにはホスト側にVLCViewerクライアント側にVLCserverが必要です。
嬉しいことにラズパイのOSであるRaspbianにはVLCserverが最初から入っています。
しかしデフォルトでは無効になっているので有効にします。
参考:https://iot.keicode.com/raspberry-pi/raspi3-vnc-setup.php
ターミナルで以下を打ちます

```
$ sudo raspi-config
```

そしてInterfacing Options>VNCと選択し、VNCサーバーを有効化しますかと聞かれたらYesを選択します。
完了したら再起動しておきます。

```
$ sudo reboot
```
そして再びターミナルを開き、

```
$ sudo vnclicense -add KEY
```
この`KEY`の部分に先程の自分のアカウントに書いてあったキーをいれます。

つぎにラズパイを操作する側のパソコンにVLCViewerをいれます。
https://www.realvnc.com/en/connect/download/viewer/windows/
スマホでもアプリがあるのでできます。
開いてアカウントを入力するとAdressBookにraspberrypiがあるはずです。
接続できるかどうかを確認してみてください。

参考:
[ポートの開放することなく、Respberry Piに外からアクセスする](https://qiita.com/moritalous/items/6ddd36f895ca656eac80)
https://ameblo.jp/hagechip/entry-12303416402.html

---
様々な記事で、というか[公式](https://www.realvnc.com/en/connect/docs/raspberry-pi.html#raspberry-pi-setup)でもlisensingという項目からRealVNCのライセンス認証を行っているのですが、自分のVNCserverにはlisensingは見つかりませんでした。
代わりに`sudo vnclicense -add KEY`をすることでうまくいきました。
もし詳しい方がいらっしゃれば教えてください。
公式には"ラズベリーパイに特有のVNC Connectは、クラウドと家庭の加入者への直接接続を提供するために事前にライセンス供与されています。"と書いてあるので、ラズパイ版は特別なのかな？

---

#PythonでWake On Lan
ネットワーク機器にはMACアドレスと呼ばれる物理アドレスが割り当てられます。
WakeOnLanはそのMACアドレスを16回繰り返した信号であるマジックパケットを送ることでパソコンを叩き起こす技術です。思ったより強引ですね。
仕組み自体は簡単なので様々な方法があります。
ソフトを使う方法もありますが、今回はラズパイにもともと入ってるpythonを使いたいと思います。
https://github.com/bentasker/Wake-On-Lan-Python
上のgitからラズパイにダウンロードします。
ダウンロードした`Wake-On-Lan-Python`の`wol_config.ini.example`の中身は以下のようになっています。

```wol_config.ini.example
# Save this file as .wol_config.ini in the same directory as wol.py

[General]
broadcast=192.168.1.255

[myPC]
mac=00:2a:a0:cf:83:15

[myLaptop]
mac=00:13:0d:e4:60:61
```

これに起動したいパソコンのIPアドレスとMACアドレスをしらべて置き換えます。
windowsではそれぞれ`ipconfig`と`getmac`でわかります。
そして`wol_config.ini.example`というディレクトリ名を`.wol_config.ini`に変えます。最初のドットを忘れずに。

```.wol_config.ini

[General]
broadcast=(IPアドレス)

[myPC]
mac=(MACアドレス)
```

次にPythonの仮想環境を作り、有効化します。ここでは仮想環境の名前を`wolvenv`とします。
ラズパイのターミナルで、

```
$ python -m venv wolvenv
$ source wolvenv/bin/activate 
```

そしてパソコンを起動してみます。

```
(wolvenv)$cd Wake-On-Lan-Python
(wolvenv)$python wol.py myPC
```
うまく起動できたでしょうか。

#クリックで起動
前項の`python wol.py myPC`をすることで起動できるのですが、スマホ等でターミナル打つのはだいぶ無理があると思います。
そこでシェルファイルを作成することでクリックのみで起動できるようにします。
シェルファイルによってlinuxの複数のコマンド操作を一度に行うことができます。

```wol.sh
#!/bin/bash
cd /home/pi/Desktop
source wolvenv/bin/activate
cd wol-python
python wol.py myPC
```
このシェルファイルをデスクトップにおいて置きます。(ここでは`wolvenv`も`Wake-On-Lan-Python`もデスクトップにあるとします)

そしてターミナルで

```
chmod 777 /home/pi/Desktop/wol.sh
```
これでwol.shをクリックし、`Execute in Terminal`をクリックして起動したら成功です！


参考
https://ameblo.jp/hagechip/entry-12326256477.html

#おわりに
まさかこんなに大変だとは思いませんでした。WakeOnLanができる高機能ルーターを買うことでラズパイなしで出来るらしいです。もっと簡単なやり方があれば誰か教えてください。