1. 程式人生 > >基於樹莓派的AirPlay功能實現

基於樹莓派的AirPlay功能實現


手裡有一個第一代的樹莓派開發板,很長時間都沒有使用過。今天嘗試著搭建一個支援AirPlay的服務。順便回顧一下樹莓派的燒錄、配置、遠端登入等操作。

概述

AirPlay是蘋果公司的在iOS4.2及OS X Mountain Lion中加入的一種播放技術,可以將iPhone、iPod touch、iPad及Mac(需要OS X Mountain Lion或更新版)上的視訊映象傳送到支援Airplay的裝置

前一段時間購買了“Beats X”這個耳機,被蘋果裝置間切換的流暢與無縫所吸引。想著時候可以讓其他的音訊裝置也實現這樣的無縫切換。查資料發現蘋果自家的AirPlay技術可以實現這樣的流暢體驗(AirPlay與Beats X耳機的實現原理不同。前者是基於無線區域網,後者是藍芽和icloud的協同配合。但是使用者體方面很像,可以在蘋果裝置的控制中心控制)。基於網上的相關教程,通過樹莓派執行一個Airplay服務,配合小音響實現相應的功能。

燒錄系統

樹莓派支援很多系統,這裡選用的官方的raspbian系統。

下載後得到raspbian-jessie.zip 的壓縮包,解壓得到系統映象raspbian-jessie.img 。通過 Win32DiskImager 軟體燒錄映象到一張空白SD卡上。

待燒錄完畢,插入樹莓派,上電即可開機。

登陸

一般來說,登陸到樹莓派的系統有三種方式:
1. 開發板外接顯示器和鍵盤滑鼠。
2. 通過VNC遠端桌面登陸
3. 通過SSH登陸

這次用樹莓派,只是需要搭建AirPlay服務,所以SSH遠端登陸時最省時省力的方式。

SSH登陸

目前的樹莓派系統預設是關閉SSH服務的,所以無法在第一次直接使用SSH登陸,首先在剛才燒錄好SD卡的根目錄下建立一個名為SSH

檔案(大寫,且沒有後綴名)。之後再插卡上電就可以使用了。

通過網線將樹莓派和路由器相連,登陸路由器後臺可以查詢樹莓派獲得的IP地址。

知道樹莓派的IP後可以通過軟體PuTTY進行登陸。

Host Name(or IP address)這裡填寫剛才查到的IP地址,Connection type選擇SSH。其他選項預設,點選Open。依次輸入樹莓派的賬戶和密碼:

VNC登陸

在SSH登陸的基礎上,可以配置實現遠端桌面登陸(圖形化介面)。
由於系統中預設沒有安裝相關服務,所以首先需要安裝。
執行如下命令:

sudo apt-get install tightvncserver

安裝完畢後設置密碼

vncpasswd

啟動服務

tightvncserver -geometry 800x600 :1

通過軟體RealVNC Viewer 遠端登陸圖形化介面

VNC Server 這裡填寫IP地址:控制檯號碼。剛才命令tightvncserver -geometry 800x600 :1 表示以800x600的解析度開啟1號控制檯。所以這裡輸入192.168.123.5:1。之後點選登陸,輸入密碼就可以看到以圖形化介面訪問到樹莓派。

如果希望每次都使用VNC登陸樹莓派,可以配置其開機啟動。具體方法可以參考文章《VNC遠端登入樹莓派的圖形介面》。其中有詳細的配置方法。

無線連結

剛才的是通過網線使樹莓派和電腦在同一個區域網下的。第一代的樹莓派預設硬體是不支援無線網路的(貌似新的樹莓派支援無線)。我採用了樹莓派預設免驅的無線網絡卡RTL8188CUS。通過USB介面和樹莓派相連。在SSH登陸的情況下(SSH登陸對網路質量要求低)。通過命令:

lsusb

可以顯示是否識別到了無線網絡卡

同時執行命令:

ifconfig

也可以查詢無線網絡卡的資訊(Wlan0)

通過一下命令, 搜素當前環境的無線網路。

sudo iwlist wlan0 scan | grep ESSID

通過如下命令備份原始檔案。

sudo cp /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf.bak   

通過命令

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf   

修改其中的內容

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB

network={
        ssid="your_wfi_Name"
        psk="your_wifi_PassWord"
        key_mgmt=WPA-PSK
}

這裡ssid psk key_mgmt 分別指無線網的名稱、密碼、加密方式。更改完後,CTRL+O 儲存更改, CTRL+X退出編輯器。

如果你用VNC的形式登入樹莓派,則配置Wifi只要點選遠端桌面右上角的Wifi圖表進行連線即可。

更新軟體

更改軟體源

樹莓派預設的軟體源地址比較慢(親測只有20~30 kb/s)。所以普遍會更關國內的映象源
SSH方式登入樹莓派

輸入以下命令

nano /etc/apt/sources.list

複製一下內容在其中,並且通過#號登出原來的地址

deb http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib
deb-src http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib

效果如下

之後通過CTRL+O 儲存更改, CTRL+X退出編輯器。

執行更新

執行如下命令,進行更新系統軟體。

sudo apt-get update && apt-get upgrade -y

安裝Airplay服務

其中給出了詳細的安裝方法。

安裝依賴環境

通過SSH登入樹莓派,分別執行如下命令

sudo apt-get install autoconf automake libtool
sudo apt-get install libltdl-dev libao-dev libavahi-compat-libdnssd-dev
sudo apt-get install avahi-daemon

從GitHub上獲取原始碼

git clone https://github.com/juhovh/shairplay.git

編譯和安裝

進入對應的目錄

cd shairplay

依次執行如下四條指令,進行程式碼的編譯和安裝

./autogen.sh
./configure
make
sudo make install

啟動

進入軟體的當前目錄 /home/pi/shairplay 。執行如下命令即可開啟服務

shairplay -a your_AirPlay_Name

此時ios裝置或者Mac裝置連線在同一個Wifi下,便可看到支援AirPlay的裝置,名稱就是your_AirPlay_Name。點選連線後,蘋果裝置的音訊訊號就通過Wifi傳輸到樹莓派的3.5mm音訊口。這裡可以接入音響的訊號輸入口。

完善

為了使樹莓派每次上電後可以自動開啟AirPlay服務。需要配置自啟動,另外消除噪聲。

自啟動

建立啟動指令碼檔案

依次執行如下命令,建立一個啟動指令碼檔案。

cd /etc/init.d/
touch shairplay
nano shairplay

在其中複製一下內容

#!/bin/bash
#
# This starts and stops shairplay
#
### BEGIN INIT INFO
# Provides: shairplay
# Required-Start: $network
# Required-Stop:
# Short-Description: Free portable AirPlay server implementation similar to ShairPort.
# Description: Free portable AirPlay server implementation similar to ShairPort.
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO


# Source function library.
. /lib/lsb/init-functions

DAEMON="/usr/local/bin/shairplay"
DAEMON_ARGS="-a your_AirPlay_Name"
AIRPORT_KEY_DIR="/usr/local/share/shairplay"

[ -x $binary ] || exit 0

RETVAL=0

start() {
 echo -n "Starting shairplay: "
 start-stop-daemon --start --quiet --chdir $AIRPORT_KEY_DIR \
 --exec "$DAEMON" -b --oknodo -- $DAEMON_ARGS
 log_end_msg $?
}

stop() {
 echo -n "Shutting down shairplay: "
 start-stop-daemon --stop --quiet --exec "$DAEMON" \
 --retry 1 --oknodo
 log_end_msg $?
}

restart() {
 stop
 sleep 1
 start
}

case "$1" in
 start)
 start
 ;;
 stop)
 stop
 ;;
 status)
 status shairplay
 ;;
 restart)
 restart
 ;;
 *)
 echo "Usage: $0 {start|stop|status|restart}"
 ;;
esac
exit 0

其中剛才的指令碼檔案中的DAEMON_ARGS="-a your_AirPlay_Name"可以設定自己的名字。

DAEMON="/usr/local/bin/shairplay"
DAEMON_ARGS="-a your_AirPlay_Name"
AIRPORT_KEY_DIR="/usr/local/share/shairplay"

之後通過CTRL+O 儲存更改, CTRL+X退出編輯器。

加入執行許可權

依次執行如下命令。賦予指令碼執行許可權,並且更新配置資訊。

chmod +x /etc/init.d/shairplay
update-rc.d shairplay defaults

執行如下命令,切換到使用者目錄

cd ~

依次執行如下命令,拷貝airport.key

mkdir /usr/local/share/shairplay
cp shairplay/airport.key /usr/local/share/shairplay

輸入一下命令,在etc/rc.local中新增內容

 nano /etc/rc.local

新增的內容如下(在exit 0之前)。

# Don't run multiple instances - start just one screen, named "shairplay":
[[ $(screen -list | grep shairplay) == '' ]] &&
 screen -dmS shairplay sh
# Keep shairplay perpetually running. When it crashes, we can just SIGKILL it, and it comes back:
[[ $(ps aux | grep -v grep | grep pts | grep '/usr/bin/shairplay') == '' ]] &&
 screen -S shairplay -p 0 -X stuff "while true; do /usr/bin/shairplay --apname=Airamaplay --ao_devicename=default; sleep 2s; done
"

之後通過CTRL+O 儲存更改, CTRL+X退出編輯器。

之後通過重啟樹莓派,就直接可以在蘋果裝置中選擇AirPlay服務了。

消除噪音

如果音響輸出有噪聲,可以嘗試樹莓派Audio的pwm模式。
執行如下命令

sudo nano /boot/config.txt

在最後增加如下配置引數

dtparam=audio=on
audio_pwm_mode=2

之後通過CTRL+O 儲存更改, CTRL+X退出編輯器。