利用智能音箱語音控制電腦開關機
完成下面這個有趣的實驗,你所需要的東西有:
路由器(能夠形成區域網,且電腦已用網線連接)
一個智能音箱(本教程使用的是亞馬遜 Echo Dot 2)
主板支持wake on lan (大部分都支持)
一個樹莓派
原理流程圖如下:
接下里將按照這個流程圖進行講解,首先是智能音箱和樹莓派的連接,我們需要讓樹莓派發出信號,讓智能音箱將其認作是智能家居並連接。由於我使用的是亞馬遜的智能音箱,因此我選擇了Fauxmo(https://github.com/n8henrie/fauxmo)進行模擬。
1.在樹莓派上安裝Fauxmo
Fauxmo的安裝方法見下方的操作或網址,注意這裡的Python需要3.6以上:
Install for development from GitHub
根據需求編輯(第一次可先忽略)
成功後,請讓智能音箱重新搜索設備,如Echo dot是向他說"find connected devices",或同一區域網下,在網頁端(alexa.amazon.com/spa/index.html)上點擊Discover devices.
如果它成功發現了新的設備,則安裝成功。
2.修改Fauxmo配置,讓智能音箱能識別到新的「設備「
Fauxmo其實很簡單,我們只需要關注兩個地方,一個是源文件下的config.json. 這個文件是用來控制智能音箱能夠識別到的設備的。其次是plugins文件夾下的文件,這是樹莓派收到指令後將執行的文件。由於開關機我們只需要使用Python進行控制,因此我偷個懶使用了Fauxmo的commandlineplugin(下載地址:https://github.com/n8henrie/fauxmo-plugins/blob/master/commandlineplugin.py). 即樹莓派得到指令後就開啟命令行,輸入相應的操作。
我的PC的config.json配置如下:
"PcControl": {
"path":"/home/pi/Documents/fauxmo/src/fauxmo/plugins/commandlineplugin.py",
"DEVICES": [
{
"name":"PC",
"port":49915,
"on_cmd":"python2 /home/pi/Documents/Automatic/turnOnPC.py",
"off_cmd":"python /home/pi/Documents/Automatic/ShutdownAndRebootPC.py 192.168.199.236(該電腦區域網IP) 電腦賬號 電腦密碼 shutdown",
"state_cmd":""
},
{
"name":"RebootPC",
"port":49920,
"on_cmd":"python /home/pi/Documents/Automatic/ShutdownAndRebootPC.py 192.168.199.236 ckend ckend reboot",
"off_cmd":"python /home/pi/Documents/Automatic/ShutdownAndRebootPC.py 192.168.199.236 ckend ckend reboot",
"state_cmd":""
}]
},
意思就是,如果我向echo說,turn on my PC , 它就通過49915埠訪問了plugins文件夾下的commandlineplugin.py,然後on指令的操作是讓CMD用python2訪問/home/pi/Documents/Automatic/文件夾下的turnOnPC.py文件。
3.增加turnOnPC.py文件和ShutdownAndRebootPC.py文件
turnOnPC.py文件的用處就是通過wake on lan 喚醒電腦,需要提供電腦的Mac地址,不知道的話可以在CMD中輸入 ARP -a 查詢:
defwake_on_lan(macaddress):
""" Switches on remote computers using WOL. """
# Check macaddress format and try to compensate.
iflen(macaddress) ==12:
pass
eliflen(macaddress) ==12+5:
sep = macaddress[2]
macaddress = macaddress.replace(sep,"")
else:
raiseValueError("Incorrect MAC address format")
# Pad the synchronization stream.
data ="".join(["FFFFFFFFFFFF", macaddress *20])
send_data =""
# Split up the hex values and pack.
foriinrange(,len(data),2):
send_data ="".join([send_data,struct.pack("B",int(data[i: i +2],16))])
# Broadcast it to the LAN.
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)
sock.sendto(send_data, ("
",7))
如果你的主板還沒有開啟WOL,請進入BOOT中開啟,非常簡單,相關操作可自行查閱主板的說明書。
ShutdownAndRebootPC.py文件主要提供關機和重啟的操作,其原理是:通過SSH連接Windows系統執行DOS關機/重啟的命令。
defshutdown(ip=sys.argv[1],username=sys.argv[2],password=sys.argv[3]):
# ssh login
proc = pexpect.spawn("ssh%s@%s"% (str(username),str(ip)))
index = proc.expect([".*assword.*",".*yes.*"])
ifindex >:
proc.sendline("yes")
proc.expect(".*assword.*")
proc.sendline(password)
proc.expect(".*你的用戶名>.*")
proc.send("shutdown.exe -s -t 00"+"
")
# 重啟是 shutdown.exe -r -t 00
time.sleep(1)
上述turnOnPC.py文件和ShutdownAndRebootPC.py文件的源代碼在https://github.com/Ckend/Pi-SmartHome 中可以下載,請根據自己的需要進行修改。
將上述文件放到前面指定的/home/pi/Documents/Automatic/下,重啟fauxmo,並讓智能音箱重新搜索,找到這幾個新增的設備,分別是:PC和RebootPC.成功後只要說 "Turn off PC" 即可關閉計算機。
由於fauxmo僅僅適用於亞馬遜音箱,所以使用其他音箱的同學可能需要尋找一個相應的模擬WeMo或其他智能設備的項目。接下來還會推送風扇和檯燈的改造計劃,讓普通的它們變成可以語音控制的智能家居。希望各位折騰的開心!
題圖來自網路


TAG:幻象客 |