运用PHP实现网络唤醒(WOL)功能

 2020-07-23    617  

网络唤醒(Wake On LAN)指的是通过网络实现电脑的远程开机启动。除了可以唤醒同一个局域网下的电脑,也可以从外网唤醒局域网内的电脑。这样有时在公司,如果临时想从家里电脑传输些文件过来,就可以通过网络启动家里的电脑,再进行远程操作。

1,PHP实现网络唤醒原理
过去我在外面要唤醒家里的设备都是通过 App。这里介绍如何使用 PHP 实现同样的功能,它的原理和那些网络唤醒 App 都是一样,就是给目标的地址发送一个唤醒数据包(Magic Packet)。当然发送除了目标地址外,还要有端口和目标设备的 MAC 地址。
2,功能实现
(1)为方便使用这里定义一个网络唤醒类 WOL(在 wol.php 文件中)

<?php

/**

* 实现网络唤醒功能

*/

class WOL

{

    private $hostname;    // 唤醒设备的url地址

    private $mac;         // 唤醒设备的mac地址

    private $port;        // 唤醒设备的端口

    private $ip;          // 唤醒设备的ip地址(不是必须的,程序会自动根据$hostname来获取对应的ip)

 

    private $msg = array(

        0 => "目标机器已经是唤醒的.",

        1 => "socket_create 方法执行失败",

        2 => "socket_set_option 方法执行失败",

        3 => "magic packet 发送成功!",

        4 => "magic packet 发送成功!"

    );

     

    function __construct($hostname,$mac,$port,$ip = false)

    {

        $this->hostname = $hostname;

        $this->mac      = $mac;

        $this->port     = $port;

        if (!$ip)

        {

            $this->ip   = $this->get_ip_from_hostname();

        }

    }

 

    public function wake_on_wan()

    {

        if ($this->is_awake())

        {

            return $this->msg[0]; // 如果设备已经是唤醒的就不做其它操作了

        }

        else

        {

            $addr_byte = explode(':', $this->mac);

            $hw_addr = '';

            for ($a=0; $a<6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));

            $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);

            for ($a=1; $a<=16; $a++) $msg .= $hw_addr;

            // 通过 UDP 发送数据包

            $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

             

            if ($s == false)

            {

                return $this->msg[1]; // socket_create 执行失败

            }

 

            $set_opt = @socket_set_option($s, 1, 6, TRUE);

 

            if ($set_opt < 0)

            {

                return $this->msg[2]; // socket_set_option 执行失败

            }

 

            $sendto = @socket_sendto($s, $msg, strlen($msg), 0, $this->ip, $this->port);

             

            if ($sendto)

            {

                socket_close($s);

                return $this->msg[3]; // magic packet 发送成功!

            }

 

            return $this->msg[4]; // magic packet 发送失败!

             

        }

    }

 

    private function is_awake()

    {

        $awake = @fsockopen($this->ip, 80, $errno, $errstr, 2);

         

        if ($awake)

        {

            fclose($awake);

        }

         

        return $awake;

    }

 

    private function get_ip_from_hostname()

    {

        return gethostbyname($this->hostname);

    }

 

}

?>


(2)下面是一个测试代码(index.php),使用时只要传入相关的参数即可。

<?php

include("wol.php");

 

$WOL = new WOL("wake.hangge.com","00:21:32:56:E2:E8","9090");

$status = $WOL->wake_on_wan();

 

echo $status;

?>



  •  标签:  

原文链接:http://www.lwj666.top/?id=35

=========================================

http://www.lwj666.top/ 为 “Hello 映像小站” 唯一官方服务平台,请勿相信其他任何渠道。