perlやruby、ASP等では、結構サンプルがあるのですが、PHPのサンプルは あまり見つからなかったので作ってしまいました。
Wake On Lanをするには、対象のコンピュータのMACアドレスを予め調べておく必要があります。
Windowsでは、「Domain View--」(WAKI Toshihito氏作)等が便利です。
<?php
//---------------------------------------------------------------------------
// Wake On Lan 用クラス
//
// 必須データ:
// IPアドレス(IPV4)、MACアドレス(xx:xx:xx:xx:xx:xx)
// ブロードキャストアドレス(デフォルトでは、IPアドレスから判断して自動生成)
//---------------------------------------------------------------------------
class CWakeOnLan
{
//------------------------------------------------------
//プロパティ
var $p_sBroadCastAddress; //ブロードキャストアドレス
//------------------------------------------------------
//メソッド
//コンストラクタ
function CWakeOnLan($arg_sBroadCast = "")
// ブロードキャストアドレス(省略可)
{
//エラーの表示を一切やめる
# error_reporting(0);
$this->p_sBroadCastAddress = $arg_sBroadCast;
}
//----------------------------------
//マジックパケットの生成
function _MakeMagicPacket($arg_sMacAddress)
{
$binMagicPacket = "";
//開始部分
for ($i = 0; $i < 6; ++$i){
$binMagicPacket.= chr(0xff);
}
//MACアドレスの変形
$aryMacAddr = explode(":", $arg_sMacAddress, 6);
$strBuffer = pack("H*H*H*H*H*H*",
$aryMacAddr[0],
$aryMacAddr[1],
$aryMacAddr[2],
$aryMacAddr[3],
$aryMacAddr[4],
$aryMacAddr[5]);
for ($i = 0; $i < 16; ++$i){
$binMagicPacket.= $strBuffer;
}
return($binMagicPacket);
}
//----------------------------------
//IPアドレスからブロードキャストアドレスを解析
function _AnalBroadCastAddress($arg_sIpAddress)
{
$strBroadCastAddress = "";
//IPアドレス文字列を、配列に分割
$aryIpAddr = explode(".", $arg_sIpAddress, 4);
//それぞれのクラスを判断して、アドレスを代入
if ($aryIpAddr[0] < 127){
//Class A
$aryIpAddr[1] = "255";
}
if($aryIpAddr[0] < 191){
//Class B
$aryIpAddr[2] = "255";
}
if($aryIpAddr[0] < 223){
//Class C
$aryIpAddr[3] = "255";
//配列を、IPアドレス文字列に戻す
$strBroadCastAddress = join(".", $aryIpAddr);
}else{
}
return($strBroadCastAddress);
}
//----------------------------------
//マジックパケットの送信
function _SendMagicPacket($arg_sMacAddress, $arg_sIpAddress = "")
{
//マジックパケットの生成
$binMagicPacket = $this->_MakeMagicPacket($arg_sMacAddress);
if ( $this->p_sBroadCastAddress == "" ){
//ブロードキャストアドレスが指定されていないとき
if ( $arg_sIpAddress != "" ){
//かつ、引数に目的のマシンのIPアドレスが入っているとき
$this->p_sBroadCastAddress =
$this->_AnalBroadCastAddress($arg_sIpAddress);
} else {
//全く指定されていないとき
print("Not specifed broadcast Address.");
return;
}
}
//送信
$fp = fsockopen("udp://".$this->p_sBroadCastAddress, 9, $errno, $errstr);
if (!$fp) {
print("ERROR: $errno - $errstr\n");
} else {
fwrite($fp, $binMagicPacket);
fwrite($fp, $binMagicPacket);
fclose($fp);
}
}
}
?>
<?php
//---------------------------------------------------------------------------
//実際の使い方
require_once("./wakeonlan.inc");
$WakeOnLan = new CWakeOnLan("192.168.0.255");
$WakeOnLan->_SendMagicPacket("00:11:22:33:44:55");
// or $WakeOnLan->_SendMagicPacket("00:11:22:33:44:55", "192.168.0.1");
?>