关于树莓派,想必从事嵌入式开发的开发者都有听过,树莓派原名为Raspberry Pi,也就是它的英文读法,树莓派诞生于英国,由“Raspberry Pi 基金会”这个慈善组织注册开发。埃•厄普顿就是该项目的头目。在2012年的3月,英国剑桥大学埃本•阿普顿(Eben Epton)正式发售世界上最小的台式机,又称卡片式电脑,外形只有信用卡大小,却具备电脑的全部基本功能,这就是Raspberry Pi电脑板,中文译名”树莓派”!python
树莓派做为一个轻便迷你的小终端很受大众的喜好!!!shell
与常见的51单片机和STM32等这类的嵌入式微控制器相比,不只能够完成相同的IO引脚控制以外,还能运行有相应的操做系统,能够完成更复杂的任务管理与调度,可以支持更上层应用的开发,为了开发者提供了更广阔的应用空间。好比开发语言的选择不只仅只限于C语言,链接底层硬件与上层应用,能够实现物联网的云控制和云管理,也能够忽略树莓派的IO控制,使用树莓派搭建小型的网络服务器,作一些小型的测试开发和服务。缓存
与通常的PC计算机平台相比,树莓派能够提供的IO引脚,可以直接控制其余底层硬件的功能,这是通常PC计算机作不到的,固然,树莓派体积小,成本低,照常能够完成一些PC任务与应用。服务器
树莓派自带的摄像头拍摄夜空是有先例的,起码能够作到延时摄影。对于实时拍摄没有研究,可是仍然有必要测试。
树莓派自带的摄像头是500万像素,价格在26-29欧元(人民币200+左右)网络
树莓派上的摄像机,是使用一个 raspivid
命令操做的。 抛开这个命令的其余参数,其输出数据有2种方式:并发
选择哪一种方式,首先要考虑咱们可否具备足够的采集数据的能力。测试
raspivid
命令能够调节相机模块的输出比特率。输出是以 H264
编码输出的,比特率通常默认是17Mbps,可是这个数字能够调小。 若是按照17Mbps算,就是一秒钟2.12兆字节。 咱们记录数据或者获取数据的速度不能低于这个值,不然长时间录像可能形成树莓派的缓存充满,致使树莓派崩溃。ui
树莓派的网卡是使用了其USB总线,传送速度是100Mb/s或者12.5MB/s。 实际上后文的实验代表,目前能达到的传送速度只有 3MB/s(TCP)
或者 6MB/s(UDP)
。this
若是使用SD卡存储,这个记录速度也是能够达到的,可是,SD卡有写入寿命,这是要考虑的。 例如,对于32GB的卡,即便咱们能利用所有存储空间,以2MB/s的速度录像,也只能记录4.55小时。编码
raspivid
命令的 -o
选项,就是用来指定输出文件的。 在Linux系统中,输出到文件并不等于写入到磁盘(这里是SD卡)。 咱们仍然可能使用 RAMDisk
这种技术,让输出只是暂时存储在内存中,并稍后读取,而后删除之。 可是,树莓派的可用内存可能只有 280MB
,这最多只能记录差很少2分钟的视频。
若是咱们有文件形式的摄像记录,那么就彷佛可使用文件传输的协议,例如 sftp, scp
等等登陆到树莓派下载文件了。 然而这是不对的。这些协议在传输中使用了加密。
树莓派在向咱们的电脑进行数据传送的时候,若是用这些协议,就必须先对发送的数据进行加密。 在互联网上,加密是很好的设计。可是在树莓派和电脑之间只用一根网线链接的时候,就不是了。 树莓派的运算能力是颇有限的,使用加密只会让传送速度变慢,因此,不要使用加密!
咱们使用最原始而简单的方法:使用 netcat命令
,在笔记本电脑这一端监听数据输入。 在树莓派这一端,咱们让 raspivid
获取必定周期(好比10分钟,也许能够更长)的录像, 将结果设定为直接输出,而后利用Linux的管道机制,直接送进 netcat
发送。
树莓派和笔记本电脑之间的链接,使用普通网线便可, 由于笔记本和树莓派上的网卡都能自动适应网线,设定正确的模式(正常来讲要使用交叉网线)。
重要的一步是,笔记本电脑和树莓派链接后构成的网络中,须要手动为两个设备设定IP地址。 对于笔记本电脑的设定,就比较简单了。 咱们将笔记本电脑和树莓派相连的网卡上,将电脑的 IP地址设定为xxx.xxx.x.xxx
, 子网掩码为255.255.255.0
, 网关不要填 ``。
配置树莓派的方法是,先将树莓派断电,而后取出所用的SD卡,用读卡器插回电脑。 在SD卡的boot分区中,有个cmdline.txt,这是树莓派开机时所用到的一些参数。
打开这个文件,会发现里面只有一行。这一行中用空格分开了不少设定参数。 咱们在这一行的结尾,不添加空行,直接加上空格,而后写上: ip=xxx.xxx.x.xxx
固然若是这一行里面已经有了ip=的参数,应该直接修改它。
这样的结果就是,树莓派开机以后,会本身选择这个IP地址做为本身的地址。
netcat命令,在每收到一个文件的EOF(End Of File,代表文件已经到结尾),就会退出。 咱们为了让接收可以连续进行,须要用脚本连续运行这个命令。 这样就会为每一个新接收到的视频,在笔记本电脑这一端创建一个文件用来存储。
# -*- coding: utf-8 -*- import os import signal import subprocess import sys import uuid # 获取程序运行的本地目录,和用来存储接收结果的recv文件夹目录 BASEPATH = os.path.realpath(os.path.dirname(sys.argv[0])) RECV = os.path.join(BASEPATH, 'recv') # 若是接收目录不存在,就自动新建 print " *** Received files are put into: %s" % RECV if not os.path.isdir(RECV): os.system('mkdir -p %s' % RECV) # 下面的部分用来记录正在等待接收的文件。这个文件会以一个UUID.tmp的格式命名。 # 在接收成功后,就会被重命名为UUID。(UUID是一个特定格式的惟一字符串,不会重复)。 # 若是在接收过程当中按下Ctrl+C,就会发送一个终止命令给程序,这样程序会退出, # 并删除没有接收完整的那个文件。 working = False fullname = False def sigint_handler(signum, frame): global fullname, working print "\n" print " *** SIGINT detected. End the program." if working and fullname != False: print " *** Unfinished recording deleted." os.system('rm -f %s.tmp' % fullname) exit() signal.signal(signal.SIGINT, sigint_handler) # 使用一个死循环来不断运行netcat(nc)命令。 n = 1 while True: recname = str(uuid.uuid1()) print " [%8d] Listening for file [%s]. Use Ctrl+C to stop this script." % (n, recname) fullname = os.path.join(RECV, recname) working = True # 标记接收开始 # 使用 nc -lp 10401 命令接收数据,代表端口为10401。 subprocess.call('nc -lp 10401 > %s.tmp' % fullname, shell=True) os.system('mv %s.tmp %s' % (fullname, fullname)) working = False # 标记接收完毕 n += 1
上文所述的脚本,在笔记本上运行以后,就会在本地开启10401端口,等待树莓派上传送的文件。 传送的会直接写入一个由UUID(全局惟一ID)标识的文件中,能够供之后处理。
在树莓派上命令拍摄的方法是:
$ raspivid -o - -b 16000000 -t 100000 | nc xxx.xxx.x.xxx 10401
这条指令的意义以下:
-o -
,使用-o设定输出,-表示直接输出到标准输出中,不写入文件。-b 16000000
,设定输出比特率为16000000 bit/s。这大约是2兆字节每秒。-t 100000
,设定录像时间为100000毫秒,亦即100秒。| nc xxx.xxx.x.xxx 10401
,使用管道|将结果导入到nc中,nc是发送模式,目标是xxx.xxx.x.xxx计算机上的10401端口。