实现远程监控【BOA/JPEG/MJPEG-STREAMER】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chile19/article/details/73883444

实现流程:
1、USB摄像头驱动移植:通过配置linux内核源码进行选择(USB主机驱动、摄像头驱动以及视频数据接口V4L2)

2、移植jpeg库

3、搭建boa服务器

4、移植视频流媒体服务器---> mjpeg-streamer



一、USB摄像头驱动移植

使用gec210开发板自带的内核,或者按以下步骤重新配置驱动

步骤:

1、usb驱动添加

Make menuconfig

 Device support

Scsi device support

* scsi disk support

* scsi generic support

* scsi media changer support

  x     -> Device support

     x       -> USB support                                                                                                                       

       x        -> USB Mass Storage support 

2、添加驱动(video)

Make menuconfig

Device Drivers ---> 

              <*> Multimedia support  --->

                            <*>   Video For Linux

[*]     Enable VideoFor Linux API 1 (DEPRECATED) (NEW)

[*]   Video captureadapters (NEW)  --->

[*]   V4L USB devices(NEW)  --->

<*>   USB VideoClass (UVC)

[*]     UVC inputevents device support (NEW)

 <*>   USB ZC0301[P] webcam support (DEPRECATED)

插入U盘检测时才需要--->Mount -t vfat /dev/sda1/mnt

二、移植jpeg库

步骤:

1、jpeg源码包通过下面这个网址下载:http://www.ijg.org/files/jpegsrc.v9b.tar.gz

2、·在PC端中解压源码包       tar  xvf  jpegsrc.v9b.tar.gz

3、配置源码  cd  jpeg-9b
./configure --prefix=/home/chile/jpeg--host=arm-none-linux-gnueabi

根据自己的创建的目录修改“/home/chile/jpeg

4、编译    make

5、安装    make install

6、拷贝libjpeg.so.9动态库文件到开发板的/lib中

三、搭建boa服务器

介绍:

典型的嵌入式Web服务器有Boa (www.boa.org)和thttpd (http://www.acme.com/software/thttpd/)等,它们和Apache等高性能的Web服务器主要的区别在于它们一般是单进程服务器,只有在完成一个用户请求后才能响应另一个用户的请求,而无法并发响应,但这在嵌入式设备的应用场合里已经足够了。
Boa是一个非常小巧的Web服务器,可执行代码只有约60KB。它是一个单任务Web服务器,只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全,在其站点公布的性能测试中,Boa的性能要好于Apache服务器。

步骤:

1、编译BOA源码

从www.boa.org下载Boa源码,当前最新版本为0.94.13,将其解压并进入源码目录的src子目录
     $ sudo tar -vxf boa-0.94.13.tar.tar
      $ cd boa-0.94.13/src
生成Makefile文件
     $sudo ./configure
     修改Makefile文件,找到CC=gcc,将其改成CC = arm-linux-gcc,再找到CPP = gcc –E,将其改成CPP = arm-linux-gcc –E,并保存退出。
     然后运行make进行编译,得到的可执行程序为boa,将调试信息剥去,得到的最后程序只有约60KB大小。
 $ make
make过程中,出现一个error
arm-linux-gcc  -g -O2 -pipe -Wall -I.   -c -o util.o util.c
util.c: In function 'get_commonlog_time':
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token
make: *** [util.o] Error 1
解决方法:
修改 src/compat.h
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
然后
$ make clean
$ make
make成功后,生成boa可执行文件。
$file boa
ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux2.6.27, not stripped
删除可执行文件BOA的调试信息。
$ arm-linux-strip boa

2、修改boa.conf文件(这一步很重要,仔细修改)

配置Boa,使其能够支持CGI程序的执行。Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。

在Boa源码目录下已有一个示例boa.conf,可以在其基础上进行修改, /etc/boa/boa.conf

需要修改的地方:

1、  Group nogroup                              改为 Group 0(这一步不改也行)

2、  #ServerNamewww……..   改为  Servername192.168.1.111  (即你的开发板IP)

3、DocumentRoot /var/www              改为 DocumentRoot /www

4、ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/  改为 ScriptAlias /cgi-bin/ /www/cgi-bin/

3、构建BOA环境

1、拷贝boa可执行文件到根文件系统的/bin目录下;在/etc目录下建boa目录,并将boa.conf到/etc/boa目录下。

              2、创建日志文件所在目录/var/log/boa。

              3、将mime.types拷贝到根文件系统/etc目录下。mime.types文件可以从宿主机linux系统中的/etc目录中拷贝到根文件文件系统的/etc目录下。

              4、在根文件系统下创建目录/www,该目录为默认的嵌入式平台web服务器文件所在目录,在/www中放置一个index.html文件。

              5、运行boa:

              #/bin/boa

              6、访问web服务器。http://192.168.1.3,在/var/log/boa/error_log文件中出现如下错误:

              boa.c:226- icky Linux kernel bug!: No such file or directory

解决方法:

              打开BOA源码下的/src/boa.c文件,将该文件的第226行代码注释掉,如下:

                  if (setuid(0) != -1) {

            //DIE("icky Linux kernelbug!");

        }

    重新生成boa可执行文件,并将该文件重新拷贝到根文件系统的/bin目录下。在通过PC机的IE访问boaweb服务器:

              http://192.168.1.3

7、开机自动运行BOA服务器

在根文件系统的/etc/init.d/rcS文件中增加/bin/boa &,系统启动后,会自动运行BOA Wed服务器。

4、CGI移植

1、从CGIC的主站点http://www.boutell.com/cgic/下载源码,将其解压并进入源码目录

               #tar -zxvf cgic205.tar.gz

              #cd cgic205

2、修改Makefile文件

              1)将CC=gcc,改为CC=arm-linux-gcc

              2)将AR=ar,改为AR=arm-linux-ar

              3)将RANLIB=ranlib,改为RANLIB=arm-none-linux-gnueabi-ranlib

              4)将gcc cgictest.o -ocgictest.cgi ${LIBS},改为$(CC)$(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS}

              5)将gcc capture.o -o capture${LIBS},改为$(CC) $(CFLAGS) capture.o -ocapture ${LIBS},

3、运行make进行编译

              得到CGIC库libcgic.a、调试辅助程序capture和测试程序cgictest.cgi。

4、将libcgic.a拷贝到/usr/local/lib目录下;将cgic.h拷贝到/usr/local/include路径下。

5、将capture和cgictest.cgi拷贝到嵌入式平台的www/cgi-bin目录下。

              在宿主机的浏览器地址栏输入http://192.168.1.3/cgi-bin/cgictest.cgi,可以看到页面,CGIC库和测试脚本都移植成功。


四、移植视频流媒体服务器---> mjpeg-streamer

步骤:

mjpg-stream源码包通过下面这个网址下载

http://sourceforge.net/projects/mjpg-streamer/

压源码

tar  xvf  mjpg-streamer-r63.tar.gz

源码

cd mjpg-streamer-r63

修改顶层makefileplugins目录中的各级makefile将所有注意这里需要修改的内容

CC=gcc

修改为

CC=arm--linux--gcc

修改plugins/input_uvc/Makfile
                修改
                CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
                为
                CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I/
home/chile/jpeg/include
                修改
                $(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
                为
                $(CC) $(CFLAGS) -ljpeg -L/
home/chile/jpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

编译
                make
拷贝PC虚拟机中的 /mjpep-streamer/mjpg-streamer-r63的所有*.so动态库文件拷贝到开发板 /lib/目录下

拷贝执行文件mjpg_streamer到开发板的bin下并改变权限
  测试运行
【我的板子chile】:(注意输入有误)
mjpg_streamer -i "/lib/input_uvc.so -d /dev/video3" -o "/lib/output_http.so  -w 192.168.1.111:8080"

用火狐浏览器打开一个网页输入下面地址就能够看到一个视频(开发板的IP为192.168.0.88):
                http://192.168.
1.111:8080/?action=stream 
                打开一个网页输入下面地址就能够看到一个静态图片:
                http://192.168.
1.111:8080/?action=snapshot

没有更多推荐了,返回首页