树莓派官网
器件准备:树莓派zero2w,数据连接线,读卡器,sd卡16g左右。
full 包含图形化界面
烧录系统:
下载树莓派镜像烧录器到本地电脑,选择raspberry zero2w
插入读卡器
操作系统选择raspberry pi os(64-bit)full
有wifi相关驱动,下载位置选择到读卡器
。
next开始设置
磁盘文件需要新建一个ssh文件夹
这里只能设置一个wifi
插入sd卡,插入数据线
新建ssh文件夹
插入sd卡,上电后,要检查是否启动成功,可以查看自己路由器连接设备,可以查询到树莓派zero2w的ip地址。
ping saber.local
ssh root@saber.local
ping 树莓派ip
ssh username@ip
报错
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:YAk1PicuI086yA1K8ZASyM0APcsYrXtnKaC4nKeaaG0.
Please contact your system administrator.
Add correct host key in C:\\Users\\YunJin/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in C:\\Users\\YunJin/.ssh/known_hosts:3
Host key for 192.168.8.13 has changed and you have requested strict checking.
Host key verification failed.
ssh-keygen -R ip
ssh username@ip
连接成功图片
此报错是由于远程的主机的公钥发生了变化导致的。
ssh服务是通过公钥和私钥来进行连接的,它会把每个曾经访问过计算机或服务器的公钥(public key),记录在~/.ssh/known_hosts 中,当下次访问曾经访问过的计算机或服务器时,ssh就会核对公钥,如果和上次记录的不同,OpenSSH会发出警告。
一、 Nginx、MaraiDB、PHP的安装以及配置
打开命令行,依次输入以下命令:
sudo apt install nginx
sudo apt install php7.3
sudo apt install php7.3-fpm
sudo apt install php7.3-mysql
sudo apt install php7.3-common
sudo apt install mariadb-serv
PHP 7.3 在 Ubuntu 16.04 默认 repo 中可能不可用,您需要添加第三方 repo。我经常使用 ondrej repo quiet 并且效果很好。
运行以下命令:
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.3
2.修改源文件
在源文件中新增加以下内容:
sudo nano /etc/apt/sources.list
2.修改源文件
在源文件中新增加以下内容:
sudo nano /etc/apt/sources.list
#tsinghua
deb https://mirrors.tuna.tsinghua.edu.cn/debian buster main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ buster/updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian buster-updates main contrib non-free
sudo nano /etc/apt/sources.list.d/raspi.list
#tsinghua
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
2.2 需改虚拟内存大小
由于zero2w的内存很小,在ssh远程链接的时候同时安装更新软件包,会造成内存过载断开连接的情况。所以适当增大的了虚拟内存的大小。
sudo dphys-swapfile swapoff
sudo nano /etc/dphys-swapfile
#修改100改成自己设置的大小
CONF_SWAPSIZE=100
sudo dphys-swapfile setup
sudo dphys-swapfile swapon
sudo reboot
sudo apt-get update
sudo apt-get upgrade
树莓派ZERO 2W 使用摄像头模块
准备:
- raspi zero 2w
- typec/mico数据传输线一根
- 树莓派摄像头
连接摄像头
-
检查摄像头配置
$ vcgencmd get_camera
supported = 0 说明没有开启摄像头
2.修改树莓派配置,开启摄像头模块
$ sudo raspi-config
选择
Interfacing Options
, 选择 Camera
选择 Yes
,同意开启
再次检查
$ vcgencmd get_camera
supported = 1 detected = 0
detected = 0
表明没有接入摄像头设备,看下设备是否插反了
supported = 1 detected = 1 # detected=1 表示识别到1个摄像头
-
测试拍照功能
$ raspistill -o test.jpg
motion
- 1、安装
motion
$ sudo apt-get install motion
-
配置
motion.conf
$ sudo vi /etc/motion/motion.conf
############## 参数说明 ##################
target_dir /var/lib/motion # 图片/视频文件存储的位置
webcontrol_localhost on # 将on改成off,允许非本机访问http控制台
stream_localhost on # 将on改成off,允许通过网页查看摄像头
deamon off # 改成on,允许后台启动
width # 设置分辨率 宽
height # 设置分辨率 高
locate_motion_mode on # 设置探测到图像中有运动时,把运动区域用矩形框起来
ffmpeg_video_codec mkv # 设定视频的编码器
snapshot_interval 1 # 设定自动采集图片的周期,当有运动被检测到时,采集频率会自动变高
-
运行 motion
$ sudo motion
现在我们的摄像头已经变成了一台网络摄像头。在浏览器下访问 http://ip:8081
即可看到摄像头当前拍摄的画面.第一种网络摄像头搭建方式不便于Android手机端的访问,所以这里并未使用,这里仅做拓展讲解。
树莓派使用mjpg-streamer方式
第一步:安装所需模块
sudo apt-get update
sudo apt-get install subversion
sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick
sudo apt-get install libv4l-dev
sudo apt-get install cmake
sudo apt-get install git
注意,在试验这里的时候(2025.3.1),libjpeg8-dev会显示报错:
导致后面make 的时候会出现报错信息:
解决办法是参考文章树莓派安装libjpeg-dev出错
大概的命令有
//注意这里肯定会有变化,按照你自己的提示进行改正
sudo apt-get install libjpeg62-turbo=1:1.5.2-2+deb10u1
sudo apt-get install libjpeg62-turbo-dev
sudo apt-get install libjpeg-dev
第二步:git一个开源的project:MJPG-streamer
sudo git https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
sudo make all
sudo make install
git过程比较缓慢,大家可以耐心等待一段时间,等待100%后确认完成后再执行下一条命令,启动USB摄像头,指令如下:
指令启动普通USB摄像头指令:
./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"
启动树莓派专用摄像头RaspiCamera的指令:
./mjpg_streamer -i "./input_raspicam.so" -o "./output_http.so -w ./www"
并且使用树莓派专用摄像头需要开启专用摄像头配置的,输入指令如下:
sudo raspi-config
点击摄像头使能开启即可。
以上就实现了全部的网络摄像头搭建。不过每次我们启动树莓派的时候还是需要手动去执行对应的命令,比较麻烦。那么接下来我们把当前项设置为一个系统自启动项。
第三步:设置自启动
cd到系统home目录下,新建一个sh可执行文件,输入如下命令即可:
sudo nano videoStart.sh
videoStart.sh文件中输入内容如下:
cd /home/pi/mjpg-streamer/mjpg-streamer-experimental/
./mjpg_streamer -i "./input_uvc.so" -d /dev/video0 -f 30 -r 1280x720 " -o
"./output_http.so -p 8080 -w ./www"
然后退出保存,最后记得再给个可执行权限,输入命令:
sudo chmod +x /home/pi/videoStart.sh
接着再创建一个目录,输入命令如下:
sudo mkdir .config/autostart
继续新建一个文件,输入对应命令如下:
sudo nano .config/autostart/my.desktop
文件内容如下:
[Desktop Entry]
Type=shell
Exec=/home/pi/videoStart.sh
最后保存退出,这样每次开机就自动执行对应文件命令,省去了每次手动执行的麻烦。
第四步:测试
查看图像,在PC端打开浏览器,输入下面网址可以看到静态截图:
http://<树莓派IP>:8080/?action=snapshot
输入下面两条网址可以看到动态图像:
http://<树莓派IP>:8080/?action=stream
使用安卓查看摄像头传输的图像
AndroidManifest.java
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许应用程序多播状态 -->
<uses-permission android:name = "android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<!-- 允许应用程序改变网络状态 -->
<uses-permission android:name = "android.permission.CHANGE_NETWORK_STATE" />
<!-- 允许应用程序改变WIFI连接状态 -->
<uses-permission android:name = "android.permission.CHANGE_WIFI_STATE" />
<!-- 允许应用程序访问WIFI网卡的网络信息 -->
<uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Testudp"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
.java
package com.yunjin.testudp;
import android.os.Bundle;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.VideoView;
import androidx.annotation.Nullable;
public class MainActivity extends AppCompatActivity {
private Button playBtn, stopBtn;
MediaController mMediaController;
private WebView webview1;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
VideoView mVideoView = new VideoView(this);
//mVideoView = (VideoView) findViewById(R.id.video);
mMediaController = new MediaController(this);
webview1 = (WebView) findViewById(R.id.webview1);
playBtn = (Button) findViewById(R.id.login1);
//stopBtn = (Button) findViewById(R.id.stopbutton);
// playBtn.setOnClickListener(new mClick());
//stopBtn.setOnClickListener(new mClick());
setview();
}
private void setview() {
String url="http://192.168.8.13:8080/?action=stream";//视频链接
webview1.loadUrl(url);//打开指定URL的html文件
}
}
.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webview1"
android:layout_width="match_parent"
android:layout_height="300dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/login1"
android:layout_width="100dp"
android:layout_height="50dp"
android:text="返回"
android:textColor="@color/colorAccent"
android:textSize="20dp"
>
</Button>
</LinearLayout>
</LinearLayout>
最终效果图片