背景介绍:
尝试用树莓派板实现远程视频监控,so在淘宝上入手一个树莓派摄像头,它是通过CSI接口连接到树莓派板上,之前我的树莓派使用的是CentOS系统,在网上找了很久,没有发现能在CentOS系统下的摄像头驱动(如果各位看客有相关资料或信息,欢迎联系本人),没办法重新刷了树莓派官方Debian系统,它自带树莓派摄像头的管理工具—raspistill。
为了实现树莓派+摄像头组合完成远程监控的目标,我们需要完成的任务包括:
1>. 视频流实时传输(本教程使用web端实现视频传输)
2>. 内网穿透(如果你有公网IP则可忽略此步骤)
如果你的树莓派只运行视频监控的端口服务,那么完成以上两个步骤就OK了。
如果你的树莓派还运行其它端口服务,如nginx,tomcat,pythonweb等等,你需要再多进行一项任务3:
3>. 树莓派端口代理转发,配置nginx.conf(本教程使用nginx为例)
一、视频流实时传输
淘宝卖家提供了一个相对简单的解决方案:下载一个master.zip的包在我们的树莓派上编译并运行它,就可以通过web浏览器方便的使用摄像头,运行效果如下图,可以看出使用了名为“MJPG-Streamer”的web开源项目:
这套解决方案包含了web前端的与后台服务端,我们能使用浏览器实时查看摄像头的视频/图像信息,但遗憾的是后台服务端没办法修改,所以不能进行如修改端口号的操作(这个系统设定端口号为8080)。
二、内网穿透
要想实现远程监控,你的树莓派必须有一个公网IP。什么是公网IP这里就不进行科普了,请自行百度。一般来说,我们现在的家庭网络是没有公网IP的,所以需要进行内网穿透的一个操作。实现内网穿透有很多方法,这里给推荐两种方法,一种简易流,一种技术流。
方法1: (简易流看这里↓↓↓)
推荐使用花生壳服务(不是打广告啊,只是个人使用推荐o(╥﹏╥)o)
① 首先你需要在树莓派上安装花生壳服务。
很赞的是,花生壳提供了树莓派版的花生壳程序,大家可参考官方教程安装。给出链接:
安装完成后你会看到类似如下输出:
请使用这个SN作为账号名登录“http://b.oray.com”,默认密码是“admin”
②登录以后:
a. 会赠送你一个免费的壳域名
b. 然后再花6块钱买一个内网穿透的试用服务(只能用一年),内网映射配置如下。
这种方法唯一的一个优点就是超级省心,特别适合小白以及不想折腾的People,缺点也很明显,试用版的内网穿透服务带宽只有1M,我自己在用的时候没办法流畅的查看视频监控。
应用名称和域名自己填,映射类型选择HTTP80,外网端口不能选,默认80(花钱可以改外网端口),内网主机填"127.0.0.1",内网端口填“8080”(请忽略图片上的80,为什么是8080请回看第一节描述),然后点击开启映射服务。到这里内网穿透就完成了。确保以上操作都已顺利完成,你可以开始使用树莓派的远程监控服务了。
这里的图像是倒的是因为我摄像头就是倒过来的,各位看客不用担心自己需要倒立去看o(╯□╰)o
方法2: (技术流看这里↓↓↓)
看我之前的博客 内网穿透 - SSH反向代理 ,有不懂的可以给我留言。
另引用外链 frp内网穿透教程
三、树莓派端口代理转发
首先声明,这里的介绍我就不像前面那样写的详细了,重点在于Nginx的配置。
如果你之前采用 frp内网穿透教程 配置内网穿透,而不是使用花生壳,那么你不会面临我下面描述的问题,但你仍然需要对Nginx进行配置,这是很有必要的。
这里解释一下为什么会需要对Nginx进行配置:在我的树莓派上还运行了很多端口服务,如Tomcat,Pyserver,MJPG-Streamer,甚至Nginx本身也占用端口,但是如果我们像前面步骤使用了花生壳免费穿透服务,外网访问端口固定为80端口,内网映射端口也设置为80,但此时内网中有端口号为8080的MPG-Streamer服务不能被外网访问,因为它没有被映射到外网,与此同时其他端口服务也是不能被访问的。这里我们可以利用Nginx对所有的端口服务进行一个代理转发。
重点是利用Nginx的proxy_pass变量参数:
proxy_pass http://localhost:8080/; # Nginx代理转发请求到 MJPG-Streamer 服务端的8080端口
在树莓派上安装Nginx,修改nginx.conf如下部分:
#设定虚拟主机配置
server {
#侦听80端口
listen 80;
# 主机域名
server_name xkxzw.iask.in localhost;
#定义服务器的默认网站根目录位置
root /var/www/html/;
#定义首页索引文件的名称
index index.php index.html index.htm;
#设定本虚拟主机的访问日志
# access_log logs/nginx.access.log main;
#默认请求
location / {
# 代理转发请求到Nginx,我这里设置和内网
proxy_pass http://localhost:80/;
#定义首页索引文件的名称
index index.php index.html index.htm;
}
location ^~ /camera/ {
# 代理转发请求到 MJPG-Streamer 服务端,这里是重点
proxy_pass http://localhost:8080/;
root /home/pi/mjpg-streamer-master/mjpg-streamer-experimental/www/;
index index.html index.htm;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file /etc/nginx/htpasswd;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
在配置nginx过程中踩了很多坑,大部分都可以参考如下:
Nginx常见错误及处理方法
Nginx配置auth_basic, auth_basic_user_file https://www.jianshu.com/p/1c0691c9ad3c nginx的location配置详解