天天看點

通過WIFI遠端喚醒(Wake-on-WLAN) Windows - 狼人:-)

通過WIFI遠端喚醒(Wake-on-WLAN) Windows

2020-11-15 16:04 

狼人:-) 

閱讀(6404) 

評論(0) 

編輯 

收藏 

舉報

Motivation

感謝學校的擴招,原本的兩人間硬是魔改成三人間,導緻個人書桌面積小到兩台筆記本都放不下。無奈之下,淘了一個小桌闆,正好能放一台筆記本。但随着考試周的臨近,購入若幹盒泡面準備進行修仙時才發現 沒!地!方!放!泡!面!

無奈之下,隻能把Windows本本合上。

反正平時基本上都是遠端桌面連上去下迅雷或者推Gal。是以,需要一種機制能夠在機器關機的狀态下進行遠端喚醒,進而進行遠端桌面。Google後搜到Wake-on-LAN,是一種在機器處于休眠或關機狀态下通過網絡進行喚醒的技術。但筆記本沒有LAN口,是否能夠通過WLAN喚醒呢?繼續搜尋,發現也是支援的!

Requirement

Wake-on-LAN / Wake-on-WLAN 需要主機闆和BIOS的支援。

根據Wiki,大概就是機器在休眠或關機時主機闆和網卡還保持微弱的供電,網卡會監聽廣播包,并對其進行解析。如果發現符合協定,并且MAC位址就是該網卡的MAC位址,則通知主機闆進行喚醒。

這種資料包被稱為Magic Packet,格式為:

FF FF FF FF FF FF MAC位址

是以通過構造Magic Packet,然後通過UDP進行廣播,即可實作喚醒的目的。

經過測試,在我的機器(XPS 9550)上,隻能實作從睡眠(S3)和休眠(S4)狀态下喚醒,無法從關機(S5)狀态喚醒。

這符合Dell在 https://www.dell.com/support/article/us/en/19/SLN216918/newer-dell-system-models-will-not-wake-on-lan-with-deep-sleep-control-set-to-s5?lang=EN 的說明:

Newer Dell system models will not Wake-On-LAN with Deep Sleep Control set to S5

也符合Windows在 https://msdn.microsoft.com/en-us/library/windows/desktop/aa373229(v=vs.85).aspx#wake-on-lan_behavior 的說明:

WOL is supported from sleep (S3) or hibernate (S4). It is not supported from fast startup or soft off (S5) shutdown states. NICs are not armed for wake in these states because users do not expect their systems to wake up on their own.

Implementation

  1. 進入BIOS中,開啟 Wake on WLAN
  2. 進入Windows中,打開裝置管理器,打開無線網卡的屬性,在電源管理的tab鈎上

    允許此裝置喚醒計算機

    隻允許幻資料包喚醒計算機

    後确定。
  3. 如果需要進入休眠(S4),需要在控制台的電源選項下點選

    更改目前不可用的設定

    ,然後把

    休眠

    鈎上。
  4. 在網絡連接配接屬性處查詢無線網卡的MAC位址和區域網路的廣播位址
  5. 睡眠/休眠,記得把電源插上

然後在另外一台電腦執行以下腳本,注意把MAC和BROADCAST改成你自己的:

# !/usr/bin/env python
# -*- coding: utf-8 -*-
#
# FileName:      wol.py
# Author:        binss
# Create:        2017-06-04 22:32:48
# Description:   Ref: https://github.com/bentasker/Wake-On-Lan-Python
#

import socket
import struct
import time


MAC = "60-6D-C4-C6-30-48"
BROADCAST = "192.168.1.255"


def main():
    if len(MAC) != 17:
        raise ValueError("MAC address should be set as form \'XX-XX-XX-XX-XX-XX\'")
    mac_address = MAC.replace("-", \'\')
    data = \'\'.join([\'FFFFFFFFFFFF\', mac_address * 20])
    send_data = b\'\'

    # Split up the hex values and pack.
    for i in range(0, len(data), 2):
        send_data = b\'\'.join([send_data, struct.pack(\'B\', int(data[i: i + 2], 16))])

    # Broadcast
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        sock.sendto(send_data, (BROADCAST, 7))
        time.sleep(1)
        sock.sendto(send_data, (BROADCAST, 7))
        time.sleep(1)
        sock.sendto(send_data, (BROADCAST, 7))
        print("Done")
    except Exception as e:
        print(e)


if __name__ == \'__main__\':
    main()      

Troubleshoot執行後就可以發現機器被喚醒了。

為什麼休眠後發現機器立刻被喚醒了?

通過

powercfg -devicequery wake_armed

發現喚醒裝置除了無線網卡意外還有一個遠端桌面滑鼠裝置,不知道是幹啥的,把滑鼠拔掉後解決。

本文發自 https://www.binss.me/blog/wake-windows-10-laptop-by-WLAN/

采用 知識共享署名-非商業性使用-相同方式共享 4.0 進行許可

通過WIFI遠端喚醒(Wake-on-WLAN) Windows - 狼人:-)