用esp8266远程定时开机

一、原理

    局域网远程唤醒(Wake-on-LAN):给网卡发送一段特别的udp包,网卡收到了就通知主板开机。

条件:

    (1)网卡支持:在网卡驱动中,高级选项卡打开关机网络唤醒魔术封包唤醒,电源管理选项卡打开允许此设备唤醒计算机

    (2)主板支持:在主板设置中,打开远程唤醒的选项

    (3)win10支持:听说要关掉快速启动

https://blog.csdn.net/qq_19764639/article/details/82817719

https://blog.csdn.net/zhousmq/article/details/82354892

设置好后,可以先测试一下。安卓手机可以用“远程开机棒”这个软件来试试。

二、硬件设备部分

    (1)这里就用esp8266这个wifi设备来发送开机数据包了

    (2)要给esp8266烧写代码,但他没法直接连上电脑,还得准备个usb转ttl设备

    (3)usb转ttl设备只有一个GND口,烧代码的时候不够用,还得再准备个面包板(提供多个电源口和GND口)

    (4)接线的时候使用杜邦线

总的来说,设备就是 esp8266、usb转ttl设备、面包板、多条杜邦线(公对母接口以及母对母接口)


先给esp8266烧入代码,再让他正常运行就可以了。

关于烧写代码时的设备连接

1. esp8266 -> usb转ttl设备

接线方面

https://blog.csdn.net/csdnhuaong/article/details/67633566

esp8266-01s版本:

(1)vcc 接 3.3v,GND 接 面包板的GND,usb转ttl设备的GND 也接 面包板的GND

(2)tx 接 rx,rx 接 tx    -- 就是所谓的反接

(3)gpio 0 接 面包板的GND

-- 上面的8266用到了2个GND(地), usb转ttl设备只有1个GND,所以需要用到面包板。

-- 另外这3个GND都要用面包板上的GND,要达成共地。

-- 要是烧完代码了运行却没反应,可以在上传代码时把gpio 16(Reset)插拔GND试试。

烧写代码的时候总共接6条线。运行的时候就把gpio 0的线拔掉,不接东西。

关于12f版本(多加一条接地的线):

(1)vcc 接 3.3v,GND 接 面包板的GND ,usb转ttl设备的GND 也接 面包板的GND    -- 这玩意竟然有3个vcc,我用的是离en和rst近的那个

(2)tx 接 rx,rx 接 tx    -- tx=gpio1  rx=gpio3

(3)gpio 0 接 面包板的GND

(4)gpio 15 接 面包板的GND

2. usb转ttl设备 -> 电脑

设备接到电脑的usb口就行。

一般来说电脑是没有设备驱动的,得去下载安装对应驱动。

关于烧写代码的软件

软件方面,一是编写代码的ide,二是烧写代码的烧写器。这里就用 arduino ide 了,包含以上两个功能。

代码里要改的信息我都放在最前面了,分别是

(1)wifi名称、密码    -- 让esp8266连网,得跟电脑在同一个局域网

(2)电脑的ip和mac地址    -- 发开机数据包的时候要用

(3)后台服务器的ip、端口,代表这个esp8266设备的设备名     -- 接收发来的开机指令时要用

代码:https://wws.lanzous.com/i4Ptjkr83zi

后台可以先用tcp调试软件模拟,比如SocketTool

三、后台tcp服务

    tcp后台主要有两个任务

(1)建立tcp server端,接受esp8266的连接,向esp8266发送开机指令

这里我就用java的netty了,用他来建立server和发送信息。

(2)从某个渠道得知何时发送开机指令

我让程序定时查询redis,查到东西就发。

到了这一步,想要发开机指令的话:

        在redis的队列(open_pc:开机命令队列)里写入esp8266建立连接时使用的设备名(dev_id)

代码:https://wws.lanzous.com/iTTW4kr9ooj

-- 用idea发布到docker的话 https://blog.csdn.net/u013595395/article/details/108338071

代码要改的地方有两个

1.redis的ip和端口,在common包的RedisHelper里

2.监听的tcp端口,以及redsi队列的队列名,在application-socket.yml文件里

四、后台api服务

    api后台主要有两个任务

(1)建立api服务,用api调用来取代手写redis

这里我就用python的flask来写api了。

(2)建立定时任务,从数据库读取任务信息,在指定的时间点发送开机信息。

定时任务我用的是python的APScheduler,任务写在mysql里。

关于mysql数据库:

    库名open_pc,表名cron_job_conf

    字段如下:

type默认'开机',state默认1,生效结束时间没用到

在表里加入数据后就可以定时开机了

比如第三行:

          value           dev_id           type

    在23时30分,向hlmio,发送开机指令

代码:https://wws.lanzous.com/isTvZkrbm7c

github:https://github.com/hl-mio/open_pc

猜你喜欢

转载自blog.csdn.net/u013595395/article/details/113063934