我正在使用WakeOnLan功能编写应用于网络上的Switch On Systems。
我用Google搜索并能够从here获取代码。我的代码如下所示。 我已经在我的路由器中转发了端口9。
我已启用来自电源管理的网卡的Wake On Lan选项。我按照here
的说明进行操作我已经从here安装了Wake on Lan Monitor / Sniffer来检查我是否能够接收魔法数据包以进行唤醒。系统正在接收魔术包。当我从同一网络上的另一个系统(笔记本电脑)关闭并运行WOL python脚本时,我的系统无法启动。
有人可以建议我解决。
我的系统是 带有Win 8.1的桌面需要在Lan上唤醒。 Win 8的笔记本电脑需要运行应用程序并将魔术包发送到桌面。
我的LAN 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')
答案 0 :(得分:0)
您需要检查系统是否对获取WOL数据包作出反应,而不仅仅是它能够接收它(即实际唤醒)。如果不是,您需要通过特殊软件或计算机的BIOS设置来启用它。
我也有这样的经验:在大多数笔记本电脑上,您需要插上电源,并且在关闭电源之前还要将以太网电缆插入计算机才能正常工作。
要测试它是否可以在您的计算机上运行,请下载现有软件以发送WOL Magic Packets,并确保在您假设代码中出现问题之前它可以正常工作。
在Linux(基于debian的示例)中,您需要做的就是:
sudo apt-get install etherwake
然后再做
wakeonlan MAC-ADDRESS
答案 1 :(得分:0)
我知道这个帖子已经老了,但是你设法让它运作起来吗? 首先,我看到你使用的是Win8.1 根据维基百科:
“从混合关闭状态(S4)或完全关闭状态唤醒的能力 在Windows 8及更高版本中不支持电源关闭状态(S5),[20] [21] 和Windows Server 2012及更高版本。[22]这是因为改变了 操作系统行为导致网络适配器明确不 当关闭到这些状态时,为WOL设防。 WOL从睡梦中醒来 支持状态(S3)或非混合休眠状态(S4)。“
所以我建议尝试使用不同的机器/操作系统,并确保在BIOS中启用了WoL选项。
编辑:我刚刚创建了一个小型python应用程序,它使用的是'!'操作员与否。因此,我不确定以下几行:
另外,我发现您使用了包中的默认字节顺序:
struct.pack('BBBBBB',
你不应该使用'>'要么 '!' (big-endian / network)运营商?
e.g。
struct.pack('!BBBBBB',
我担心如果你不使用big-endian运算符,它将默认使用你的系统编码方式,而在Intel机器上它将是little-endian编码方案。 所以你要以错误的顺序发送你的字节。
https://docs.python.org/3.0/library/struct.html https://en.wikipedia.org/wiki/Endianness
答案 2 :(得分:0)
我使用wireshark来追踪我的WOL包
我测试了我的代码并且它有效。
对于Windows 8中的wol,您必须取消选中快速启动
(就像我之前说的那样)
如果要访问远程PC以关闭或检查登录状态
或登录
你需要在远程电脑的重新设置中添加一些东西
see this picture to see where to add in regestry
(也)就像我之前说过的那样:)
如果你不这样做,你就无法进行远程访问(拒绝访问(5))
你可以用cmd检查一下发送一个shutdown -s -m \ ipadressOfTheRemotePC
我刚刚创建了一些大型软件来唤醒其他电脑
检查是否已登录,如果其中一个已登录,则不会为您执行此操作。
我用于wol数据包的代码是: