树莓派B制作下载器

编程入门 行业动态 更新时间:2024-10-19 00:30:23

树莓派B制作<a href=https://www.elefans.com/category/jswz/34/1746161.html style=下载器"/>

树莓派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 / 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 addtasklog_file_name = '/home/pi/downloader.log'
url_file_name = '/home/pi/url.txt'
save_path     = '/home/pi/downloads'retry_max_times = 10
sleep_time      = 10def 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:passreturndef save_contents(contents, file_name):try:f = open(file_name, 'w')contents = contents.rstrip() + '\n'f.write(contents)f.close()except:passreturndef 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:passreturndef 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 commanddef process_task(task, save_path='home/pi/downloads'):try:os.system('mkdir %s'%save_path)except:passcommand = 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 = 0while 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.')breakelse:retry_count += 1if 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.')breaktime.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 systask_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')returndef interactive_add_task(task_file=task_file_name):while True:url = input("URL to download('q' to quit): ")if url.upper() == 'Q':breakif len(url) < 5:print('URL may be incorrect, ignored:', url, '\n')else:add_task(url, task_file)returnif __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制作下载器

本文发布于:2024-02-13 11:52:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1758667.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:下载器   树莓派

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!