天天看點

Luci界面開發——IPC控制

功能:通過Luci界面控制網絡攝像頭

環境:JS7628開發闆(openwrt系統)

效果:在Luci界面中增加一個控制網絡監控的控制子產品,包含是否啟用網絡攝像頭、幀率、分辨率配置。

Luci界面開發——IPC控制
Luci界面開發——IPC控制

實作過程:實作這一功能需要增加4個檔案

1.定義子產品入口檔案

Luci界面開發——IPC控制
module("luci.controller.ipc", package.seeall)
function index()
        entry({"admin", "network", "ipc"}, cbi("ipc"), _("............"), 100)
        end
           

     檔案部分内容解析:

        (1)luci.controller.ipc中的ipc就是你放在 /usr/lib/lua/luci/controller目錄下的那個.lua檔案前面部分

        (2)entry是子產品加載入口,原型為:entry(路徑, 調用目标, _("顯示名稱"), 顯示順序)

            路徑就是要将這個子產品放在Luci界面哪個位置,這裡是放在網絡菜單欄下

            調用目标就是下面要說的第二個檔案.lua前面部分 ipc

            顯示名稱就是紅色框裡的内容:網絡監控,這個為 _("............")的原因是文字編碼格式問題

2.Luci開發配置檔案

Luci界面開發——IPC控制
require("luci.sys")

m = Map("ipc", translate("IPC"), translate("A switch to enable/disable the IPC."))

s = m:section(TypedSection, "login", "")
s.addremove = false
s.anonymous = true

enable = s:option(Flag, "enable", translate("Enable"))
fps = s:option(Value, "fps", translate("fps"))

supportResolution = {"640x480", "800x600", "1280x720", "1280x1024"}

resolution = s:option(ListValue, "resolution", translate("resolution"))
for k, v in ipairs(supportResolution) do
        resolution:value(v)
end


local apply = luci.http.formvalue("cbi.apply")
if apply then
        io.popen("/etc/init.d/ipc restart")
end

return m
           

     檔案部分内容解析:

        (1)m = Map("ipc", translate("IPC"), translate("A switch to enable/disable the IPC.")):

            ipc為配置檔案名

            IPC為配置頁面标題

            “A switch to enable/disable the IPC.”為配置頁面說明

Luci界面開發——IPC控制

        (2)定義三個參數

            enable(啟用):選擇框(Flag)

            fps:文本框(Value)

            resolution:下拉清單框(ListValue),下拉清單選項為supportResolution數組内容。我的攝像頭支援這4種分辨率。

        (3)最後幾行代表如果在Luci界面中點選“儲存&應用”,就執行這個腳本檔案,這個檔案就是等下要說的第4個檔案。

3.配置檔案 ipc,用于儲存 Luci 界面中配置的資料,三個參數的值與配置頁面參數的值一緻,儲存應用後對應值會修改

Luci界面開發——IPC控制
config login
        option resolution '640x480'
        option enable '1'
        option fps '20'
           

4.UCI調用腳本

Luci界面開發——IPC控制
#!/bin/sh /etc/rc.common

START=50

run_ipc()
{
    local enable
    config_get_bool enable $1 enable
    if [ $enable ]; then

        local fps
        local resolution

        config_get fps $1 fps
        config_get resolution $1 resolution

        sed -i "7c  \   option resolution \'$resolution\'"  /etc/config/mjpg-streamer
        sed -i "10c \   option fps \'$fps\'"                /etc/config/mjpg-streamer
        /etc/init.d/mjpg-streamer start
    else
        /etc/init.d/mjpg-streamer stop
    fi
}
start()                                                                                  
{                                                                                        
    config_load ipc                                                                      
    config_foreach run_ipc login                                                 
}                                      
                                      
stop()                                
{                               
    /etc/init.d/mjpg-streamer stop
    echo "ipc stoped."          
}  
           

開發闆開啟攝像頭的指令是:/etc/init.d/mjpg-streamer start,關閉攝像頭的指令是:/etc/init.d/mjpg-streamer stop

    檔案部分内容解析:

        (1)從start函數開始看,config_load ipc是讀取配置檔案(上訴第3個檔案)ipc,config_foreach run_ipc login 是讀取配置檔案中的值并進行相應操作,run_ipc函數中先判斷enable的值是否為1(是否開啟攝像頭),如果是,将幀率fps和分辨率resolution資訊覆寫到攝像頭配置檔案後開啟攝像頭,否則執行關閉攝像頭指令。