0

我正在编写作为使用 WakeOnLan 功能在网络上打开系统的应用程序。

我用谷歌搜索并能够从这里获取代码。我的代码如下所示。我也在我的路由器中转发了端口 9。

我已经从电源管理中为网卡启用了 LAN 唤醒选项。我按照这里的说明进行操作

我已经从这里安装了 Wake on Lan Monitor/Sniffer,以检查我是否能够接收到唤醒的魔法数据包。并且系统正在接收魔术包。当我从同一网络上的另一个系统(笔记本电脑)关闭并运行 WOL python 脚本时,我的系统无法开机。

任何人都可以建议我解决方案。

我的系统是 Win 8.1 的桌面,需要在 LAN 上唤醒。装有 Win 8 的笔记本电脑,需要运行应用程序并将魔术包发送到桌面。

我的局域网 IP 范围从 172.16.0.1 等,所以使用 172.16.255.255 作为广播地址。

import sys, struct, socket

# Configuration variables
broadcast = ['172.16.255.255']
wol_port = 9

known_computers = {
    'mercury'    : '00:1C:55:35:12:BF',
    'venus'      : '00:1d:39:55:5c:df',
    'earth'      : '00:10:60:15:97:fb',
    'mars'       : '00:10:DC:34:B2:87',
}

def WakeOnLan(ethernet_address):

    # Construct 6 byte hardware address
    add_oct = ethernet_address.split(':')
    if len(add_oct) != 6:
        print "\n*** Illegal MAC address\n"
        print "MAC should be written as 00:11:22:33:44:55\n"
        return
    hwa = struct.pack('BBBBBB', int(add_oct[0],16),
        int(add_oct[1],16),
        int(add_oct[2],16),
        int(add_oct[3],16),
        int(add_oct[4],16),
        int(add_oct[5],16))

    # Build magic packet

    msg = '\xff' * 6 + hwa * 16

    # Send packet to broadcast address using UDP port 9

   soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    soc.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)
    for i in broadcast:
        soc.sendto(msg,(i,wol_port))
    soc.close()

def wol(*macs):
    if len(macs) == 0:
        print "\n*** No computer given to power up\n"
        print "Use: 'wol computername' or 'wol 00:11:22:33:44:55'"
    else:
        for i in macs:
            if i[0] != '/':
                if ":" in i:
                    # Wake up using MAC address
                    WakeOnLan(i)
                else:
                    # Wake up known computers
                    if i in known_computers:
                        WakeOnLan(known_computers[i])
                    else:
                        print "\n*** Unknown computer " + i + "\n"
                        quit()

        if len(macs) == 2:
            print "\nDone! The computer should be up and running in a short while."
        else:
            print "\nDone! The computers should be up and running in a short while."
        print

wol('My System MAC address')
4

3 回答 3

0

您需要检查系统是否对获取 WOL 数据包做出反应,不仅是它能够接收它(即实际上唤醒)。如果不是,您需要通过特殊软件或计算机的 BIOS 设置打开它。

我也有这样的经验,在大多数笔记本电脑上,您需要插入电源,并且在关闭计算机以正常工作之前,还要将以太网电缆插入计算机。

要测试它是否可以在您的计算机上运行,​​请下载一个现有的用于发送 WOL 魔术包的软件,并在您假设您的代码有问题之前确保它可以正常工作。

在 Linux(基于 debian 的示例)中,您需要做的就是:

sudo apt-get install etherwake

然后做

wakeonlan MAC-ADDRESS

于 2015-02-27T12:47:53.527 回答
0

我知道这个线程很旧,但你设法让它工作吗?首先,我看到你使用的是 Win8.1 根据维基百科:

“Windows 8 及更高版本、[20][21] 和 Windows Server 2012 及更高版本不支持从混合关机状态 (S4) 或完全关机状态 (S5) 唤醒的功能。[22] 这是因为操作系统行为的变化,导致网络适配器在关闭到这些状态时明确不为 WOL 准备。支持从睡眠状态 (S3) 或非混合休眠状态 (S4) 的 WOL。

所以我建议尝试使用不同的机器/操作系统,并确保在 BIOS 中启用了 WoL 选项。

编辑:我刚刚制作了一个小型 python 应用程序,它可以在我使用“!”的情况下工作 运营商与否。因此,我不确定以下几行:

另外,我看到您在包中使用了默认字节顺序:

struct.pack('BBBBBB',

你不应该使用'>'或'!' (大端/网络)运营商?

例如

struct.pack('!BBBBBB',

恐怕如果您不使用 big-endian 运算符,它将默认为您的系统编码方式,而在 Intel 机器上它将是 little-endian 编码方案。所以你以错误的顺序发送你的字节。

https://docs.python.org/3.0/library/struct.html https://en.wikipedia.org/wiki/Endianness

于 2016-08-22T11:44:25.367 回答
0

我使用 wireshark 来追踪我的 WOL 数据包

我测试了我的代码,它可以工作。

对于 Windows 8 + 中的 wol,您必须取消选中快速启动

(就像我之前说的)

如果您想访问远程 pc 以关闭或检查登录状态

或登录

你需要在远程电脑的记录中添加一些东西

看这张照片,看看在哪里添加记录

(也)就像我之前说的:)

如果您不这样做,您将无法进行远程访问(访问被拒绝 (5))

你可以检查它与 cmd send a shutdown -s -m \ipadressOfTheRemotePC

我刚刚创建了一些大型软件来唤醒另一台电脑

检查是否登录,如果没有登录,如果两者中的一个都登录,它会为你做。

我用于我的 wol 数据包的代码是:

看这张我的代码图片

于 2016-10-30T16:24:02.090 回答