實現遠端監控【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)
二、移植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
修改頂層makefile及plugins目錄中的各級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