电脑自动开关机
前言
近期少写技术博文,写篇涉及点技术的,水水文(一般月中再写,没想到年初第一天就写了)
个人有个优化思维,会思索有什么事情可以优化
今天思考生活中有什么优化的,想到了电脑开机(也算近期一个想法),每天在固定段使用电脑,那开机的时间是不可以节约?
开机20s左右算20s,一天2-3次(早上有时候不开,中午晚上开),
- 一天:3*20s= 60 s
- 一个月:60*30 = 180 s
- 一年:180 * 12 = 2160 s
2160 s / 60 = 36 min
emmm….,才节约36分钟,节约的时间比预想的少,但蚊子再小也是肉
没办法,只能以体验感来催眠自己(电脑已经时刻准备好了),以证明自己不是在瞎折腾🙃
扯远了,Start - >
目录:
- 组网:介绍近期组网的生活随笔
- 电脑自动开关机:总结下电脑开关机的方法
组网
电脑近期网络有点小崩,老是莫名奇妙断网,整的有点小怀疑人生
有些Bug就是这样莫名其妙,路由器稳定运行了2年,但因为近期网络升级(300m——>1000m),路由就莫名开始不断抽风
副路由(水星D196G)时不时来下断网,就是很莫名其妙,网速与配置没有直接关联
我修复,重新配置了几次,运行段时间又莫名不行,我tm的…,搞的我在想要不要换路由了
拓扑图如下:
今天又修复了下,搜索了下资料,几个问题
- IP冲突:说是DHCP服务器分配IP问题,有一定可能性,但个人是副路由桥接后,主路由自动分配一个ip给副路由,想不明白
- 信道问题:两者必须要使用信道
- 兼容性:不同品牌可能存在兼容性问题
- …
个人推测是1、3,我现在是光猫、主路由(Redmi AX5)、副路由(水星D196G)都有开启DHCP服务器,可能分配后ip冲突了。
目前先暂时关闭副路由器的DHCP服务器,我又行了,暂时又可以用了,观望一段时间再说。
电脑自动化开关机
完成后示意图:
网关和路由器的开关没什么好说的,在管理界面里找,一般都可以找到定时开关
主要介绍电脑的定时开关
参考资料
- 无线网络唤醒,从入门到放弃:介绍很详细的博文
- 微星主板设置定时开机:仅对微星主板有参考价值
- 远程唤醒+远程控制——Windows:对操作系统方面的配置讲解比较细致
- [主板] 如何通过BIOS设置自动开机:介绍设置BIOS相关
自动开机
个人电脑主板是微星的主板,原本想要使用 (RTC)闹铃唤醒,但发现不符合需求
(RTC)闹铃唤醒仅只能设置1个时间点唤醒,个人需要在3个时间点唤醒
发现有个PCIE唤醒,搜索了相关资料,决定采用这个方案
网络的方案是使用硬件(开机棒)来实现,或者使用路由发送包唤醒,个人看了下自己的路由,没有这个功能
以下方便理解,两部电脑,一部称呼为A,一部称呼为B
决定写个脚本放在电脑B(常年开机,服务器,跑服务使用)到点唤醒电脑A(日常主用机)
原理是发送一个包到电脑,思索脚本该可以,但相关包不熟悉
问了下ChatGpt,给出示例代码,报错几次了,修正调试完成
基础代码如下:
import socket
import binascii
def wake_on_lan(mac_address):
# 魔术包由 6 个 0xFF 字节后跟目标 MAC 地址的 16 次重复组成
mac_address_formatted = mac_address.replace('-', '')
data = b'\xFF' * 6 + (binascii.unhexlify(mac_address_formatted)) * 16
# 创建 UDP 套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置套接字选项,允许广播
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# 发送魔术包到局域网广播地址
sock.sendto(data, ('<broadcast>', 9))
print("已发送唤醒包到电脑A")
# 电脑A的 MAC 地址
mac_address = '30-9C-23-B5-F8-F3'
# 调用唤醒函数
wake_on_lan(mac_address)
MAC 地址在路由器中查看即可,不知道的话
- 打开运行,输入
cmd
,打开命令行 - 输入:
ipconfig/all
,拉到下面找到对应的行(物理地址)即可,后面的就是你电脑的MAC地址
定时运行,使用第三方apscheduler
包,需要先安装下:pip install apscheduler
之后设置3个时间段,在这3个时间段发送唤醒的包
完整代码示例:
import socket
import binascii
from apscheduler.schedulers.blocking import BlockingScheduler
import datetime
def wake_on_lan(mac_address):
# 魔术包由 6 个 0xFF 字节后跟目标 MAC 地址的 16 次重复组成
mac_address_formatted = mac_address.replace('-', '')
data = b'\xFF' * 6 + (binascii.unhexlify(mac_address_formatted)) * 16
# 创建 UDP 套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置套接字选项,允许广播
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# 发送魔术包到局域网广播地址
sock.sendto(data, ('<broadcast>', 9))
def job():
mac_address = '30-9C-23-B5-F8-F3' # 电脑A的 MAC 地址
wake_on_lan(mac_address) # 调用唤醒函数
print("已发送唤醒包 -", datetime.datetime.now())
if __name__ == '__main__':
# 创建调度器
scheduler = BlockingScheduler()
# 添加定时任务,每天的指定时间运行
scheduler.add_job(job, 'cron', hour=6, minute=50) # 每天6:50运行
scheduler.add_job(job, 'cron', hour=12, minute=0) # 每天12:00运行
scheduler.add_job(job, 'cron', hour=18, minute=0) # 每天18:00运行
# 启动调度器
scheduler.start()
本地电脑主板BIOS要支持网络唤醒
不同主板称呼不同,微星叫做PCIE设备唤醒、有的叫做网络唤醒,或者Wake on Lan
先配置下BIOS,开机不断按DEL
(不同主机进入按键不同,自行查阅,一般是DEL
、F8
、F9
)
进入后,切换到高级选项卡(一般都在高级选项里面),找到唤醒的选项(有的在电源选项里面),点击进入
找到PCIE设备唤醒按钮(有的叫做Wake on Lan
),将其打开即可,之后按F10
保存退出
本地(被唤醒的电脑)要配置下网卡,要不然无法远程唤醒
Win+X
,选择「网络链接」打开「更改适配器」
找到自己在用的网络,右键属性,打开属性面板后, 点击配置
选择「电源管理」,如下图配置(必须选项,否则无法唤醒)
这里个人只要开机,关机自己关,所以「关机 网络唤醒」没用到,其他人根据需要决定是否开启
配置完成后,就可以在局域网其他电脑运行定时脚本,进行定时唤醒了
到达指定的时间时,会向本台电脑发送唤醒指令,本电脑会自动启动
注意事项/说明
- 网络唤醒只对休眠或者待机的电脑有效,电脑关机唤醒不了,所以不要关机,而是采用休眠,休眠电脑也完全不耗电,不用担心电费
- 电脑处于开机状态下,唤醒脚本发送的唤醒包不会对电脑产生任何影响
睡眠、休眠、关机区别
- 睡眠:电脑看起来是关的,实则内存在供电,所有数据被写入内存,可以在几秒钟内迅速恢复正常操作,适用于离开一阵子,通过电源按钮、键盘任意按键唤醒电脑
- 休眠:所有硬件断电,达成和睡眠一样的效果(重启计算机会恢复到休眠之前的状态),但实现原理不同,启动时间更长,因为关机将内存中的数据存储到硬盘中去(硬盘断电数据也不会丢失),开机则将硬盘的数据加载到内存中去,适用于长时间不用电脑,但用的时候可以快速进入状态
- 关机:所有程序和数据被关闭,无法关闭会强制关闭(数据丢失),电脑完全不通电。
参考资料
自动关机(休眠)
使用系统的计划程序,配合系统自带的shutdown
命令
两者配合达成指定的时间段电脑自动休眠
Win+ R
,输入taskschd.msc
,打开计划程序选择右侧创建任务
名称随意
触发器,新建一个设置为每天,设置为你要的时间即可(例如这里设置为22:27:13,那么会在这个时间执行操作)
可以一次添加多个触发器,也就是多个时间执行
添加执行的命令:
shutdown -h
会提示是否使用参数,选「是」即可
设置完成,记得保存