树莓派折腾全纪录

本文最后更新于:2022年7月8日下午5点08分

最近入手了一个树莓派4B,来折腾一番吧!

0 Linux基础

树莓派自带的操作系统是Linux内核的,要想玩转树莓派,就需要先熟悉一些基本的Linux操作。在这里不展开这一部分,详见这篇文章

1 基础配置

远程启动

远程启动视频教程

首先在boot目录下,新建ssh空文件,无后缀名

1
touch ssh

同样在boot目录下,新建wpa_supplicant.conf文件

1
2
3
4
5
6
7
8
9
vim wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=CN

network={
ssid="WIFI_NAME"
psk="WIFI_PASSWORD"
}

这样,不出意外我们就可以通过SSH工具远程访问树莓派了(局域网)。另外,最近发现一款免费好用的SSH工具,WindTerm,命令行与传输文件集于一身,颜值也不错。

要想远程桌面访问,首先需要开启VNC。在SSH工具中输入命令

1
sudo raspi-config

用方向键选择3 Interface Options,按下Enter,再选择P3 VNC,按下Enter。对于Windows系统,自带的远程桌面工具就挺好用,左下角输入remote,输入树莓派用户名和密码即可进入树莓派图形化桌面。

更改下载源

1
2
3
4
5
6
# 编辑 `/etc/apt/sources.list` 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi

# 编辑 `/etc/apt/sources.list.d/raspi.list` 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
1
2
3
sudo apt update # 更新下载源
sudo apt upgrade # 更新软件
sudo rpi-eeprom-update -d -a # 更新固件(不建议使用)

静态IP地址

1
2
ip r | grep default # 查看路由器
sudo cat /etc/resolv.conf # 查看DNS
1
sudo vim /etc/dhcpcd.conf
1
2
3
4
interface wlan0 # 有线eth0
static ip_address=192.168.1.200/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 114.114.114.114

3 个人博客搭建

这里是利用树莓派作为网页服务器搭建个人博客,重点是配置树莓派,使之成为服务器。

主要参考这篇文章

a.本地安装

本地安装及SSH公钥生成参考这篇文章

b.树莓派配置

安装Git

1
sudo apt install git

查看版本,确保安装正确

1
git --version

安装Nginx

1
sudo apt install nginx

查看版本,确保安装正确

1
nginx -v

建立远程git仓库

通过git将本地代码推送到树莓派远程仓库

1
2
3
4
5
sudo mkdir /var/repo/	#创建一个文件夹
sudo chown -R $USER:$USER /var/repo/ #给分到用户组
sudo chmod -R 755 /var/repo/ #改变文件夹权限
cd /var/repo/
git init --bare babblingme.git

映射仓库

将仓库映射到博客目录下

1
2
3
4
sudo mkdir -p /var/www/hexo
sudo chown -R $USER:$USER /var/www/hexo
sudo chmod -R 755 /var/www/hexo
sudo vim /var/repo/babblingme.git/hooks/post-receive

写入以下内容

1
2
3
4
#!/bin/bash
git --work-tree=/var/www/hexo --git-dir=/var/repo/babblingme.git checkout -f

sudo chmod +x /var/repo/babblingme.git/hooks/post-receive

Nginx配置

1
2
3
4
5
6
7
8
9
sudo vim /etc/nginx/sites-available/default

server {
listen 80 default_server;
listen [::]:80 default_server;
...
root /var/www/hexo; # 修改这里,设置为博客根目录

sudo service nginx restart # 重启Nginx服务

此时访问树莓派IP地址,出现403 Forbidden字样说明配置成功

添加本地公钥到远程git仓库

C:/programfile/.ssh目录下,右键Git Bash

1
ssh-copy-id -p 22 pi@100.100.100.100 # 此处是树莓派的用户名和IP地址

确认安装即可

推送至树莓派

修改_config.yml文件中的推送地址

1
2
3
4
5
6
url: http://100.100.100.100 # 此处是树莓派的IP地址

deploy:
type: git
repo: pi@100.100.100.100:/var/repo/babblingme.git # 此处是树莓派的IP地址
branch: master

在本地博客根目录右键Git Bash,hexo d -g,这样再访问树莓派IP地址,就能看见自己的博客了。

c.内网穿透

https://www.ngrok.cc/

想要在非局域网(公网)访问自己的树莓派,就需要一个公网IP地址,这可以通过打电话向运营商直接索取,但目前还在学生阶段的我就不尝试了,直接内网穿透来体验一下。我选用的是Sunny-Ngrok实现内网穿透。以下操作都是通过SSH工具在树莓派中进行的。

下载客户端

我这里选用Linux ARM版本,下载后找个文件夹解压

1
unzip linux_arm.zip

启动隧道

注册登录,然后需要实名认证,还要通过支付宝人脸识别,然后才能开通隧道,看官方教程即可。注意,本地IP一般不用修改,默认127.0.0.1即可,端口最好改一下比较安全,改成8000或者7000这种。赠送的域名较长,后期可以购买域名绑定。

进入刚才解压的文件

1
2
cd linux_arm
./sunny cliented 隧道ID1, ID2

这样就会进入下面这个界面,就代表连接成功

1
2
3
4
5
6
7
8
Sunny-Ngrok www.ngrok.cc                                                                 (Ctrl+C to quit)

Tunnel Status online
Version 2.1.1/2.1.1
Forwarding http://xxx.xxx.xxxxx.com -> 127.0.0.1:80
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms

在浏览器输入上方给出的网址,无论局域网或非局域网都可以访问,不过有时网络拥堵,可能打开较慢。Ngrok的原理其实就是将公网域名http://xxx.xxx.xxxxx.com映射到本地127.0.0.1:80端口上。

如果想后台启动Ngrok,输入下方命令即可

1
setsid ./sunny clientid 隧道id &

Nginx配置

如果你在开通隧道时修改了端口号,打开上述网址,一般会提示隧道 **** 不可用错误,这时需要配置一下Nginx。

1
2
3
4
5
6
7
sudo vim /etc/nginx/sites-available/default

server {
listen 80 default_server; # 将80改为你设置的端口号
listen [::]:80 default_server; # 这里是IPv6端口,一般不用改动

sudo service nginx restart # 重启Nginx服务

以上,就可以在任何地方访问你的博客了,其实跟Hexo+Gitee搭建个人博客的感觉差不多,只不过Gitee是有人给你搭建好了服务器给你使用,而你将树莓派搭建成一台网页服务器使用。

d 远程公网SSH登录

既然已经实现了内网穿透,我们也可以用它来实现SSH登录。访问网页使用的是http隧道,而ssh连接则使用tcp隧道。

  • 添加TCP隧道,跟上面添加http隧道相似,树莓派默认端口是22(安全起见,最好更改)

  • 启动隧道

  • 访问隧道,端口为刚才设置的远程端口

    1
    ssh -p 10000 admin@xxx.xxxxxx.com

3 学习环境搭建

安装OpenCV

这里采用源码安装,因为源码安装比较自由且可以选择版本。我第一次直接安装最新版遇到了莫名其妙的问题,因此还是先安装之前的版本。安装参考这个视频文章。严格按照步骤来,代码可直接复制,手敲容易出错。安装过程中要耐心等待,不要随便敲击键盘。如有出错,后面附有部分debug内容,解决不了就Google it。

  1. 更新树莓派

    1
    sudo apt update && sudo apt upgrade
  2. 增大交换空间

    1
    sudo nano /etc/dphys-swapfile
    1
    2
    #CONF_SWAPSIZE=100
    CONF_SWAPSIZE=2048
  3. 安装工具及函数库

    1
    2
    3
    4
    5
    6
    sudo apt-get install build-essential cmake pkg-config
    sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
    sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
    sudo apt-get install libxvidcore-dev libx264-dev
    sudo apt-get install libgtk2.0-dev libgtk-3-dev
    sudo apt-get install libatlas-base-dev gfortran
  4. 安装Python3和pip3

    1
    2
    sudo apt-get install python3-dev
    sudo apt-get install python3-pip
  5. 下载OpenCV源代码

    1
    2
    3
    4
    wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.0.zip
    wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.1.0.zip
    unzip opencv.zip
    unzip opencv_contrib.zip
  6. 安装numpy

    1
    sudo pip3 install numpy
  7. 编译OpenCV

    注意,文件夹位置如有改动,第7行要改成自己定义的位置。\代表暂不执行命令,只带遇到..

    1
    2
    3
    4
    5
    6
    7
    8
    cd ~/opencv-4.1.0/
    mkdir build
    cd build
    cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.1.0/modules \
    -D BUILD_EXAMPLES=ON ..
  8. Build OpenCV

    要确保这一步不出现错误,若出现错误,先解决在执行后面的步骤为宜。

    1
    make -j4
  9. 安装OpenCV

    1
    sudo make install && sudo ldconfig

    若没有错误,即可重启

    1
    sudo reboot
  10. 检查

    依次输入以下命令,如给出版本号,则安装成功。

    1
    2
    3
    python3
    import cv2
    cv2.__version__

debug

第一次安装时出现过错误,通过Google解决了,忘了记录下来。总之,出现错误直接复制相应错误然后Google it就可以了。

摄像头选取

参考这篇文章

CSI摄像头

摄像头的安装与拆卸一定要在树莓派断电的情况下进行,否则容易烧坏摄像头!

USB摄像头

网络摄像头

  • 手机安装软件IP摄像头

  • 确保手机和树莓派处于同一局域网,打开IP摄像头

  • 在浏览器访问给出的IP地址即可看到摄像头画面。

  • 给出一个Python调用摄像头的例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/usr/bin/env python

    '''
    Waveshare OpenCV Tutorial
    01_IP_Camera.py
    A demo to show whether The OpenCV and IP camera is well installed
    '''

    import numpy as np
    import cv2

    def main():
    print("OpenCV Version:{}".format(cv2.__version__))
    # 0: use CSI camera,1:use USB camera
    ip_camera_url = 'http://admin:admin@192.168.1.1:8081'
    cap = cv2.VideoCapture(ip_camera_url)
    if(not cap.isOpened()):
    print("can't open this camera")

    while(True):
    ret, FrameImage = cap.read()
    if ret == True:
    cv2.imshow('Camera Capture',FrameImage)
    #Press Q to quit
    if (cv2.waitKey(1)) == ord('q'):
    cap.release()
    break
    else:
    break

    if __name__ == '__main__':
    print(__doc__)
    main()
    # Release resource
    cv2.destroyAllWindows()

远程监控

通过motion将树莓派作为摄像头使用,远程监控。参考这篇文章这篇文章。我自己实验了一下,不知是不是因为网络不好,非常卡,延迟能到秒量级,如果在加上内网穿透,会更卡,而且我暂时没有学会Nginx的配置,不知道怎么协调配置我的博客和将要使用的视频流。先弃之,以后再说。

后续(待更新)


本文作者: Shixin
本文链接: https://physxz.github.io/posts/10012/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!