利用智能音箱語音控制電腦開關(guān)機
大家好,歡迎來到 Crossin的編程教室 !
智能家居是未來的一個趨勢。今天我們就來實現(xiàn)一個智能家居的雛形:利用智能音箱語音控制電腦開關(guān)機。
完成下面這個有趣的實驗,你所需要的東西有:
路由器(能夠形成局域網(wǎng),且電腦已用網(wǎng)線連接)
一個智能音箱(本教程使用的是亞馬遜 Echo Dot 2)
主板支持wake on lan (大部分都支持)
一個樹莓派
原理流程圖如下:

接下里將按照這個流程圖進行講解,首先是智能音箱和樹莓派的連接,我們需要讓樹莓派發(fā)出信號,讓智能音箱將其認作是智能家居并連接。由于我使用的是亞馬遜的智能音箱,因此我選擇了Fauxmo(https://github.com/n8henrie/fauxmo)進行模擬。
1. 在樹莓派上安裝Fauxmo
Fauxmo的安裝方法見下方的操作或網(wǎng)址,注意這里的Python需要3.6以上:
Install for development from GitHub
git clone https://github.com/n8henrie/fauxmo.git
cd fauxmo
python3 -m venv .venv
source ./.venv/bin/activate
pip install -e .[dev]
cp config-sample.json config.json根據(jù)需求編輯(第一次可先忽略)
config.json
fauxmo [-v]
成功后,請讓智能音箱重新搜索設(shè)備,如Echo dot是向他說 "find connected devices",或同一局域網(wǎng)下,在網(wǎng)頁端(alexa.amazon.com/spa/index.html)上點擊Discover devices.
如果它成功發(fā)現(xiàn)了新的設(shè)備,則安裝成功。
2. 修改Fauxmo配置,讓智能音箱能識別到新的“設(shè)備“
Fauxmo其實很簡單,我們只需要關(guān)注兩個地方,一個是源文件下的config.json. 這個文件是用來控制智能音箱能夠識別到的設(shè)備的。其次是plugins文件夾下的文件,這是樹莓派收到指令后將執(zhí)行的文件。由于開關(guān)機我們只需要使用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(該電腦局域網(wǎng)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 查詢:
def wake_on_lan(macaddress):""" Switches on remote computers using WOL. """# Check macaddress format and try to compensate.if len(macaddress) == 12:passelif len(macaddress) == 12 + 5:sep = macaddress[2]macaddress = macaddress.replace(sep, '')else:raise ValueError('Incorrect MAC address format')# Pad the synchronization stream.data = ''.join(['FFFFFFFFFFFF', macaddress * 20])send_data = ''# Split up the hex values and pack.for i in range(0, 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, ('<broadcast>', 7))
如果你的主板還沒有開啟WOL,請進入BOOT中開啟,非常簡單,相關(guān)操作可自行查閱主板的說明書。
ShutdownAndRebootPC.py文件主要提供關(guān)機和重啟的操作,其原理是:通過SSH連接Windows系統(tǒng)執(zhí)行DOS關(guān)機/重啟的命令。
def shutdown(ip=sys.argv[1], username=sys.argv[2], password=sys.argv[3]):# ssh loginproc = pexpect.spawn("ssh %s@%s " % (str(username), str(ip)))index = proc.expect([".*assword.*", ".*yes.*"])if index > 0:proc.sendline("yes")proc.expect(".*assword.*")proc.sendline(password)proc.expect(".*你的用戶名>.*")proc.send("shutdown.exe -s -t 00"+'\r\n')# 重啟是 shutdown.exe -r -t 00time.sleep(1)
上述turnOnPC.py文件和ShutdownAndRebootPC.py文件的源代碼在https://github.com/Ckend/Pi-SmartHome 中可以下載,請根據(jù)自己的需要進行修改。
將上述文件放到前面指定的/home/pi/Documents/Automatic/下,重啟fauxmo,并讓智能音箱重新搜索,找到這幾個新增的設(shè)備,分別是:PC和RebootPC.成功后只要說 "Turn off PC" 即可關(guān)閉計算機。
由于fauxmo僅僅適用于亞馬遜音箱,所以使用其他音箱的同學可能需要尋找一個相應的模擬WeMo或其他智能設(shè)備的項目。接下來還會推送風扇和臺燈的改造計劃,讓普通的它們變成可以語音控制的智能家居。希望各位折騰的開心!
如果文章對你有幫助,歡迎轉(zhuǎn)發(fā)/點贊/收藏~
作者:Ckend
_往期文章推薦_
