树莓派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 pi@192.168.xxx.xxx,这里的网络地址为树莓派的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 命令操作。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值