文章目錄
- 一、環境準備
- 二、開關機原理
- 數據傳輸框架
- 三、環境搭建
- 1.巴法云平臺設置
- 2.米家設置
- 3.windows網絡喚醒設置
- 4.搭建esp32開發環境并部署
- (1)新建項目
- (2)導入esp32庫
- (3) 添加庫
- (4)導入庫AsyncTCP和WakeOnLan
- 5.關機python腳本配置
- main.py
一、環境準備
win11、小愛音箱、esp32(通過wol喚醒電腦)、巴法云平臺注冊
這里使用的是esp32-cam
二、開關機原理
開機利用WOL技術,Wake-On-LAN簡稱WOL,是一種電源管理功能;如果存在網絡活動,則允許設備將操作系統從待機或休眠模式中喚醒。許多主板廠商支持IBM提出的網絡喚醒標準。該標準允許網絡管理員遠程打開PC機電源,以便進行文件升級、資源跟蹤和設備清點等工作。WOL在還未廣泛的采用,但在網絡時代卻具有廣闊的發展前景。Wake-On-LAN的實現,主要是向目標主機發送特殊格式的數據包,是AMD公司制作的MagicPacket這套軟件以生成網絡喚醒所需要的特殊數據包,俗稱魔術包(Magic Packet)。MagicPacket格式雖然只是AMD公司開發推廣的技術,并非世界公認的標準,但是仍然受到很多網卡制造商的支持,因此許多具有網絡喚醒功能的網卡都能與之兼容。wol基本實現原理實現是向需要被喚醒的終端網卡發送FFFFFFFFFFFFFF+目標主機MAC地址(重復16次)
所組成的一個數據包,網卡收到數據后終端。(需要主板支持WOL,在BIOS中設置打開)
wol參考:https://blog.csdn.net/a18359388932/article/details/126949062
關機則通過獲取巴法云獲取關機指令,再通過python執行關機命令實現。
數據傳輸框架
小愛其實是不直接操作內網被控的電腦,而是通過小愛給一個第三方物聯網平臺巴法云發送一個消息,而你內網要部署一個用來接收巴法云下發的消息的程序,一旦接收到狀態有發生變化,就執行一些執行,比如發送魔術包開機,再比如通過腳本ssh登錄你的主機Windows主機執行關機命令.
三、環境搭建
1.巴法云平臺設置
打開巴法科技&巴法云-巴法設備云-巴法物聯網云平臺 (bemfa.com),點擊注冊
TCP創客云-》新建主題 pc006 -》設置昵稱為電腦
注意:
新建主題的名稱pc
可以任意修改,但末尾必須是006,表示開關設備
修改設備昵稱,這個昵稱電腦
就是后面在米家中控制的名稱
記住私鑰、主題(pc006
)后續會用到
2.米家設置
打開手機app米家
-我的-添加其他平臺-添加-選擇巴法-登錄巴法賬號-同步設備;
同步成功后會顯示出電腦圖標,后面就可以通過小愛同學語音控制"打開電腦"
3.windows網絡喚醒設置
進入BIOS設置wol(自行百度設置)
1.打開設備管理器,點擊網絡適配器,右鍵屬性,將電源管理的兩個勾勾打上;
在高級設置里面將關機網絡喚醒和魔術封包喚醒開啟
4.搭建esp32開發環境并部署
參考:
https://blog.csdn.net/weixin_43935402/article/details/125590294
環境搭建完畢后:
本項目使用 Arduino 框架。
- WakeOnLan : https://github.com/a7md0/WakeOnLan
- AsyncTCP : https://github.com/me-no-dev/AsyncTCP
參考:
https://github.com/yeyt97/ESP32-Bemfa-WOL-Tool/tree/main
(1)新建項目
(2)導入esp32庫
(3) 添加庫
添加庫WakeOnLan
添加庫AsyncTCP
(4)導入庫AsyncTCP和WakeOnLan
添加文件bemfa_client.hpp、wifi_helper.hpp:
將main.cpp拷貝到.ino文件中
見src目錄
https://github.com/yeyt97/ESP32-Bemfa-WOL-Tool/tree/main
#include "bemfa_client.hpp"
#include "WakeOnLan.h"
#include "wifi_helper.hpp"BemfaClient* bemfaClient;
WifiHelper* wifiHelper;WiFiUDP UDP;
WakeOnLan WOL(UDP);const int LED_Pin = 2;const char *SSID = "xxx"; // wifi名稱
const char *PSW = "xxx"; // wifi密碼const char *UID = "xxx"; // 巴法云的UID
const char *TOPIC = "pc006"; // 巴法云中創建的TOPIC(不是昵稱)const char *TARGET_MAC_ADDR = "xxx"; // 要啟動的電腦的MAC地址void blinkTwice() {digitalWrite(LED_Pin, HIGH);delay(200);digitalWrite(LED_Pin, LOW);delay(200);digitalWrite(LED_Pin, HIGH);delay(200);digitalWrite(LED_Pin, LOW);
}void setup() {Serial.begin(115200);Serial.println("Beginning...");wifiHelper = new WifiHelper(SSID, PSW, LED_Pin);bemfaClient = new BemfaClient(UID, TOPIC);bemfaClient->addCommand("on", []{Serial.println("Send magic packet");WOL.setRepeat(3, 100);WOL.calculateBroadcastAddress(WiFi.localIP(), WiFi.subnetMask());WOL.sendMagicPacket(TARGET_MAC_ADDR);blinkTwice();});
}void loop() {wifiHelper->tick();bemfaClient->tick();
}
編譯燒錄即可,然后通過小愛同學“打開電腦”即可控制電腦開機
5.關機python腳本配置
安裝python
參考:https://docs.python.org/zh-cn/3/using/index.html
#安裝相關依賴
pip install requests
pip install schedule
pip install pyinstaller
python打包
https://www.cnblogs.com/weilaiqinkong/p/17240065.html
如:pyinstaller -F -w main.py
巴法云平臺tcp連接參考:https://bbs.bemfa.com/81
main.py
# -*- coding: utf-8
import socket
import threading
import time
import os
import shutil
import sys
import getpassdef connTCP():global tcp_client_socket# 創建sockettcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# IP 和端口server_ip = 'bemfa.com'server_port = 8344try:# 連接服務器tcp_client_socket.connect((server_ip, server_port))#發送訂閱指令substr = 'cmd=1&uid=巴法云私鑰&topic=pc006\r\n'tcp_client_socket.send(substr.encode("utf-8"))except:time.sleep(2)connTCP()#心跳
def Ping():# 發送心跳try:keeplive = 'ping\r\n'tcp_client_socket.send(keeplive.encode("utf-8"))except:time.sleep(2)connTCP()#開啟定時,30秒發送一次心跳t = threading.Timer(30,Ping)t.start()connTCP()
Ping()while True:# 接收服務器發送過來的數據recvData = tcp_client_socket.recv(1024)if len(recvData) != 0:data = recvData.decode('utf-8')print('recv:', data)if "on" in data:print("do nothing!")elif "off" in data:print("starting poweroff after 3s ...")# 3s后 系統自動關機print(os.system('shutdown -s -t 3'))else:print("conn err")connTCP()
設置main.exe開機啟動
https://www.cnblogs.com/muxiaomu/p/16649990.html