0%

树莓派折腾记录


放假前在公司看到有同事在玩树莓派,觉得挺有意思,之前也曾经了解过,但是一直都没有下定决定买一个玩玩,这次也算是被同事拉下水吧,趁着这次放假的机会,在淘宝上买了个最新的树莓派3B+ 来学习一下,从小白开始树莓派的折腾之旅。想到自己有linux的基础应该上手不会太难,没想到还是踩了不少的坑,在购买的时候淘宝店家说会有技术支持,结果放假了完全不回消息😔,不过遇到的问题还是自己慢慢踩坑爬出来了,在这里做个简单的记录。


折腾树莓派的准备工作

贴散热贴

拿到树莓派的主板后,先贴好散热贴,总共3个散热贴,有2个带脚的散热贴和1个不带脚并有树莓标志的散热贴,主要是3个地方,CPU,GPU和内存,其中CPU和GPU在主板的正面,贴两个带脚的散热片,正中有两个近似于正方形的方块,大的是CPU,小的是GPU,而内存在主板的背面,贴不带脚并有树莓标志的散热贴。

连接风扇

树莓派的风扇主要有2根连接线,红色和黑色,红色接4针脚,黑色接6针脚,对应树莓派上的两列针脚区域,第二列的第二和第三个针脚。如果树莓派通电,接入后风扇就可以马上转起来。

安装系统

将SD卡插入读卡器,用系统烧录工具,Mac为balenaEtcher,下载好官网的debian系统的zip文件,然后烧录到SD卡中。然后把SD卡插入树莓派的SD卡槽,将树莓派接上电源,这时红色灯光常量,代表电源接通正常。树莓派读取SD卡,自动启动系统,系统启动好后绿色灯光闪烁,代表系统已经启动完毕。

接入局域网

由于mac无法插入网线直接访问树莓派,可以把树莓派的网线插入到路由器上,我们可以直接在路由器的设备管理界面看到树莓派的IP地址,接下来就可以用命令行工具ssh或者图形化界面vnc远程访问到我们的树莓派。

注意事项

作为小白,在前期的准备工作也遇到了坑😔,由于系统下错了,下成了虚拟机的树莓派镜像文件(这是个ISO文件)无语的是balenaEtcher烧录系统到SD卡的时候也没有任何报错,导致SD卡插入到SD卡槽后无法正常启动系统(然而我当时并不知道),所以接入到局域网中发现路由器的设备管理界面根本没有看到树莓派这个设备。后面看到树莓派指示灯相关的内容后,才明白原来系统都没跑起来。这里推荐使用Raspbian Stretch Lite版的系统,比较稳定,没有多余的功能,纯命令行的系统(之前安装过带图形界面的,发现不太好用,用到的也少,因为大部分功能都是命令行下实现的)。如果你发现插入SD卡只有红色灯亮,不是没有读到SD卡,就是系统启动失败,同样关机时执行关机命令后,等到绿色灯熄灭才是系统正常关闭,再拔掉电源。下面对常用的树莓派指示灯含义做一个总结:

  1. 绿色灯闪烁,读取到了SD卡并且也正常启动了系统
  2. 红色灯常亮,电源接入正常
  3. 橙色灯亮全双工状态,不亮半双工状态

    ssh连接

    我认为最简单的方法如下:
  4. 树莓派默认没有开启ssh,把sd卡用读卡器插到电脑上,创建一个名为ssh的文件
  5. 直接用网线连在家里的路由器上,通过路由器后台查看ip地址连接
    ssh pi@xxx.xxx.xxx.xxx
    默认密码为raspberry

    设置中文显示

    打开系统设置sudo raspi-config
  • Localisation Options -> Change Locale
  • 按空格选择
  • 去掉en_GB.UTF-8 UTF-8
  • 勾上en_US.UTF-8 UTF-8、zh_CN.UTF-8 UTF-8、zh_CN.GBK GBK
  • 下一屏幕默认语言选zh_CN.UTF-8

    shadowsocks配置

  1. 安装python的依赖库
    sudo apt-get install python-pip python-gevent python-m2crypto
  2. 利用python安装shadowsocks,注意别忘记sudo,否则可能造成安装路径有问题而无法使用sslocal的命令
    i
  3. 修改/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py,将此文件中的52行和111行中的cleanup替换为reset,否则可能执行启动命令报错
  4. 创建shadowsocks的配置文件ss_conf.json,需根据shadowsocks服务器的信息替换,内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    "server":"server_ip",
    "server_port":server_port,
    "local_address":"127.0.0.1",
    "local_port":1080,
    "password":"password",
    "timeout":600,
    "method":"aes-256-cfb"
    }
  5. 最后执行启动命令
    sudo sslocal -c ./ss_conf.json -d start

    privoxy配置

    在树莓派下命令行梯子是十分有必要的,给http,https设置代理使用privoxy。
  6. 安装privoxy
    sudo apt install privoxy
  7. 修改配置文件
    sudo vi /etc/privoxy/config
    783行,去掉注释
    listen-address 127.0.0.1:8118
    1336行,去掉注释,注意与ss地址端口号保持一致
    forward-socks5t / 127.0.0.1:1080
  8. 配置开机启动
    sudo vi /etc/profile
    export https_proxy=http://127.0.0.1:8118
    export http_proxy=http://127.0.0.1:8118
  9. 重启
    sudo systemctl restart privoxy

    开机启动设置

    这个步骤估计是我爬坑时间最长的地方,写入命令到rc.local配置文件中即可实现开机启动的功能,然而到树莓派上始终无法实现,树莓派已经不支持这种自启方式了。
  • 创建一个文件写入自启命令
    sudo vi /etc/rc.local
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    # Print the IP address
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
    printf "My IP address is %s\n" "$_IP"
    fi
    sudo sslocal -c /etc/ss.json -d start
    exit 0
  • 创建一个服务文件
    sudo vi /lib/systemd/system/rc.local.service
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #  This file is part of systemd.
    #
    # systemd is free software; you can redistribute it and/or modify it
    # under the terms of the GNU Lesser General Public License as published by
    # the Free Software Foundation; either version 2.1 of the License, or
    # (at your option) any later version.

    # This unit gets pulled automatically into multi-user.target by
    # systemd-rc-local-generator if /etc/rc.local is executable.
    [Unit]
    Description=/etc/rc.local Compatibility
    ConditionFileIsExecutable=/etc/rc.local
    After=network.target

    [Service]
    Type=forking
    ExecStart=/etc/rc.local start
    TimeoutSec=0
    RemainAfterExit=yes
    GuessMainPID=no

    修改apt源

    树莓派默认的apt源在英国,速度非常慢,即使我配置了香港的http代理,还是很慢,换成了阿里的源速度还不错。
    修改apt源的配置文件
    sudo vi /etc/apt/sources.list
    注释掉原来的源,添加
    1
    2
    deb http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib rpi
    deb-src http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib rpi
    更新索引清单
    1
    sudo apt-get update
    更新依赖库
    1
    sudo apt-get upgrade -y

    U盘挂载和卸载

    挂载u盘

    sudo mount -o umask=0000 /dev/sda1 ~/Downloads
  • o 配置挂载可选项,umask=0000对所有用户都可读可写可执行
    /dev/sda1 usb分区路径
    fdisk -l可查看分区
    ~/Downloads 要挂载的文件夹路径

    卸载u盘

    sudo umount -l ~/Downloads
  • l 强制卸载,避免busy的错误提示

    dlna服务器搭建

  1. 安装dlna
    apt-get install minidlna
  2. 修改配置文件
    sudo vi /etc/minidlna.conf
    media_dir=/home/pi/Downloads
    修改media_dir的变量指向资源路径,这里我是挂载U盘上的资源,遇到了一个坑,需要刷新资源索引,耗了很长时间,网上很多说dlna刷新命令是sudo service minidlna force-reload我发现并没有作用,以为是配置文件的问题改了很多次,还是不起作用,后来发现资源刷新的正确姿势是这样:
    sudo minidlna -R
    然后重启服务:
    sudo service minidlna restart
    设置开机启动
    sudo update-rc.d minidlna defaults
    访问http://树莓派ip地址:8200查看当前服务器上的资源类型和数量

    samba服务器搭建

  3. 安装smaba
    sudo apt-get install samba samba-common-bin
    第二个命令也遇到过一个坑,就是smaba的部分依赖库已经安装,且版本高于smaba依赖的版本,这个时候命令行是不会安装smaba的,网上说需要把这些已经安装的依赖库卸载掉重新安装,但是我试了这种方式仍旧无效,最后我根据当前的树莓派系统版本找到了国内的镜像源(阿里),切换apt源以后再安装就可以了。
  • samba服务器默认支持隐藏文件的展示,用本地编辑器直接编辑脚本,调试运行是十分方便的,推荐刚入门不太习惯vi,nano的朋友都搭建一个,不过samba服务器的搭建有很多坑,第一次安装没啥问题,卸载重装就有问题了,折腾好久,记一次踩坑过程:
    1
    2
    3
    4
    5
    dpkg: error processing package xxx
    dpkg: dependency problems prevent configuration of xxx
    xxx depends on xxx; however:
    Package xxx is not configured yet.
    Sub-process /usr/bin/dpkg returned an error code (1)
    貌似这个错误不止在重装samba会遇到,有时apt软件升级也会遇到
  • 解决步骤
    执行以下命令:
    1
    2
    3
    4
    5
    6
    7
    8
    sudo mv /var/lib/dpkg/info/ /var/lib/dpkg/info_old/
    sudo mkdir /var/lib/dpkg/info/
    sudo apt-get update
    sudo apt-get -f install
    sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old/
    sudo rm -rf /var/lib/dpkg/info
    sudo mv /var/lib/dpkg/info_old/ /var/lib/dpkg/info/
    sudo apt-get update
    再执行刚才的安装或升级命令即可
  1. 修改配置文件
    sudo vi /etc/samba/smb.conf
    1
    2
    3
    4
    5
    6
    7
    8
    [pi]           #共享文件的名称, 将在网络上以此名称显示
    path = /home/pi #共享文件的路径
    valid users = pi #允许访问的用户
    browseable = yes #允许浏览
    writable = yes #可写
    writelist = pi #可写用户
    create mask = 0777 #可读可写权限
    directory mask = 0777 #可读可写权限
  • 创建共享文件夹
    mkdir ~/Downloads
    如果树莓派的内存卡不够用,我们一般需要挂载外置的U盘或硬盘
  • 创建挂载文件夹(挂载点)
    mkdir ~/Downloads/diskMount
  • 挂载硬盘或U盘
    sudo mount -o umask=0000 /dev/sda5 ~/Downloads/diskMount/
  • 如果是exfat格式的硬盘加上格式参数(兼容windows和mac)
    sudo mount -t exfat -o umask=0000 /dev/sda5 ~/Downloads/diskMount/
    挂载完后发现没有权限访问,需要对该文件夹下的所有文件赋予权限
    sudo chmod -R 777 ~/Downloads
    权限修改后需重启samba服务,文件即可访问
    sudo service smbd restart
    smaba4.9.5在服务启动后会在共享文件路径下生成color IA64 W32ALPHA W32MIPS W32PPC W32X86 WIN40 x64一堆文件夹,是默认配置了printer打印机引起的,这些文件夹放对应的驱动文件,如果我们注释了打印机相关的配置就不会在共享文件路径下生成这一堆文件夹
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #[printers]
    # comment = All Printers
    # browseable = no
    # path = /var/spool/samba
    # printable = yes
    # guest ok = no
    # read only = yes
    # create mask = 0700

    # Windows clients look for this share name as a source of downloadable
    # printer drivers
    #[print$]
    # comment = Printer Drivers
    # path = /var/lib/samba/printers
    # browseable = yes
    # read only = yes
    # guest ok = no
  1. 将默认用户添加到samba
    sudo smbpasswd -a pi
  2. 重启smaba
    sudo service samba restart
  3. 配置开机启动
    systemctl enable smdb

ftp服务器搭建

ftp方便文件传输,而且vsftpd搭建服务器只有400k

  1. 安装sftp
    sudo apt-get install vsftpd
  2. 修改配置文件
    sudo vim /etc/vsftpd.conf
    配置可选项如下:
    禁止匿名用户登录:anonymous_enable=NO
    配置用户可以写权限:write_enable=YES
    配置uMask:local_umask=022(077不支持断点续传,修改为022)
  3. 重启
    sudo service vsftpd restart

    折腾摄像头

    我在购买树莓派主板的时候,也购买了官方的摄像头,它是usb接口,插入树莓派的usb接口后,输入命令:ls /dev如果此时能识别到video0的设备时,代表树莓派已识别。
    此时我们使用lsusb命令同样可以查看这个设备的idVendor和idProduct

    拍摄照片

    拍摄一张照片
    sudo fswebcam image.jpg
    预览
    gpicview image.jpg

    搭建视频流服务器

    安装依赖库和编译库

    sudo apt install libjpeg8-dev
    sudo apt install imagemagic
    sudo apt install libv4l-dev
    sudo apt install cmake

    安装mjpg-streamer

    克隆项目到本地并编译
    sudo git clone https://github.com/jacksonliam/mjpg-streamer.git
    cd mjpg-streamer/mjpg-streamer-experimental
    make all
    sudo make install
    启动流服务器
    ./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"
    此时报错,树莓派官方的摄像头不支持v4l的驱动,需安装UV4L兼容驱动,解决方法是
    添加软件源
    curl https://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -
    修改apt-get的源列表文件/etc/apt/sources.list,在文件末尾添加
    deb https://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
    再安装兼容驱动
    sudo rpi-update
    sudo apt-get update
    sudo apt-get install uv4l uv4l-raspicam
    sudo service uv4l_raspicam restart
    sudo pkill uv4l
    sudo apt-get update
    sudo apt install uv4l-uvc
    sudo apt install uv4l-xscreen
    sudo apt install uv4l-mjpegstream
    启动流服务器
    ./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"
    发现仍然报错
    1
    2
    Unable to set format: 1196444237 res: 640x480
    Init v4L2 failed !! exit fatal
    mjpg-stream支持JPEG和YUV两种格式,默认采用JPEG,这里是因为树莓派官方的摄像头不支持JPEG
    解决方案1:
    cd mjpg-streamer-experimental/plugins/input_uvc/
    sudo vi input_uvc.c
    format = V4L2_PIX_FMT_MJPEG改为format = V4L2_PIX_FMT_YUYV
    解决方案2:
    用命令参数-y使用YUV编码
    ./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so -w ./www"
    此时看到启动信息已经启动,但是有一堆error
    用命令参数-n来消除error
    ./mjpg_streamer -i "./input_uvc.so -y -n" -o "./output_http.so -w ./www"

访问树莓派的ip:8080就可以看到采集的视频了