• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

使用 PHP 網路開機

php 搞代码 4年前 (2022-01-23) 24次浏览 已收录 0个评论

在區域網路中,可以傳送 Magic Packet 給主機的網路卡,Magic Packet 內容開頭有6個 “FF”,再接 16 個網路卡 MAC,當主機版有開啟支援 Wake on LAN 功能,網路卡接收到符合條件的 Magic Packet,就能開啟電腦。(每個主機版關於 Wake on LAN 的名稱不盡相同,例如 PME Event Wake Up、Power On By PCI Devices…)

另一個影響能否網路開機的設定,在作業系統裡面裝置管理員,網卡裝置內容裡的電源管理,需勾選「允許這個裝置喚醒電腦」。

假設網路卡 MAC 為:01-02-03-04-05-06

Magic Packet 內容則為:

FFFFFFFFFFFF010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506

然後以 UDP 通訊協定傳送給電腦的 port 7、或 port 9

所以實現網路開機的方式,就是在區網內想辦法傳送給目標電腦網卡 Magic Packet,如果用來傳送 Magic Packet 的設備(Server),平常也有對外連線,也可達成在外網開機的效果。

以下 PHP 傳送 Magic Packet 範例來源

WOL: Wake-on-LAN Tutorial with Bonus PHP Script

僅稍微修改後如下:

class WakeOnLan {    /**     * 喚醒電腦     * @param type $addr ,目標IP 或 廣播位址(格式 01-02-03-04-05-06 或 01:02:03:04:05:06)     * @par<strong style="color:transparent">¥本文来源gaodai#ma#com搞@@代~&码网^</strong><small>搞gaodaima代码</small>am type $mac     * @param type $port , 7 or 9     * @return boolean     */    public function wake($addr, $mac, $port) {        $mac = str_replace("-", ":", $mac);        $addr_byte = explode(':', $mac);        $hw_addr = '';        for ($a = 0; $a < 6; $a++) {            $hw_addr .= chr(hexdec($addr_byte[$a]));        }        // 開頭六個 "FF"        $msg = chr(255) . chr(255) . chr(255) . chr(255) . chr(255) . chr(255);        // 16個MAC        for ($a = 1; $a wake('192.168.0.255', "01-02-03-04-05-06", 7);    $res = $WOL->wake('192.168.0.255', "01-02-03-04-05-06", 9);    var_dump($res);} catch (Exception $ex) {    var_dump($ex->getMessage());}
  • 將 Magic Packet 指定傳給 broadcast address(例如:192.168.0.255),可傳送給區網所有電腦,MAC符合的才會開機。
  • 有的電腦可能傳給 port 7 或 port 9 其中一個才會開機。
  • 原範例 socket_set_option($skt, 1, 6, TRUE),1、6 改成用常數取代,因不同環境 SOL_SOCKET、SO_BROADCAST 的常數直似乎不同。查看所有 soket 常數 http://php.net/manual/en/sockets.constants.php#108291
    $a = get_defined_constants(TRUE);foreach ($a['sockets'] as $constant => $value) {    printf("%-25s %d", $constant, $value);}

網路喚醒 – 維基百科,自由的百科全書

設定Windows 8網路喚醒(Wake On LAN) – 黑暗執行緒

PHP: socket_create – Manual

PHP: socket_set_option – Manual

PHP: socket_get_option – Manual

arduino – PHP : Send an UDP broadcast message , and wait the response – Stack Overflow

小信豬的原始部落: [TCP/IP Illustrated] Broadcasting & Multicasting


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:使用 PHP 網路開機

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址