樹莓派學習筆記(5):成功實現NAS家庭服務器(流媒體播放、文件共享及下載機)

轉載請註明:@小五義http://www.cnblogs.com/xiaowuyi  QQ羣:64770604javascript

 

1、家庭服務器實現的主要功能

一、流媒體播放服務:利用DLNA實現電視、手機、電腦播放其上面的媒體文件。html

二、文件共享:利用samba實現手機、電腦等終端與服務器的文件共享。java

三、自動下載:利用aria2c實現自動下載。python

先上幾張效果圖:android

用orico的包裝盒作了個機箱。git

內部效果,線仍是有些凌亂github

放在桌上,感受還不錯,呵呵web

2、準備工做

一、樹莓派B+chrome

二、安裝raspbian系統,具體安裝方法見:樹莓派學習筆記(1):入手樹莓派apache

三、設置固定IP爲192.168.1.120,設置方法見:樹莓派學習筆記(3):利用VNC遠程控制樹莓派。

四、安裝vnc軟件,安裝方法見:樹莓派學習筆記(3):利用VNC遠程控制樹莓派。

五、準備了一塊舊移動硬盤(80G)

六、準備了可外接供電的usb hub一個,樹莓派自己輸出電流較小,很難保證移動硬盤的運行,因此加了一個可外接供電的usb hub。

3、安裝samba實現文件共享

一、準備硬盤

      硬盤進行分區和格式化,這裏我直接就分了一個區,格式化爲ext4格式,據網上介紹說若是是fat或者ntfs等格式可能會出現權限問題,因而乾脆直接格式化爲ext4格式。硬盤在樹莓派上格式化會比較慢,我就在電腦上進行了格式化。電腦操做系統是windows7,利用軟件MiniTool Partition Wizard Home Edition 8.0,下載地址:http://www.partitionwizard.com/download.html。具體使用方法是先將原分區刪除,而後點擊creat,在格式那裏選ext4,類型我選的primary,label用的nas,而後點擊apply就開始格式化硬盤了。(若是用容量較小的U盤,能夠直接用樹莓派格式化,命令爲:mkfs -t ext4 /dev/sdb1

1

二、將硬盤掛載到樹莓派上

      樹莓派開機後,用putty鏈接(鏈接方法見樹莓派學習筆記(1):入手樹莓派)後,爲方便操做直接進行root用戶(具體方法見http://www.cnblogs.com/xiaowuyi/p/3980037.html一樓評論處),而後運行df –h,查看硬盤掛載狀況。

root@raspberrypi:/home/pi# df -h
Filesystem              Size        Used        Avail     Use%      Mounted on
rootfs                    2.9G       2.4G        387M     87%       /
/dev/root               2.9G       2.4G        387M     87%       /
devtmpfs               183M        0           183M     0%         /dev
tmpfs                    38M        792K        37M      3%        /run
tmpfs                    5.0M         0          5.0M       0%        /run/lock
tmpfs                     75M         0          75M        0%        /run/shm
/dev/mmcblk0p1     56M        9.7M       47M      18%        /boot
/dev/sda1              70G         24M        67G      1%         /media/nas

最後一行/dev/sda1說明硬盤已經掛載。爲下一步安裝samba,將共享文件夾設爲/samba。因而新建文件夾:

mkdir /samba

設置訪問權限:shmod 777 /samba

將硬盤掛載到/samba文件夾,具體步驟:

umount /dev/sda1   #取消掛載

mount /dev/sda1 /samba

這裏再查看df -h,結果爲:

2

這裏表示已掛載成功。

三、解決硬盤的自動掛載

      每次樹莓派重啓或者硬盤插拔都須要對硬盤進行從新掛載,比較麻煩,所以須要自動掛載。這裏要修改/etc/fstab文件。有人喜歡用vi進行編輯,我比較喜歡直接vnc鏈接上後,用編輯器進行編輯。

image

 

能夠看到,fstab文件其實就是一個表格,表格各列的含意以下:

第一列:磁盤分區名/卷標,通常是/dev/sdaN(N表示正整數)

第二列:掛載點,咱們在這裏把/dev/sda1掛到/samba上。

第三列:缺省設置,通常用defautls。

第四列:是否備份:0——表示不作 dump 備份;1——表示要將整個 <fie sysytem> 裏的內容備份;2 也表示要作 dump 備份,但該分區的重要性比 1 小。

第五列:檢測順序:0——不進行檢測;根分區(/),必須填寫 1,其它的都不能填寫 1。若是有分區填寫大於 1 的話,則在檢查完根分區後,從小到大依次檢查下去。

具體填寫方法在圖中已註明。

四、安裝samba

更新一下源:

sudo apt-get update

安裝samba

sudo apt-get install samba samba-common-bin

安裝完成後,配置/etc/samba/smb.conf文件

在其最後添加如下命令:

 

#================================================

#轉載請註明:@小五義http://www.cnblogs.com/xiaowuyi   QQ羣:64770604

[share]                                   #共享文件的名稱,將在網絡上以此名稱顯示
        path = /samba                     #共享文件的路徑
        valid users = root pi             #容許訪問的用戶,這裏我用的是root 和 pi 兩個用戶
        browseable = yes                  #容許瀏覽                                 
        public = yes                      #共享開放                                      
        writable = yes                    #可寫

#================================================

保存後,重啓samba服務,輸入

/etc/init.d/samba restart

最後添加共享用戶:

smbpasswd –a pi  #這裏我用的pi。

設置開機自啓動,編輯/etc/rc.loca,以下

4

五、測試samba安裝效果

在windows計算機上,打開個人電腦,在左下角網絡點右鍵,選映射網絡驅動器

image

點擊完成會提示輸入用戶名和密碼,這裏輸入設置的共享用戶名和密碼。

image

 

最後在計算機下會出現共享的文件夾,點開文件夾,新建test.txt文件進行一下測試,若是能正常創建,就說明ok了,若是不行,應該是權限問題,可再從新設置一下/samba文件夾權限。這裏注意,若是在/samba文件夾下新建新的文件夾,也須要設置權限,能夠用vnc鏈接後,用管理員瀏覽,點右鍵設置文件夾權限爲read and write,也能夠用chmod命令設置。

4、安裝DLNA實現流媒體服務器

DLNA主要面向媒體資源(好比視頻、音樂)實現網內共享,具體步驟以下:

一、安裝minidlna

更新一下安裝源

sudo apt-get update

安裝minidlna

sudo apt-get install minidlna

二、設置配置文件

設置/etc/minidlna.conf文件,在文件尾部添加以下內容:

 

#===================================================================================

#轉載請註明:@小五義http://www.cnblogs.com/xiaowuyi   QQ羣:64770604
media_dir=A,/samba/DLNA/Music                #A表示這個目錄是存放音樂的,當minidlna讀到配置文件時,它會自動加載這個目錄下的音樂文件
media_dir=P,/samba/DLNA/Picture                                               
media_dir=V,/samba/DLNA/Video                                                 
db_dir=/samba/DLNA/db                       #配置minidlna的數庫數據的存放目錄
log_dir=/samba/DLNA/log                     #配置日誌目錄
#=======================================================================================

三、創建文件夾

在/samba文件夾下,創建以上文件夾,並設置好權限爲read and write。

四、重啓minidlna

/etc/init.d/minidlna restart

測試:

/etc/init.d/minidlna status

返回以下結果爲正常。

image

五、在電腦上進行播放

先在樹莓派以上對應的video等文件夾內存上一些文件(可利用samba直接從電腦上考入),而後返回到計算機進行操做。

點擊個人電腦下面的網絡,出現媒體設備

image

雙擊進入媒體播放器,在左邊的列表欄下方其它媒體庫中出現raspberrypi:root,點擊後,可選擇音樂,視頻等。

image

 

 

這時雙擊就能夠欣賞了。

六、手機上進行播放

手機上實現網絡共享,可安裝es file explorer軟件,在其網絡處進行設置,設置方法與電腦基本同樣,這裏再也不詳述。設置後,文件都可瀏覽,媒體文件雙擊能夠在線播放。

也能夠直接使用updp播放器,這裏我安裝的是moliplayer,能夠在其附近設備裏,直接找到raspberrypi:root,訪問其媒體問題,注意,這裏是訪問的DLNA共享,因此不須要再輸入密碼。

七、智能電視進行播放

智能電視通常都是用的android系統,與手機基本同樣。

5、安裝aria2實現下載機功能

一、安裝aria2

更新一下安裝源

sudo apt-get update

安裝aria2

sudo apt-get install aria2

二、建立配置文件

在/etc目錄下建立aria2目錄用來存放配置文件:

sudo mkdir /etc/aria2

建立空白的aria2.session文件:

sudo touch /etc/aria2/aria2.session

建立配置文件

sudo nano /etc/aria2/aria2.conf

在該文件中輸入如下內容:

#=========文件保存目錄自行修改
dir=/samba
disable-ipv6=true
#打開rpc的目的是爲了給web管理端用
enable-rpc=true
rpc-allow-origin-all=true
rpc-listen-all=true
#rpc-listen-port=6800
continue=true
input-file=/etc/aria2/aria2.session
save-session=/etc/aria2/aria2.session
max-concurrent-downloads=3

這裏爲了方便共享,我直接設置將文件下載到samba共享文件夾。

三、啓動aria2

sudo aria2c --conf-path=/etc/aria2/aria2.conf

若是沒有提示任何錯誤信息,那就按ctrl+c中止上面的語句,轉爲後臺運行:

sudo aria2c --conf-path=/etc/aria2/aria2.conf -D

同時其此句寫到開機啓動中,編輯/etc/rc.loca,以下

3

四、安裝appache

        爲了能web管理aria2進行下載,須要安裝yaaw和apache環境。

安裝appach

sudo apt-get install apache2

修改/var/www的權限

chmod 777 /var/www

五、安裝yaaw

        從https://github.com/binux/yaaw下載yaaw,點擊右下角的image ,下載後將解壓後的文件夾內內容拷貝到/var/www文件夾下。這時輸入樹莓派IP,若是出現如下頁面,則表示已經正常工做了。

image

這裏能夠點add添加下載任務,具體方法再也不詳述。

六、實現迅雷的離線下載

        不少網站都介紹了aria2實現迅雷離線下載的方法,這裏也作一下描述。我以firefox瀏覽器爲例,chrome瀏覽器自己有一個迅雷離線增長插件,能夠從https://chrome.google.com/webstore/detail/mbl%E8%BF%85%E9%9B%B7%E7%A6%BB%E7%BA%BF%E5%A2%9E%E5%BC%BA%E8%84%9A%E6%9C%AC/bcbkegabebafalcgckcdphlpainejkja進行安裝,安裝後就和firefox基本同樣了。

在firefox裏添加一個書籤:

image

具體爲:

===========================================================

名稱爲:ThunderLixianExporter

地址爲:javascript:void((function(){var d=document;var s=d.createElement('script');s.src='http://s.binux.me/tle.js';s.id='TLE_script';d.body.appendChild(s)})())

==================================================================

 

登陸迅雷離線網站:lixian.xunlei.com,登陸後,點一下書籤中的ThunderLixianExporter,而後點擊迅雷頁面右上角的配置按鈕(小齒輪)。

image

image

image

在上面的窗口中填寫aria2.json-RPC Path,這個值來自於yaaw那個頁面,具體方法是,輸入樹莓派IP顯示yaaw頁面,點擊右上的配置圖標,以下圖

image

在set頁面中存在該值:

image

保存好後,在離線頁面的每行記錄的取回本地後面會出現一個下拉菜單,選擇yaaw就會直接添加到yaaw任務中了。

image

image

 

到此,樹莓派的NAS服務器搭建完成,試了一下效果,仍是很滿意的。

 

6、製做外殼

一、外殼

        直接從家裏找了一個orico的包裝盒,大小正好合適,並且外殼比較硬,外觀也比較不錯。

二、加裝1602顯示屏

        加裝一個1602顯示屏,目的是顯示時間和CPU溫度,固然也能夠顯示其它內容,我這裏只顯示了這兩項。這裏還須要加裝一個電位器(也就是可變電阻,若是沒有,能夠加一個10K的電阻)

(1)1602硬件鏈接

1602共16個端口,只用其中12個,具體接法以下:

LCD1602液晶屏模塊提供了16個引腳,咱們只需接其中的12個便可:

VSS,接地
VDD,接5V電源
VO,液晶對比度調節,接電位器中間的引腳,電位器兩邊的引腳分別接5V和接地。
RS,寄存器選擇,接GPIO14
RW,讀寫選擇,接地,表示寫模式
EN,使能信號,接GPIO15
D0,數據位0,4位工做模式下不用,不接
D1,數據位1,4位工做模式下不用,不接
D2,數據位2,4位工做模式下不用,不接
D3,數據位3,4位工做模式下不用,不接
D4,數據位4,接GPIO17
D5,數據位5,接GPIO18
D6,數據位6,接GPIO27
D7,數據位7,接GPIO22
A,液晶屏背光+,接5V
K,液晶屏背光-,接地

注意:一、這裏的VSS、VDD等在有些1602的板子上會標明,有些則只標了數字,如一端寫着1,一端寫着16,1對應的就是VSS端,16對應的就是K端,所以依次鏈接就能夠了。

        二、GPIO各端口及5V、接地等端口見下圖,由於我用的是B+的板了,所以這裏的圖也是B+的端口圖。

        三、鏈接通電後,1602會亮起,其中一行爲黑色方格,一行什麼也不顯示,若是全不顯示,可調節一下電位器

(2)代碼

對於1602板子的操做,已經有人作了一個示例,這樣用起來就比較簡單了。示例代碼下載地址:https://github.com/lifanxi/rpimenu.git,解壓後有Adafruit_CharLCD.py文件,此文件在LCD上會顯示兩行字符:LCD 1602 Test, 123456789ABCDEF。這裏只須要在此文件上進行一下修改就能夠了。

#!/usr/bin/python
#轉載請註明:@小五義http://www.cnblogs.com/xiaowuyi   QQ羣:64770604
#
# based on code from lrvick and LiquidCrystal
# lrvic - https://github.com/lrvick/raspi-hd44780/blob/master/hd44780.py
# LiquidCrystal - https://github.com/arduino/Arduino/blob/master/libraries/LiquidCrystal/LiquidCrystal.cpp
#

#from time import sleep
import time,os

class Adafruit_CharLCD:

    # commands
    LCD_CLEARDISPLAY 		= 0x01
    LCD_RETURNHOME 		= 0x02
    LCD_ENTRYMODESET 		= 0x04
    LCD_DISPLAYCONTROL 		= 0x08
    LCD_CURSORSHIFT 		= 0x10
    LCD_FUNCTIONSET 		= 0x20
    LCD_SETCGRAMADDR 		= 0x40
    LCD_SETDDRAMADDR 		= 0x80

    # flags for display entry mode
    LCD_ENTRYRIGHT 		= 0x00
    LCD_ENTRYLEFT 		= 0x02
    LCD_ENTRYSHIFTINCREMENT 	= 0x01
    LCD_ENTRYSHIFTDECREMENT 	= 0x00

    # flags for display on/off control
    LCD_DISPLAYON 		= 0x04
    LCD_DISPLAYOFF 		= 0x00
    LCD_CURSORON 		= 0x02
    LCD_CURSOROFF 		= 0x00
    LCD_BLINKON 		= 0x01
    LCD_BLINKOFF 		= 0x00

    # flags for display/cursor shift
    LCD_DISPLAYMOVE 		= 0x08
    LCD_CURSORMOVE 		= 0x00

    # flags for display/cursor shift
    LCD_DISPLAYMOVE 		= 0x08
    LCD_CURSORMOVE 		= 0x00
    LCD_MOVERIGHT 		= 0x04
    LCD_MOVELEFT 		= 0x00

    # flags for function set
    LCD_8BITMODE 		= 0x10
    LCD_4BITMODE 		= 0x00
    LCD_2LINE 			= 0x08
    LCD_1LINE 			= 0x00
    LCD_5x10DOTS 		= 0x04
    LCD_5x8DOTS 		= 0x00



    def __init__(self, pin_rs=14, pin_e=15, pins_db=[17, 18, 27, 22], GPIO = None):
	# Emulate the old behavior of using RPi.GPIO if we haven't been given
	# an explicit GPIO interface to use
	if not GPIO:
	    import RPi.GPIO as GPIO
	    GPIO.setwarnings(False)
   	self.GPIO = GPIO
        self.pin_rs = pin_rs
        self.pin_e = pin_e
        self.pins_db = pins_db

        self.GPIO.setmode(GPIO.BCM)
        self.GPIO.setup(self.pin_e, GPIO.OUT)
        self.GPIO.setup(self.pin_rs, GPIO.OUT)

        for pin in self.pins_db:
            self.GPIO.setup(pin, GPIO.OUT)

	self.write4bits(0x33) # initialization
	self.write4bits(0x32) # initialization
	self.write4bits(0x28) # 2 line 5x7 matrix
	self.write4bits(0x0C) # turn cursor off 0x0E to enable cursor
	self.write4bits(0x06) # shift cursor right

	self.displaycontrol = self.LCD_DISPLAYON | self.LCD_CURSOROFF | self.LCD_BLINKOFF

	self.displayfunction = self.LCD_4BITMODE | self.LCD_1LINE | self.LCD_5x8DOTS
	self.displayfunction |= self.LCD_2LINE

	""" Initialize to default text direction (for romance languages) """
	self.displaymode =  self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT
	self.write4bits(self.LCD_ENTRYMODESET | self.displaymode) #  set the entry mode

        self.clear()


    def begin(self, cols, lines):

	if (lines > 1):
		self.numlines = lines
    		self.displayfunction |= self.LCD_2LINE
		self.currline = 0


    def home(self):

	self.write4bits(self.LCD_RETURNHOME) # set cursor position to zero
	self.delayMicroseconds(3000) # this command takes a long time!
	

    def clear(self):

	self.write4bits(self.LCD_CLEARDISPLAY) # command to clear display
	self.delayMicroseconds(3000)	# 3000 microsecond sleep, clearing the display takes a long time


    def setCursor(self, col, row):

	self.row_offsets = [ 0x00, 0x40, 0x14, 0x54 ]

	if ( row > self.numlines ): 
		row = self.numlines - 1 # we count rows starting w/0

	self.write4bits(self.LCD_SETDDRAMADDR | (col + self.row_offsets[row]))


    def noDisplay(self): 
	""" Turn the display off (quickly) """

	self.displaycontrol &= ~self.LCD_DISPLAYON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)


    def display(self):
	""" Turn the display on (quickly) """

	self.displaycontrol |= self.LCD_DISPLAYON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)


    def noCursor(self):
	""" Turns the underline cursor on/off """

	self.displaycontrol &= ~self.LCD_CURSORON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)


    def cursor(self):
	""" Cursor On """

	self.displaycontrol |= self.LCD_CURSORON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)


    def noBlink(self):
	""" Turn on and off the blinking cursor """

	self.displaycontrol &= ~self.LCD_BLINKON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)


    def noBlink(self):
	""" Turn on and off the blinking cursor """

	self.displaycontrol &= ~self.LCD_BLINKON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)


    def DisplayLeft(self):
	""" These commands scroll the display without changing the RAM """

	self.write4bits(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVELEFT)


    def scrollDisplayRight(self):
	""" These commands scroll the display without changing the RAM """

	self.write4bits(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVERIGHT);


    def leftToRight(self):
	""" This is for text that flows Left to Right """

	self.displaymode |= self.LCD_ENTRYLEFT
	self.write4bits(self.LCD_ENTRYMODESET | self.displaymode);


    def rightToLeft(self):
	""" This is for text that flows Right to Left """
	self.displaymode &= ~self.LCD_ENTRYLEFT
	self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)


    def autoscroll(self):
	""" This will 'right justify' text from the cursor """

	self.displaymode |= self.LCD_ENTRYSHIFTINCREMENT
	self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)


    def noAutoscroll(self): 
	""" This will 'left justify' text from the cursor """

	self.displaymode &= ~self.LCD_ENTRYSHIFTINCREMENT
	self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)


    def write4bits(self, bits, char_mode=False):
        """ Send command to LCD """

	self.delayMicroseconds(1000) # 1000 microsecond sleep

        bits=bin(bits)[2:].zfill(8)

        self.GPIO.output(self.pin_rs, char_mode)

        for pin in self.pins_db:
            self.GPIO.output(pin, False)

        for i in range(4):
            if bits[i] == "1":
                self.GPIO.output(self.pins_db[::-1][i], True)

	self.pulseEnable()

        for pin in self.pins_db:
            self.GPIO.output(pin, False)

        for i in range(4,8):
            if bits[i] == "1":
                self.GPIO.output(self.pins_db[::-1][i-4], True)

	self.pulseEnable()


    def delayMicroseconds(self, microseconds):
	seconds = microseconds / float(1000000)	# divide microseconds by 1 million for seconds
	time.sleep(seconds)


    def pulseEnable(self):
	self.GPIO.output(self.pin_e, False)
	self.delayMicroseconds(1)		# 1 microsecond pause - enable pulse must be > 450ns 
	self.GPIO.output(self.pin_e, True)
	self.delayMicroseconds(1)		# 1 microsecond pause - enable pulse must be > 450ns 
	self.GPIO.output(self.pin_e, False)
	self.delayMicroseconds(1)		# commands need > 37us to settle


    def message(self, text):
        """ Send string to LCD. Newline wraps to second line"""

        for char in text:
            if char == '\n':
                self.write4bits(0xC0) # next line
            else:
                self.write4bits(ord(char),True)



if __name__ == '__main__':
    while 1:
        lcd = Adafruit_CharLCD()

        lcd.clear()

        cputemp=os.popen('vcgencmd measure_temp').readline()
        sumcputemp=cputemp.replace("temp=","CPU:").replace("'C\n","")
        lcdout=time.strftime('%Y-%m-%d %H:%M',time.localtime(time.time()))+"\n"+sumcputemp
        
        lcd.message(lcdout)
        time.sleep(30)

三、開面自啓動上面的程序

        將以上文件命名爲1602.py,保存在/home/pi下面,修改/etc/rc.loca,添加上sudo python /home/pi/1602/py。樹莓派開機時,插上電源,當1602能正常顯示CPU溫度時,表示機器已經啓動完成,各項功能可正常使用。

四、一些其它的想法

(1)本想再加裝一個風扇用來散熱,結果手上沒有3.3V的風扇了,因此就沒加。感興趣的朋友能夠本身加一下,由於樹莓派輸出爲3.3V,因此最好是直接買3.3V的,若是買5V的,就必定要帶個3.3V的繼電器,要不無法對風扇控制。若是風扇一直常開那就無所謂了,5V就能夠,直接接正負級。我本來的想法是CPU上了50度,風扇再運轉,這樣能夠降溫,同時噪音也不會大。

(2)這個家庭服務器搭建起來之後,後面還有不少文章可作,好比能夠依託他創建家庭監控系統,裝上兩個攝像頭什麼的,也能夠作一些外網訪問的設置,這樣就能夠直接從外網進行操做了。

[參考文獻]

一、樹莓派變身Aria2下載服務器:http://blog.csdn.net/sonsie007/article/details/18942943
二、樹莓派搭建NAS服務器:http://blog.sina.com.cn/s/blog_9ea6edb90101ci06.html
三、DIY一套NAS+私有云盤+下載機:http://www.kissthink.com/archive/8897.html
四、樹莓派變身Aria2下載服務器:http://www.eeboard.com/bbs/thread-27396-1-1.html

五、打造加強型Raspberry Pi-液晶屏篇http://www.freemindworld.com/blog/2013/130310_raspberry_pi_with_lcd.shtml

相關文章
相關標籤/搜索