讲师博文
OpenWRT下的mjpg streamer配置 来源 : 未知     2018-08-15

1.1.1 软件介绍

mjpg-streamer 可以通过文件或者是HTTP方式访问linux UVC兼容摄像头。

1.1.2 安装

在openwrt系统下,需要安装以下摄像头的驱动。

opkg kmod-usb2

opkg install kmod-usb-ohci #一般BCM用的是ohci USB控制器

opkg install kmod-usb-video

opkg install kmod-video-gspca-core

opkg install kmod-video-core

opkg install kmod-video-uvc #免驱uvc摄像头

opkg install kmod-video-gspca-zc3xx #中微星摄像头 如zc301 zc303 zc305

opkg install kmod-i2c-core

opkg install kmod-input-core

如果能找到 /dev/video0 的设备文件,就说明驱动已经安装成功。

如果没有成功,罗技的摄像头还可以尝试一下安装kmod-video-pwc。

在openwrt系统下面,安装mjpg-streamer很简单。

opkg install mjpg-streamer

安装完了之后,运行

/etc/init.d/mjpg-streamer start

就可以启动了。

1.1.3 使用

在firefox浏览器里面输入 http://192.168.1.1:8080/?action=stream ,应该能看到摄像头抓取的视频。

这个视频的帧数很低,显得摄像头反应很慢。可以修改/etc/config/mjpg-streamer里面的fps参数。

如果想在公司访问家里的摄像头,还应该修改防火墙,接受8080端口的外网请求。

添加下面配置到 /etc/config/firewall

config rule

option src wan

option proto tcp

option dest_port 8080

option target ACCEPT

然后重启防火墙 /etc/init.d/firewall restart,就可以了。

外网访问摄像头的时候,如果看视频可能速度会跟不上,可以只看截屏。http://192.168.1.1:8080/?action=snapshot

需要将192.168.1.1替换成路由器说使用的公网IP地址

1.1.4 设置开机自启动

openwrt是基于linux内核的路由操作系统,

总结一下OpenWrt的启动流程:1.CFE->2.linux->3./etc/preinit->4./sbin/init ->5./etc/inittab ->6./etc/init.d/rcS->7./etc/rc.d/S* ->8.经过裁剪,因此与普通linux系统文件结构有所不同。为了添加摄像头装了mjpg_streamer,但是每次都要手动启动摄像头,实在是太麻烦了于是给它设置为开机自启动。

首先在/etc/init.d里添加需要启动的shell脚本

vim startCamera

#!/bin/sh /etc/rc.common

# /init.d/startCamera

START=50

start()

{

mjpg_streamer -b -i "input_uvc.so -r 320x240 -f 15 " -o "output_http.so -p 8080 -w /web"

}

stop()

{

killall startCamera

}

之后还需要在rc.d目录下做一个链接,启动时系统会按顺序启动rc.d目录下的脚本链接,对应执行init.d目录下的启动脚本。

命令:ln -s /etc/init.d/startCamera /etc/rc.d/S50startCamera

重启,即可

现在实现了开机自启动

如果想关闭的话 直接杀进程就可以了

还有一种是通过传参来设置

mjpg_streamer -b -i "input_uvc.so -r 320x240 -f 15 -y" -o "output_http.so -p 8080 -w /web"网址

http://192.168.1.90:8080/?action=stream

服务启动

/etc/init.d/mjpg-streamer enable 是设置开机自动启动

/etc/init.d/mjpg-streamer disable 是禁止开机自动启动

/etc/init.d/mjpg-streamer start 是现在启动

/etc/init.d/mjpg-streamer restart 重启

/etc/init.d/mjpg-streamer stop 停止

service mjpg-streamer start

设置开机自动启动服务

/etc/init.d/mjpg-streamer enable

立即启动服务

/etc/init.d/mjpg-streamer start [1]

很像ser2net,即便拔掉摄像头再插上也会识别。

1.1.5 配置用户名和密码

mjpg-streamer 还可以使用用户名和密码来访问。

修改 /etc/init.d/mjpg-streamer 中的[ $enabled -gt 0 -a -c $device ] && sleep 3 && $SSD -S -m -p $PIDF -q -x $PROG -- --input "input_uvc.so --device $device --fps $fps --resolution $resolution" --output "output_http.so --port $port" &为[ $enabled -gt 0 -a -c $device ] && sleep 3 && $SSD -S -m -p $PIDF -q -x $PROG -- --input "input_uvc.so --device $device --fps $fps --resolution $resolution" --output "output_http.so --port $port -c user:pass" &

后添加的部分就是用户名和密码,中间用冒号分割。重新启动mjpg-streamer,保证配置生效。

/etc/init.d/mjpg-streamer restart

1.2 OpenWRT下的ser2net配置使用

1.2.1 软件介绍

ser2net是以款串口转发软件,这是一个可以通过个人PC或手机向路由的指定端口发送数据,然后路由原封不动的将数据发送到路由的TTL接口的程序。当安装完这个程序后,我们就可以通过编制的程序向路由的TTL口发送串行数据,意义在于:单片机就可以接受路由发送的串行数据进行各种控制。

联网以后利用opkg指令来安装,或用luci安装,安装完以后会出现一个文件

vi /etc/ser2net.conf

找到

2001:raw:600:/dev/ttyATH0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS

#2002:raw:600:/dev/ttyS1:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS

注意,这里"#"代表的是屏蔽,我们修改的是非屏蔽语句,可以看到,上位机发送的端口是2001,这就是我们需要发送的端口号,波特率是9600,其它的略。

1.2.2 设置开机启动

ser2net开机自启动:

命令vi /etc/rc.local 打开它,i进入编辑,在exit0的上一行添加一条ser2net,esc退出编辑,wq保存

命令vi /etc/init.d/ser2net,,i进入编辑

#!/bin/sh /etc/rc.common

# /init.d/my-ser2net

START=99

start() {

ser2net –c /etc/ser2net.conf

}

Esc退出编辑,wq 保存。

命令reboot重启路由器,ok

直接输入ser2net可以启动此软件。输入 ./ser2net 验证自启动修改是否正确

1.2.3 串口ser2net过滤特殊字符

许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉。不用说也知道,这几个肯定是特殊字符,被用作特殊控制了。关掉ICRNL和IXON选项即可解决。

c_iflag &= ~(ICRNL | IXON);

0x0d 回车符CR

0x11 ^Q VSTART字符

0x13 ^S VSTOP字符

ICRNL 将输入的CR转换为NL

IXON 使起动/停止输出控制流起作用

在《UNIX环境高级编程第二版》第18章第11小节看到把终端I/O设置为原始模式(串口通讯就是终端I/O的原始模式)时输入属性设置为

term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

原来这三个数据是串口通信里面特殊字符,具有特别的意义,会被ser2net过滤掉,那么怎么保证数据完整无误地传输呢?

方法一:修改ser2net源代码,这个方法太麻烦。

方法二: 用winscp登陆WIFI板,转到/etc/目录,打开ser2net.conf文件,找到如下配置:

2001:raw:600:/dev/ttyATH0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS

将其中蓝色字体部分删除,变为:

2001:raw:600:/dev/ttyATH0:9600 NONE 1STOPBIT 8DATABITS LOCAL -RTSCTS

保存,再重启WIFI板,ser2net就不再会过滤掉特殊字符了。

那如何在OpenWRT源码编译镜像的时候就将此软件包配置好呢,简单的方法就是修改编译所需软件包中的配置文件,文件路径:/dl/ser2net-2.9.1.tar.gz

tar -zxvf ser2net-2.9.1.tar.gz

进入我们解压的目录

cd ser2net-2.9.1/

ls

可以找到ser2net.config,对其进行编辑

vi ser2net.config

将XONXOFF删除,将ttyS0改为ttyATH0,另外此处还可以修改端口号及串口波特率。wq保存退出,然后退回到dl目录,删除之前的软件包,重新压缩。

cd ..

rm ser2net-2.9.1.tar.gz

tar –zcvf ser2net-2.9.1.tar.gz ser2net-2.9.1/

1.2.4 ser2net的双向通信

因shell与ser2net占用同一个串口,当我们向串口发送数据时就会出现问题,需要将shell注释掉。根据我们选择额硬件平台,我们需要修改./target/linux/ar71xx/base-files/etc/inittab

vi ./target/linux/ar71xx/base-files/etc/inittab

将后一行#号注释掉

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:飞行控制器Pixhawk简介

下一篇:什么是 ZigBee协议栈?

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号