1. 程式人生 > >樹莓派B製作下載器

樹莓派B製作下載器

手頭有一隻樹莓派B+,用來跑圖形介面的Raspbian感覺太慢了,恰好手頭還有一塊膝上型電腦硬碟,打造了一款下載器。

主要功能:無人值守下載,可通過SSH或FTP新增下載任務,通過FTP獲取下載檔案。

硬體:樹莓派B+ 1只、SD卡1片(我用的512M)、筆記本硬碟1塊、USB行動硬碟電路板1片,USB線2條、USB無線網絡卡1只、5V 2.5A手機充電頭1只。

軟體:Raspbian磁碟檔案,因為樹莓派型號原因,選用的是 2016-09-23-raspbian-jessie-lite.img。太新的版本可能不能正常支援樹莓派B+,且不容易實現硬碟安裝作業系統。作業系統安裝到SD卡,長時間使用SD卡容易頻繁讀寫損壞。

燒錄Raspbian系統:

(1)將SD卡用讀卡器連線到執行Lubuntu作業系統的電腦,命令列執行 sudo dd if=/.../2016-09-23-raspbian-jessie-lite.img of=/dev/sdx 其中if輸入檔案路徑按照img檔案具體存放路徑設定,of輸出位置按照系統識別的SD卡名稱設定,具體可通過Lubuntu作業系統自帶的“磁碟”或者“GPARTED”檢視。等待寫入結束。

(2)退出SD卡,重新連線至電腦,掛載SD卡boot分割槽,修改boot分割槽下cmdline.txt檔案中 root=/dev/mmc0blk1 為 root=/dev/sda2。在boot分割槽用命令列執行 touch ssh,建立一個名為ssh的空白檔案,使樹莓派上電自動開啟ssh服務,以便通過網路遠端連線和控制。

(3)按照(1)的方法,將2016-09-23-raspbian-jessie-lite.img寫入筆記本硬碟。等待寫入完成。

(4)解除安裝硬碟,重新連線至電腦。

(5)用Lubuntu下GPARTED軟體將硬碟擴充套件至利用所有剩餘空間。

(6)擴充後,要用gparted檢查硬碟的第二個分割槽,使ext4檔案系統完整。

(7)在/etc/wpa_supplicant/wpa_supplicant.conf尾部新增wifi熱點資訊,實現樹莓派上電自動連線wifi網路:

network={

ssid="wifi名稱"

psk="wifi密碼"

}

硬體搭建:

(1) 1條USB線去掉小頭,將電源線按照正負極焊接到USB行動硬碟電路板,用於給硬碟和樹莓派供電。該USB線另一端連線手機充電頭。

(2)另1條USB線連線USB行動硬碟電路板和樹莓派USB口。

(3)將SD卡插入樹莓派SD卡插槽。

準備工作:

採用手機作為wifi熱點,開啟手機網路連線和WLAN熱點功能。

執行並用個人電腦連線樹莓派:

手機充電頭接入交流電源,樹莓派加電啟動。

檢視手機上連線至熱點裝置,樹莓派連線到手機WLAN熱點後,可以在手機上看到接入裝置數量的變化,並可以檢視樹莓派的IP地址。

個人電腦也連線至手機的WLAN熱點。

在個人電腦上執行終端,終端內執行 ssh [email protected],這裡的網路地址為樹莓派的IP地址。

樹莓派初始登入密碼為 raspberry

樹莓派系統升級及安裝功能軟體:

(1)修改軟體源,便於加快升級速度

修改/etc/apt/sources.list檔案,將 deb 開頭的行修改為國內源的地址,我用的中科大映象源

deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ jessie ...(最後一個/後的內容不變)

(2)執行 sudo apt-get update --fix-missing

(3)執行 sudo apt-get upgrade

(4)執行 sudo apt-get install ftpd 安裝並開啟樹莓派的ftp服務

(5)執行 sudo apt-get install python3

(6)執行 sudo apt-get install aria2 安裝aria2下載軟體

(7)執行 sudo apt-get install vi 安裝vi編輯器

樹莓派新增python指令碼

(1) /home/pi 下 建立 downloader.py,檔案中新增如下程式碼:

import os
import time
import addtask


log_file_name = '/home/pi/downloader.log'
url_file_name = '/home/pi/url.txt'
save_path     = '/home/pi/downloads'

retry_max_times = 10
sleep_time      = 10

def append_log(log_string, log_file=log_file_name, log_max_len=1024*1024):
    os.system('touch %s'%log_file)
    
    if os.path.getsize(log_file) > log_max_len:
        os.system('rm ' + log_file)
        os.system('touch %s'%log_file)

    try:
        f = open(log_file, 'a')
        
        if len(log_string) < 10:
            log = '%s %s\n'%(time.asctime(), log_string)
        else:
            log = '\n%s\n    %s\n'%(time.asctime(), log_string)

        f.write(log)
        f.close()
    except:
        pass
    
    return

def save_contents(contents, file_name):
    try:
        f = open(file_name, 'w')
        contents = contents.rstrip() + '\n'
        f.write(contents)
        f.close()
    except:
        pass

    return

def pick_first_task(task_file_name):
    try:
        f = open(task_file_name)
        task = f.readline()
        task = task.strip()
        f.close()
    except:
        task = ''

    return task        

def remove_first_task(task_file_name):
    try:
        f = open(task_file_name)
        first_task = f.readline()
        remain = f.read()
        f.close()
        save_contents(remain, task_file_name) 
    except:
        pass

    return


def make_command(task, save_path='/home/pi/downloads'):
    dest_file_name = task[task.rfind('//') + 1:]

    command = 'aria2c %s --dir=%s --index-out=1=%s'\
              %(task, save_path, dest_file_name)
    return command


def process_task(task, save_path='home/pi/downloads'):
    try:
        os.system('mkdir %s'%save_path)
    except:
        pass

    command = make_command(task, save_path)
    return os.system(command)


def work_loop(task_file_name, save_path='/home/pi/downloads'):
    while True:
        task = pick_first_task(task_file_name)

        if task != '':
            retry_count = 0

            while True:
                append_log('DOWNLOAD (try %s): %s'%(retry_count,task))

                if process_task(task, save_path) == 0:
                    # a successful download returns 0, otherwise non zero.
                    remove_first_task(task_file_name)
                    append_log('Finish.')
                    break
                else:
                    retry_count += 1

                    if retry_count > retry_max_times:
                        remove_first_task(task_file_name)
                        addtask.add_task(task, task_file_name)
                        append_log('Retry max times, move first to last.')
                        break

                    time.sleep(sleep_time)
        else:
            remove_first_task(task_file_name)
            # keep the upper line to skip empty lines in task file url.txt 
            append_log('Empty Task.')
            time.sleep(sleep_time)


if __name__ == '__main__':
    work_loop(url_file_name, '/home/pi/downloads')

(2) /home/pi 下建立 addtask.py,檔案中新增如下程式碼
 

import os
import sys


task_file_name = '/home/pi/url.txt'


def add_task(task, task_file=task_file_name):
    print('Add Task :', task, end='---> ')

    try:
        os.system('touch ' + task_file)

        f = open(task_file, 'a') 
        f.write(task + '\n')
        f.close()

        print('Success.\n')
    except:
        print('Failed.\n')

    return


def interactive_add_task(task_file=task_file_name):
    while True:
        url = input("URL to download('q' to quit): ")

        if url.upper() == 'Q':
            break
 
        if len(url) < 5:
            print('URL may be incorrect, ignored:', url, '\n')
        else:
            add_task(url, task_file)

    return


if __name__ == '__main__':
    if len(sys.argv) == 1:
        interactive_add_task()
    else:
        for n in range(1, len(sys.argv)):
            add_task(sys.argv[n])

(3) /etc/rc.local 檔案在 exit 0 所在行前新增 python3 /home/pi/downloader.py > /dev/null &
(4) /home/pi 下建立 url.txt空白檔案

(5)執行 sudo reboot -h 0 重啟樹莓派

新增下載任務

ssh遠端連線樹莓派,

方法1:執行 python3 addtask.py http://資源網路地址 逐個新增下載任務

方法2:執行 python3 addtask.py 互動式新增下載任務

方法3:在個人電腦上編輯一份url.txt的檔案,每行1個要下載資源的網路連結,儲存後用ftp傳輸至樹莓派/home/pi下。

檢視任務進度:

樹莓派/home/pi下的downloader.log儲存了下載日誌。

檢視未完成下載任務:

樹莓派 /home/pi 下的 url.txt 儲存的是尚未完成下載的任務

完成下載資源的獲取:

下載的資源保存於樹莓派/home/pi/downloads路徑下,可以通過ftp訪問並複製到個人電腦。

當前方式下載資原始檔的所有者為root,使用時如果需要修改所有者,用 chown 命令操作。

相關推薦

樹莓B製作下載

手頭有一隻樹莓派B+,用來跑圖形介面的Raspbian感覺太慢了,恰好手頭還有一塊膝上型電腦硬碟,打造了一款下載器。 主要功能:無人值守下載,可通過SSH或FTP新增下載任務,通過FTP獲取下載檔案。 硬體:樹莓派B+ 1只、SD卡1片(我用的512M)、筆記本硬碟1塊、

樹莓做BT下載:transmission

1.掛載樹莓派 因為樹莓派的SD一般最大也就128G,不適合做BT的儲存器,一般選擇外接一個行動硬碟。 注意:行動硬碟的供電一般需要5V2A,而樹莓派自己的供電也只有5V2.5A,直接把行動硬碟接在樹莓派上會導致硬碟供電不足,無法啟動,因此我們需要一個可接電源的USB HUB,淘寶一個3

樹莓之BT下載實現

本文介紹用樹莓派搭建BT下載器的一種方法,可以讓樹莓派實現自動下載。 配置環境 首先安裝transmission: sudo apt-get install transmission-daemon 然後建立下載目錄,一個是下載完成的目錄

樹莓搭建WEB服務

.org 官網 登陸 doc all update 插件 root date 樹莓派搭建WEB的教程網上有許多,但感覺每一篇都有一些問題,這次我將網上的教程匯總,並親身實踐,將註意的問題都寫進去,方便新手學習! 目錄:1,安裝nginx+sqlite+php5打造輕量級服

樹莓搭建bt下載機、即是安裝transmission

lse 文件中 vim bin hive max rename archive req Transmission是一種BitTorrent客戶端, 安裝:sudo apt-get install transmission-daemon 給用戶授權:sudo usermod

樹莓映象製作

還沒做好的指令碼: #!/bin/bash #create image echo "Creating Image ..." BOOT_DEV='/dev/sdb1' ROOT_DEV='/dev/sdb2' TIME=`date "+%Y%m%d%H%M%S"` FILE=backup_201812

樹莓:文字編輯與檔案

ALL.nanorc go.nanorc markdown.nanorc ruby.nanorc awk.nanorc html.nanorc mpdconf.nanorc sed.nanorc c.nanorc

樹莓Win10映象下載安裝教程及使用初體驗

一、WIN7下刷映象的方法: 官網推薦在Win10下刷(http://ms-iot.github.io/content/win10/SetupRPI.htm),我只能說呵呵了,為了個不穩定的系統裝個Win10,下面來講一下Win7下的安裝方法。 因為Wi

樹莓實現一個下載

這回又買了一塊樹莓派,這次用的是B+。樹莓派做BT下載器的特性就是省電啊。 原來想買一個路由器刷openwrt,後來覺得路由器可能效能有限,而且稍有不慎會刷壞uboot,所以暫且不考慮了。 搭建過程網上都有,但是很零碎,這裡整理一下步驟,下面分為幾個步驟吧: 準備工

樹莓raspbian資源下載

今天找資源下了一天,找不到跟GPIO硬體比較合適的作業系統,之後今天下午重武裝好了系統,太麻煩了。。。 1.4G左右 格式化U盤:FormatTool 解壓安裝img:Win32DiskImager-

樹莓+PyQt製作魔鏡

前段時間在GitHub瞎看,看到一個超炫酷的專案MagicMirror(專案地址),下面附上兩張國外大神做的鏡子。 然後就感覺超級帥氣,樹莓派啥的買來以後在上面跑了一遍MagicMirror的原始碼,然後看到可以擴充套件好多好玩的東西,後來發現這個專案

OpenNI在樹莓B+和樹莓2的移植

準備工作 更新和安裝支援庫 sudo apt-get update sudo apt-get install git g++ python libusb-1.0-0-dev freeglut3-dev openjdk-6-jdk doxygen graphviz

(14)樹莓B+使用L298N驅動控制四驅車並實現一個簡單的web控制端

在系列文章第12篇中提到了L298N,它是H橋雙路直流電機驅動,可以使雙路直流電機實現正轉或者反轉,並且通過ENDA和ENDB輸入PWM訊號,還可以實現加減速。本文用2塊L298N驅動板成功驅動了4個直流電機,實現了4輪同時向前、向後以及前向左轉、前向右轉甚至是後向左轉和後

Linux(樹莓b+)學習~putty遠端登入

硬體條件:樹莓派b+主機板,8G sd卡,網線,滑鼠+鍵盤,LCD微雪7寸顯示器,膝上型電腦,電源線 軟體工具:Putty 想要用Putty遠端登入樹莓派不是那麼複雜,由於沒有無線網絡卡本文使用LCD顯示器手動配置靜態ip後通過網線直連膝上型電腦網絡卡,不能達到遠端登入x-

(13)樹莓B+ 讀取DHT11溫度溼度模組的數值

溫度溼度模組看起來簡單,只有三個引腳(實際4個介面),但仔細一想,3個引腳分別作為VCC、GND、DATA用處的話,因為傳給樹莓派GPIO的只有高電平、低電平,那麼怎麼來讀取整型的溫度數字和溼度數字呢?這麼一想,並不簡單!反而是因為引腳少,它需要高低變化的時序訊號來表達數值

樹莓部署BT下載

made by Rk 本文由浙江大學《嵌入式系統》課程提供強力支援。 /*************************************************************/ 要求:做一個BT下載機,能下載BT和emule的資源,要有遠端控制

樹莓3B製作無線wifi(AP with hostapd)

參考:https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/這是一款新型的樹莓派,並且自帶wifi模組,不用大家自己另購,很是方便。網上寫樹莓派做wifi的文件不少但

樹莓下載服務 aria2 篇

後臺運行 path 修改 nano 並且 安裝 *** 接下來 下載 一開始要運行一下配置,擴大樹莓派的根目錄的空間,不然所有軟件裝完之後空間會只剩幾百兆。 sudo raspi-config 擴展根目錄空間, 開啟 SSH ,修改 pi 密碼。 另外要提

簡單物聯網:外網訪問內網路由器下樹莓Flask服務

分配 amp con 樹莓派 轉發規則 添加 局域網 輸入 pytho 最近做一個小東西,大概過程就是想在教室,宿舍控制實驗室的一些設備。 已經在樹莓上搭了一個輕量的flask服務器(在樹莓派下搭flask在其他隨筆有說明),在實驗室的路由器下,任何設備都是可以訪問的;但是

利用樹莓3b搭建git代碼服務

git bash 根據 remote windows print pos ssh 服務 system 在樹莓派上3b的操作,可以利用ssh進行登陸操作: 添加一個”Git”用戶和組 增加git用戶和組   adduser --system --shell /bin/ba