OpenWRT下的mjpg streamer配置(zhi)
時間(jian):2018-08-15 來源:未知(zhi)
1.1.1 軟件(jian)介紹
mjpg-streamer 可以通過(guo)文件或(huo)者是HTTP方式訪問(wen)linux UVC兼容攝像頭。
1.1.2 安裝
在openwrt系統(tong)下(xia),需要安裝以(yi)下(xia)攝像頭的驅動。
opkg kmod-usb2
opkg install kmod-usb-ohci #一般BCM用的是ohci USB控制(zhi)器
opkg install kmod-usb-video
opkg install kmod-video-gspca-core
opkg install kmod-video-core
opkg install kmod-video-uvc #免(mian)驅uvc攝像頭
opkg install kmod-video-gspca-zc3xx #中微星攝像頭 如zc301 zc303 zc305
opkg install kmod-i2c-core
opkg install kmod-input-core
如果(guo)能找到(dao) /dev/video0 的設備(bei)文件,就說明驅(qu)動已經(jing)安裝成功。
如(ru)果(guo)沒有(you)成功(gong),羅(luo)技的攝像頭(tou)還可以嘗試一下安裝kmod-video-pwc。
在(zai)openwrt系統下(xia)面,安裝mjpg-streamer很簡單(dan)。
opkg install mjpg-streamer
安裝完了之后,運行
/etc/init.d/mjpg-streamer start
就可以啟動了。
1.1.3 使用
在firefox瀏覽器(qi)里(li)面輸入 //192.168.1.1:8080/?action=stream ,應該能看(kan)到攝像(xiang)頭抓取的視頻。
這(zhe)個(ge)視頻(pin)的幀數很(hen)低,顯得攝(she)像頭反(fan)應很(hen)慢。可(ke)以修改/etc/config/mjpg-streamer里面(mian)的fps參數。
如(ru)果想在公司(si)訪問(wen)家里的攝像頭,還應該修(xiu)改防火墻,接受(shou)8080端口的外(wai)網(wang)請求。
添加下面配(pei)置到 /etc/config/firewall
config rule
option src wan
option proto tcp
option dest_port 8080
option target ACCEPT
然后重(zhong)啟防(fang)火墻 /etc/init.d/firewall restart,就可以了。
外(wai)網訪問(wen)攝(she)像(xiang)頭的時(shi)候,如果看視頻(pin)可(ke)能速度會跟不上(shang),可(ke)以只看截(jie)屏。//192.168.1.1:8080/?action=snapshot
需(xu)要將192.168.1.1替換(huan)成(cheng)路(lu)由器說使用的公網IP地(di)址
1.1.4 設置開機自啟動
openwrt是基于linux內核(he)的路由操作(zuo)系統,
總結一(yi)下OpenWrt的啟(qi)(qi)動(dong)流程:1.CFE->2.linux->3./etc/preinit->4./sbin/init ->5./etc/inittab ->6./etc/init.d/rcS->7./etc/rc.d/S* ->8.經過裁(cai)剪,因此(ci)與普通(tong)linux系統(tong)文件(jian)結構有所不同。為了(le)添加攝像(xiang)頭裝了(le)mjpg_streamer,但是每次都要手(shou)動(dong)啟(qi)(qi)動(dong)攝像(xiang)頭,實在是太(tai)麻(ma)煩了(le)于是給它設(she)置(zhi)為開機自(zi)啟(qi)(qi)動(dong)。
首先在(zai)/etc/init.d里添加(jia)需要啟動的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
}
之后還需要(yao)在rc.d目(mu)(mu)錄下做(zuo)一個鏈接(jie),啟動(dong)(dong)時系統會按順(shun)序(xu)啟動(dong)(dong)rc.d目(mu)(mu)錄下的(de)腳本鏈接(jie),對應執行init.d目(mu)(mu)錄下的(de)啟動(dong)(dong)腳本。
命令(ling):ln -s /etc/init.d/startCamera /etc/rc.d/S50startCamera
重啟,即可
現(xian)在實現(xian)了(le)開機(ji)自(zi)啟動
如果想關閉的話 直(zhi)接(jie)殺進程(cheng)就可以了
還有一種是通(tong)過傳參來設(she)置
mjpg_streamer -b -i "input_uvc.so -r 320x240 -f 15 -y" -o "output_http.so -p 8080 -w /web"網(wang)址
//192.168.1.90:8080/?action=stream
服務啟動
/etc/init.d/mjpg-streamer enable 是設置(zhi)開機自動啟動
/etc/init.d/mjpg-streamer disable 是禁止開機自動(dong)啟動(dong)
/etc/init.d/mjpg-streamer start 是現在啟動
/etc/init.d/mjpg-streamer restart 重啟(qi)
/etc/init.d/mjpg-streamer stop 停止
service mjpg-streamer start
設置開機(ji)自(zi)動啟動服務(wu)
/etc/init.d/mjpg-streamer enable
立即啟動服務
/etc/init.d/mjpg-streamer start [1]
很像ser2net,即便拔掉攝像頭再(zai)插上(shang)也(ye)會識(shi)別。
1.1.5 配置用戶名和密碼(ma)
mjpg-streamer 還可以使用用戶名和密(mi)碼來訪問。
修(xiu)改 /etc/init.d/mjpg-streamer 中的(de)[ $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" &
后添(tian)加的部分(fen)就是(shi)用戶(hu)名和(he)密碼,中間用冒(mao)號分(fen)割。重(zhong)新(xin)啟動mjpg-streamer,保證配置生效。
/etc/init.d/mjpg-streamer restart
1.2 OpenWRT下(xia)的(de)ser2net配置使用
1.2.1 軟件(jian)介(jie)紹(shao)
ser2net是(shi)以款串(chuan)口(kou)轉發軟(ruan)件(jian),這是(shi)一(yi)個(ge)可以通(tong)過(guo)個(ge)人PC或手(shou)機(ji)向路(lu)(lu)由(you)的(de)指(zhi)定(ding)端口(kou)發送(song)數(shu)(shu)據,然后路(lu)(lu)由(you)原封不動(dong)的(de)將(jiang)數(shu)(shu)據發送(song)到路(lu)(lu)由(you)的(de)TTL接口(kou)的(de)程序(xu)。當安(an)裝完(wan)這個(ge)程序(xu)后,我(wo)們就可以通(tong)過(guo)編制(zhi)的(de)程序(xu)向路(lu)(lu)由(you)的(de)TTL口(kou)發送(song)串(chuan)行(xing)數(shu)(shu)據,意義在于(yu):單片機(ji)就可以接受路(lu)(lu)由(you)發送(song)的(de)串(chuan)行(xing)數(shu)(shu)據進行(xing)各種控制(zhi)。
聯(lian)網以后利用(yong)opkg指令(ling)來(lai)安裝,或用(yong)luci安裝,安裝完以后會出現(xian)一個文件
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
注意,這(zhe)里"#"代表的(de)是(shi)屏蔽,我們修改的(de)是(shi)非(fei)屏蔽語句,可(ke)以看(kan)到,上位機發送(song)的(de)端(duan)口是(shi)2001,這(zhe)就是(shi)我們需要發送(song)的(de)端(duan)口號(hao),波特率是(shi)9600,其它的(de)略(lve)。
1.2.2 設置開(kai)機啟動
ser2net開機自啟動(dong):
命令vi /etc/rc.local 打開它,i進入(ru)編輯,在exit0的上一行(xing)添加(jia)一條ser2net,esc退出編輯,wq保(bao)存
命令vi /etc/init.d/ser2net,,i進入(ru)編(bian)輯
#!/bin/sh /etc/rc.common
# /init.d/my-ser2net
START=99
start() {
ser2net –c /etc/ser2net.conf
}
Esc退出(chu)編輯,wq 保存(cun)。
命令reboot重(zhong)啟路由器,ok
直接(jie)輸入ser2net可以(yi)啟(qi)動(dong)此軟件(jian)。輸入 ./ser2net 驗證自啟(qi)動(dong)修(xiu)改(gai)是否正(zheng)確
1.2.3 串口ser2net過濾特(te)殊字符(fu)
許多(duo)流(liu)行的linux串口編(bian)程的版本中都沒對c_iflag(termios成員變(bian)量)這個變(bian)量進(jin)(jin)行有(you)效的設置,這樣傳送ASCII碼(ma)時沒什(shen)么問(wen)題,但傳送二進(jin)(jin)制(zhi)數(shu)據時遇到0x0d,0x11和(he)0x13卻會被丟掉(diao)。不用(yong)說(shuo)也(ye)知道,這幾個肯(ken)定是特(te)殊字(zi)符,被用(yong)作特(te)殊控制(zhi)了。關掉(diao)ICRNL和(he)IXON選項即可解決(jue)。
c_iflag &= ~(ICRNL | IXON);
0x0d 回車符CR
0x11 ^Q VSTART字符(fu)
0x13 ^S VSTOP字(zi)符
ICRNL 將輸入的CR轉換為(wei)NL
IXON 使起動/停止(zhi)輸出控(kong)制流起作用
在(zai)《UNIX環境高(gao)級編程第二版》第18章第11小節看到(dao)把(ba)終端I/O設置為(wei)原始(shi)模(mo)式(串口通訊就是終端I/O的原始(shi)模(mo)式)時輸入屬性設置為(wei)
term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
原來這三(san)個數(shu)據是(shi)串口通信里面特殊字符(fu),具(ju)有(you)特別(bie)的意義,會(hui)被(bei)ser2net過濾掉(diao),那么怎么保證數(shu)據完整無誤地傳輸呢?
方法一:修(xiu)改(gai)ser2net源代碼,這個方法太麻煩。
方法二: 用winscp登陸(lu)WIFI板,轉到/etc/目錄,打開(kai)ser2net.conf文件(jian),找到如下配置:
2001:raw:600:/dev/ttyATH0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS
將其中藍色字體(ti)部(bu)分刪除,變為(wei):
2001:raw:600:/dev/ttyATH0:9600 NONE 1STOPBIT 8DATABITS LOCAL -RTSCTS
保存,再重啟WIFI板(ban),ser2net就(jiu)不再會過濾掉特殊字(zi)符了。
那(nei)如何在(zai)OpenWRT源(yuan)碼編譯(yi)鏡(jing)像的時候就(jiu)將此軟件(jian)(jian)包(bao)配置好呢,簡單的方(fang)法(fa)就(jiu)是(shi)修(xiu)改(gai)編譯(yi)所需(xu)軟件(jian)(jian)包(bao)中的配置文件(jian)(jian),文件(jian)(jian)路徑:/dl/ser2net-2.9.1.tar.gz
tar -zxvf ser2net-2.9.1.tar.gz

進入我們(men)解壓的目(mu)錄
cd ser2net-2.9.1/
ls

可(ke)以找到ser2net.config,對其進行編輯
vi ser2net.config

將XONXOFF刪除(chu),將ttyS0改(gai)為ttyATH0,另(ling)外此處(chu)還可(ke)以修改(gai)端口號及串口波特率。wq保存退出,然后退回到dl目(mu)錄,刪除(chu)之前(qian)的軟件(jian)包(bao),重新壓縮。
cd ..
rm ser2net-2.9.1.tar.gz
tar –zcvf ser2net-2.9.1.tar.gz ser2net-2.9.1/
1.2.4 ser2net的(de)雙(shuang)向通(tong)信
因shell與ser2net占(zhan)用同一個串口,當我(wo)們向串口發送數據時就會(hui)出現問題,需(xu)要(yao)將shell注釋掉(diao)。根(gen)據我(wo)們選擇額(e)硬件平(ping)臺,我(wo)們需(xu)要(yao)修改./target/linux/ar71xx/base-files/etc/inittab
vi ./target/linux/ar71xx/base-files/etc/inittab

將后一(yi)行#號注釋掉

