我今年砌的 IoT 音樂聖誕樹
臨近聖誕,除了需要訂購火雞預備聖誕大餐,當然少不了佈置聖誕樹。聖誕樹總帶給人舒服、溫暖的感覺,就算每年用上同一樣的(塑膠製)樹身、同一樣的裝飾也不覺得乏味,華麗依然。若然可以播放聖誕音樂,就更有節日氣氛。所以今年決定搞搞新意思,佈置一棵不一樣的聖誕樹。
要佈置一棵音樂聖誕樹,純粹只用音樂播放器 (music player) 及喇叭 (speaker) 不停播放聖誕歌曲未免太過單調,所以加入 IoT (Internet of Things) 元素,令設計可以有更多變化。試想像,平日播放不同類型音樂,但當按動掛在聖誕樹上的一個無線按鈕,播放器便立即播放聖誕歌曲,將聖誕喜悅用音樂帶到每個角落。要佈置一棵 IoT 音樂聖誕樹,除了現有聖誕樹及裝飾,還需要以下設備:
1. Amazon Dash Button
Amazon Dash Button 是 Amazon 於去年愚人節推出市場的物聯網按鈕 (IoT button),作用是讓用戶只要按動 Dash Button 便能自動訂購所需用品,完全無需登入 Amazon 網站,非常方便。推出以來吸引不少開發人員研究,相信除了方便購物外,其物聯網 (Internet of Things) 特性令它可作其它用途。結果發現 Dash Button 長期處於睡眠狀態,但當被按動時 Dash Button 便會連接 Wi-Fi 網絡,並會發放 ARP (Address Resolution Protocol) 訊息。透過外置設備如電腦可以截取這些 ARP 訊息,並將訊息轉化成其它指令,更可以操控其它設備。今次就選用了 Amazon Dash Button,目的就是當按鈕被按動時發出訊號,播放聖誕音樂。
2. 電腦
作用是用來截取 Amazon Dash Button 被按下時所發出的 ARP 訊息,然後控制播放器播放聖誕音樂。它需要運行預先開發的程式(下面有詳盡說明),不停監察網絡內由 Dash Button 所發出的 ARP 訊息,及運行音樂播放器播放聖誕音樂。選擇電腦方面沒有特別限制,只要可以運行自己開發的程式,及能透過開發程式控制所需音樂播放器即可。今次使用的是一台運行 Linux 的 netbook,也是早前用作設立 APRS IGate 同一台 netbook。
3. Spotify
潮流興 streaming,聽歌怎會少得 Spotify。Spotify 的好處是歌曲數量多,不同類型的音樂也一應俱全,由鄭少秋的小李飛刀、Phantom of the Opera、貝多芬第九交響樂、到日本 V 型電磁俠主題曲,應有盡有。而且 playlist 選擇多,又不用自己下載,選用 Spotify 播放聖誕音樂絕對是正確選擇。
4. 無線藍牙喇叭
聽音樂當然要用音質較好的喇叭,又要夠輕巧可以放置於聖誕樹底部,所以選用友人贈送的 Logitech UE BOOM 無線藍牙喇叭。其特性是音質好、低音重、音量大、又防水,完全適合任何環境使用。將喇叭放置於樹身旁,利用地面返射令音質更闊更廣,播放聖誕音樂令全屋每個角落也感受到聖誕氣氛。
一切準備就緒,可以正式動手。
Step 1: Amazon Dash Button 訂購及設定
要購買 Amazon Dash Button,首先需要成為 Amazon Prime 用戶才可訂購,而且只能運送到美國境內,所以最後只好委託朋友幫手訂購,然後再運送到香港。雖然有點麻煩,但也是值得的。到手後,接着就是將按鈕接駁 Wi-Fi 網絡。這個部分需要透過手機(Android 或 iPhone 手機均可)及使用 Amazon app 進行設定。步驟如下:
- 從 App Store 或 Google Play 下載 Amazon app
- 登入 Amazon 帳戶(建議使用新帳戶,以免影響現有帳戶)
- 從主目錄進入 Your Account
- 選擇 Set up a new device
- 選擇 Dash Button
- Amazon app 會要求使用手機位置權限協助設定,可以無需理會
- 按下 Agree and Get Started
- 長按 Dash Button 按鈕 6 秒,直至藍光閃動為止,然後按 Connect
- 選擇接駁 Wi-Fi 網絡名稱並輸入密碼
- 完成 Wi-Fi 設定後,當出現選擇產品版面,請不要繼續並立即離開設定,否則以後每次按動按鈕也會幫你訂購產品
Dash Button 設定現已完成,接著就要找出識別 Dash Button 所發出 ARP 訊息的方法。
Step 2: 尋找 MAC Address
網絡上不同設備會互相發放 ARP 訊息,作用是探索其它共存在同一網絡上的設備。要識別由 Dash Button 發出的 ARP 訊息,首先需要知道 Dash Button 的 MAC address。透過由 Bob Steinbeiser 開發的 Python 程式,能捕捉 ARP 訊息。以下改良版本可以從所有截取得來的 ARP 訊息中讀取有關設備的 MAC address 及 IP 地址:
將以上源碼儲存到 ~/discover.py,並執行以下指令加入截取訊息權限:
$ sudo setcap cap_net_raw=ep /usr/bin/python2.7 $ sudo setcap 'CAP_NET_RAW+ep CAP_NET_ADMIN+eip' /usr/bin/python2.7 $ sudo setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/sbin/tcpdump
完成後用以下指令執行程式,開始監察 ARP 訊息。
$ python ./discover.py
當一按下按鈕,電腦螢光幕會即時顯示一連串被截取到的 ARP 訊息內的 MAC address。現在要留意的是由 Dash Button 向 Wi-Fi 路由器 (router) 所發出的 ARP reply,所以目的 IP 地址 (destination IP address) 就是路由器的 IP 地址(通常尾數是 .1)。如此就能識別得出由 Dash Button 所發出的 ARP 訊息,從而得知 Dash Button 的 MAC address。
當程式運行時會截取到不同 ARP 訊息,可能會令你混淆。有需要時再按下按鈕,以確定真實的 MAC address。確定後將 MAC address 輸入到程式中,然後重新運行程式,再按下按鈕測試。如果 MAC address 吻合,螢光幕會顯示 Button pressed 字句。如果仍然顯示 Unknown device,請重新再試,務求找到正確 MAC address 為止。
Step 3: 連接 Spotify
確認 MAC address 後,接下來是連接 Spotify。首先需要安裝 Spotiy,於 Linux 安裝 Spotify 需要輸入之下指令。
# 1. Add the Spotify repository signing key to be able to verify downloaded packages sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys BBEBDCB318AD50EC6865090613B00F1FD2C19886 # 2. Add the Spotify repository echo deb http://repository.spotify.com stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list # 3. Update list of available packages sudo apt-get update # 4. Install Spotify sudo apt-get install spotify-client
完成安裝後,開啟並登入 Spotify,然後下載由 Wander Nauta 開發的 Spotify 指令行 (command-line) 控制器。程式能透過指令行控制 Spotify 操作,無論播放及選曲樣樣佳能,惟獨需要預先開啟 Spotify 才可操控。所以開啟 Spotify 後切勿把它關掉。下載完成後將源碼儲存到 ~/sp.sh 即可。
現在需要準備聖誕音樂 playlist,當按動按鈕後,Spotify 會直接播放 playlist。可以在 Spotify 中尋找適合的,或自己製作 playlist 亦可。確定後,將 playlist 的 Spotify URI 輸入到以下源碼當中,並儲存到 ~/callsp.sh:
然後給 sp.sh 及 callsp.sh 執行權限:
$ chmod +x ~/sp.sh $ chmod +x ~/callsp.sh
最後,就是更新 Python 程式,令按鈕被按動後程式會直接執行 callsp.sh,讓 Spotify 播放早前已選定的聖誕音樂 playlist。除此之外,在測試時發現 Dash Button 有幾會在發出 ARP reply 10 秒後重發,這個可能跟 TCP retry 有關。為避免重複執行指令,新程式會自動放棄由接收到第一個 ARP reply 後 15 秒內所有由同一 MAC address 發出的 ARP 訊息。
大功告成!用以下指令執行程式,首先著 Spoitfy 播放其它音樂,然後按動按鈕測試:
$ python ./listen.py
這就是今年的 IoT 音樂聖誕樹 。: )
IoT 奧妙之處,就是透過感應器、互聯網、程式開發、及無窮無盡的創意,就算使用同一樣的硬件,也可以製作出傲然不同的解決方案。以 Amazon Dash Button 為例,除了可以用作播放音樂,也可以用作 Internet 門鐘,放置於家居門外,當有客人拜訪按下門鐘,無論你身在何地,也可以通知你。亦可以作類似平安鐘用途,當身體不適或需要人幫助時可以按鐘通知家人。或者簡簡單單一按幫你叫外賣,完全不用上網落單。一隻只賣 US$4.99 的 Amazon Dash Button 用途已經可以如此多變化,IoT 潛力不容忽視。
最後,祝大家聖誕節快樂。Merry Christmas and Happy IoT!
(完)
發表意見