1. 程式人生 > >實現遠端監控【BOA/JPEG/MJPEG-STREAMER】

實現遠端監控【BOA/JPEG/MJPEG-STREAMER】

實現流程:
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庫

步驟:

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原始碼包通過下面這個網址下載

壓原始碼

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 [email protected] input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
                為
                $(CC) $(CFLAGS) -ljpeg -L/
home/chile/jpeg/lib -o [email protected] 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