その1の続き、SORACOMさんのキャンペーン価格で入手したSORACOM LTE-M Button for Enterprise (ひげ無しボタン)をぽちっとするだけで、遠隔地のPCの電源が入り、連動して無線設備の電源が入るところを目指してやってみましたので、手順を紹介します。
いままではPCからWOLしていたものを、
SORACOMボタンとAWS Lambdaを使用して、このような感じを目指します。
1. ルーター周りの下準備
SORACOMボタンからLambdaまでの経路はその1で設定しましたが、その2ではAWS Lambdaが生成したWOLマジックパケットをインターネット側からルーターを超えて中に入れてあげる必要がありますので、ルーターの設定をします。まずは手近な自宅側からです。
-1. ルーターのNAPT設定で、自宅側変動グローバルIP宛てのパケットをLAN内にブロードキャストさせる
ここではNEC製のルーターの設定を一例として紹介します。適宜、お手持ちのルーター設定と読み替えてください。
ここでは例としてWOL用ポート番号UDP/12345、LAN内のサブネットは 192.168.0.0/24 とします(PCのIPアドレスは192.168.0.1〜192.168.0.254のいずれか)。
(1). IPv4パケットフィルタ設定
インターネット側から、UDP/12345番ポート宛てのパケットをLAN内に通過させます。セキュリティ上の穴となりますので充分ご注意ください。
(2). IPv4ポートマッピング設定(NAPT設定)
インターネット側の自宅側変動グローバルIPのUDP/12345番ポート宛てに届いたパケットを、LAN側の192.168.0.255宛てにフォワードします。192.168.0.255すなわち、192.168.0.1〜192.168.0.254までブロードキャストする設定です。WOLはスリープしているPCを起こす機能なので、IPが割り当てられていない可能性が高く、個体識別はMACアドレスで行い、IPはブロードキャストで指定する必要があります。
なおルーターによってはブロードキャストに対応していないものもあるようです。
2. WOL対象のPCの設定を確認
LambdaへのWOLパケット送信部を実装するためには、自宅側のPCの情報が必要ですのであらかじめ調べておきます。
-1. 自宅側変動グローバルIPアドレス
最終的にはDDNS対応しますが、ここでは単純にIPアドレス直打ちでやってみます。確認くんで自宅側変動グローバルIPアドレスを調べて控えておきます。
-2. 遠隔で電源を入れたいPCのMACアドレス
WOL個体識別はMACアドレスで行いますので、遠隔で電源を入れたいPCのネットワークアダプタのプロパティからMACアドレス(物理アドレス)を控えておきます。
Windowsであれば、コントロールパネル – ネットワークとインターネット – ネットワーク設定から、対象のネットワークアダプタ。詳細(E) – 物理アドレスを控えます。
3. LambdaにWOLパケット送信部を実装
いよいよ本題のLambdaへのWOLパケット送信部の実装です!
-1. Lambdaから、その1で作成したLambda関数(soracom-test)を開きます。
-2. 以下のコードをLambda関数に貼ります。
const portに設定したUDPポート番号、const addressに自宅側変動グローバルIPアドレス、const macに電源を入れたいPCの物理アドレスを記入し、右上の「保存」を押します。
const dgram = require('dgram'); const port = 12345; const address = 'xxx.xxx.xxx.xxx'; const socket = dgram.createSocket('udp4'); exports.handler = function(e, ctx, cb) { const mac = "YY-YY-YY-YY-Y-YY"; const packet = [ "FF-FF-FF-FF-FF-FF", mac, mac, mac, mac, mac, mac, mac, mac, mac, mac, mac, mac, mac, mac, mac, mac ].join("-").split("-"); packet.forEach((value, index, array)=>{ array[index] = parseInt(value, 16); }); const buffer = Buffer.from(packet); console.log('event: %j', e) console.log('context: %j', ctx) const event = JSON.parse(JSON.stringify(e)); if(event.clickType == 1) { // 単押し // WOLマジックパケット送信 socket.send(buffer, 0, buffer.length, port, address, (err, bytes) => { if (err) throw err; var text = buffer.toString('hex', 0, buffer.length); console.log(text); }); } else if(event.clickType == 2) { // 2回押し } else { // 長押し } };
4. いざ、SORACOMボタンを押す!
記事では自宅側のみのご紹介ですが、シャック側も全く同様です。
周辺設定は初心者には少々大変でしたが、逆に言うと調べさえすればこれだけの準備で自在にLambdaを駆動できるのはすごいことだと思いました。
長文でしたが、最後までお付き合いいただきありがとうございました。