Wake on LAN for AV

はじめに

DLNA対応機器が増えて、離れた場所のテレビで録画番組を見ることができるようになりましたが、対象機器の電源をONにするためには、マジックパケットを送信するデバイスが必要です。無線LAN-APなどの機器は、その機能を有するものが増え、自宅のBuffaloのAPも一応対応していますが、

  • TVのWebブラウザからアクセスすると、タイムアウトが発生します。(一度事前に検索した機器に対して、再度確認をするため、接続機器数が多くなると時間がかかるようです。)
  • その時点で、電源が入っていない機器はリストに表示されません。(これはバグでしょう)

という具合で、使い物になりません。そのため、常時電源が入っている自宅サーバにCGIを置き、Wake on LAN(WoL)を実現します。

動作確認はCentOS5.8/httpd-2.2.3/php-5.1.6、クライアントはFireFox18.0.1/IE8.0でおこないました。

  • 機器選択画面
    wol1.jpg
  • パケット送信後
    wol2.jpg

構成

マジックパケットを送信するプログラムは、CentOSのレポジトリに含まれるether-wakeを使用します。
このCGIは以下の4つのファイルで構成します。

  1. /sbin/ether-wake - マジックパケット送信APL
  2. /var/www/wol/index.php - 機器選択用CGI本体
  3. /var/www/wol/wol.list - WoL対象機器情報ファイル
  4. /etc/httpd/conf.d/wol.conf - Apache用コンフィグファイル

index.php

phpで記述しました。perlでもかまわないのですが、最近PHPに浮気しています。以下のように、taskキーにより機器リストの表示とマジックパケットの送信のページを区別しています。別ファイルにした方が、すっきりしてPHPを使用する意義があるかも知れません。Perlの癖で....

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang ="ja" lang="ja" xmlns="http://www.w3.org/1999/xhtml">
<head>
<!--
        CGI for Power On Control with WoL
        Copyrigth 2013 Kazuhiro WATANABE
-->
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title>Power On Control with WoL</title>
        <style type="text/css">
                <!--
                        .table_0 {
                                color:#ff0000;
                                font-size:15pt;
                                text-align:center;
                                width:100%;
                        }
                        .table_0 th {
                                background-color:#90E0C0;
                                text-align:center;
                        }
                        .table_0 td {
                                background-color:#0000FF;
                                text-align:center;
                        }
                        .table_1 {
                                font-size:15pt;
                                text-align:center;
                                width:100%;
                        }
                        .table_1 th {
                                background-color:#90E0C0;
                                text-align:center;
                        }
                        .table_1 td {
                                background-color:#ADFF2F;
                                text-align:center;
                        }
                -->
        </style>
</head>
<body>
        <h1 align="center">Power On Control with WoL</h1>
<?php
  if( isset($_GET['task']) )  { $task = $_GET['task'];  }
  if( isset($_POST['task']) ) { $task = $_POST['task']; }
  if( isset($_GET['mac']) )  { $mac = $_GET['mac'];  }
  if( isset($_POST['mac']) ) { $mac = $_POST['mac']; }
  if( isset($_GET['dev']) )  { $dev = $_GET['dev'];  }
  if( isset($_POST['dev']) ) { $dev = $_POST['dev']; }
  if( $task == "send" ) { send_wol( $dev, $mac ); } else {show_list(); }
function show_list()
{
        printf( "       <table class=\"table_0\" >\n" );
        printf( "               <tr>\n" );
        printf( "                       <th>Device Name</th>\n" );
        printf( "                       <th>MAC Address</th>\n" );
        printf( "                       <th>Comments</th>\n" );
        printf( "                       <th>Command Buttom</th>\n" );
        printf( "               </tr>\n" );
        $lines = file( "wol.list" );
        foreach( $lines as $line )
        {
                if( $line[0] == ";" ) { continue; }
                $line = str_replace( array( "\n\r", "\r\n", "\r", "\n" ), '', $line );
                $data = split( ",", $line );
                printf( "               <tr>\n" );
                printf( "                       <td>%s</td>\n", $data[0] );
                printf( "                       <td>%s</td>\n", $data[1] );
                printf( "                       <td>%s</td>\n", $data[2] );
                printf( "                       <td>\n" );
                printf( "                               <form method=\"post\"  action=\"./index.php\">\n" );
                printf( "                               <input type=\"hidden\" name=\"dev\" value=\"%s\">\n", $data[0] );
                printf( "                               <input type=\"hidden\" name=\"mac\" value=\"%s\">\n", $data[1] );
                printf( "                               <input type=\"hidden\" name=\"task\" value=\"send\">\n" );
                printf( "                               <input type=\"submit\"  value=\"Send\">\n" );
                printf( "                               </form>\n" );
                printf( "                       </td>\n" );
                printf( "               </tr>\n" );
        }
        printf( "       </table>\n" );
}
function send_wol( $dev, $mac )
{
        $ret = exec( "sudo /sbin/ether-wake $mac 2>&1", $res );
        printf( "       <table class=\"table_1\">\n" );
        printf( "               <tr><th colspan=2 >Sending WoL Packet</th></tr>\n" );
        printf( "               <tr><td>Device</td><td>%s</td></tr>\n", $dev );
        printf( "               <tr><td>MAC</td><td>%s</td></tr>\n", $mac );
        printf( "               <tr><td>Status</td>" );
        echo "<td>";
                if( $ret == "" )
                {
                        echo "OK";
                }
                else
                {
                        foreach( $res as $val)
                        {
                                $val = str_replace( array("<", ">" ), array( "[", "]" ), $val );
                                printf( "%s<br>\n", $val );
                        }
                }
        echo"</td></tr>\n";
        printf( "       </table>\n" );
        echo "<br><br>";
        printf( "       <form>\n" );
        printf( "               <input type=\"button\" value=\"BACK\" onClick=\"history.back()\">\n" );
        printf( "       </form>\n" );
}
?>
</body>
</html>

wol.list

CGIから呼び出され、WoL対象機器の情報をカンマ区切りで記載します。各行の構成は以下の通りです。

  • 第1フィールドは機器名です。機器リストにそのまま表示されます。
  • 第2フィールドはMACアドレスです。各バイト間のデリミタは「:」です。
  • 必要ならは第3フィールドをコメントとして使用可能です。

また、先頭が「;」(セミコロン)の場合は、行全体をコメントとして無視します。

(例)

;
;       WOL Equipment List
; Format is follows
;     <device name>,<mac address>,<comments>
;
VARDIA(RD-X10),E8:9D:87:xx:xx:xx,Toshiba
Asuna(foltia),9C:B6:54:xx:xx:xx,Hewlett Packard
NAS,E8:5B:5B:xx:xx:xx,LG ELECTRONICS INC
Sakura(Server),A0:B3:CC:xx:xx:xx,Hewlett Packard
Belldandy(2),BC:5F:F4:xx:xx:xx,ASRock Incorporation

wol.conf

TVや携帯デバイスでURLをなるべく簡単に入力するためにApacheの設定を行います。

  • URLはhttp://<Server_IP_Address>/wol/となります。
  • セキュリティは、同一セグメント内を想定しています。必要に応じてアクセスコントロールをしてください。Digest認証等は入力の手間がかかるので実施していません。
  • index.htmlをアクセスした際にindex.phpがアクセスされるように、rewrite設定を行っています。
    Alias /wol /var/www/wol
    <Directory /var/www/wol>
            Options Includes ExecCGI FollowSymLinks
            AllowOverride All
            Order deny,allow
            Deny from all
            Allow from 127.0.0.1
            Allow from ::1
    #       # Allow from .example.com
            Allow from 192.168.0.0/255.255.255.0
            RewriteEngine on
    RewriteBase /var/www/wol
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule ^(.*)\.html$ $1\.php [L]
    </Directory>
    

最後にApacheを再起動します。

visudo

ether-wake はSuperUser?権限でのみ実行できるため、Apacheより実行可能なようにvisudoで以下の行を追加します。

<apacheを実行するユーザ名> ALL=(ALL) NOPASSWD: /sbin/ether-wake

添付ファイル: filewol2.jpg 942件 [詳細] filewol1.jpg 551件 [詳細]

トップ   編集 編集(GUI) 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-11-03 (月) 23:39:30 (3464d)