OpenWrt 很多設定檔都是透過 UCI 介面 (Unified Configuration Interface) 來進行大部份的系統設定,包括 network, wireless, dhcp, firewall, dropbear (SSH Server) 以及跟網頁開發有關的 uhttpd 和 luci 都是。
UCI 的檔案格式是一致的。以 /etc/config/system 為例,它的內容如下:
在 LuCI 的 Web 管理介面上,有一頁是系統設定的操作介面,這個介面正是用來管理 /etc/config/system 設定檔:
LuCI 便是透過 UCI 程式介面來讀寫 /etc/config/system 設定檔。
我們也可以用 LuCI 來讀寫與管理自己的 UCI 設定檔。
Serial Port 的 baud rate 設定介面
來做個練習。首先編輯 /etc/config/arduino,輸入以下內容:
接著寫段程式碼 (arduino.lua,請存至 /usr/lib/lua/luci/model/cbi/myapp/arduino.lua):
其中,以 Map 對應 /etc/config/arduino,然後以 NamedSection 對應 /etc/config/arduino 設定檔中的 main 這個 section,然後建立兩個物件分別對應 serialport 與 baud_rate 這兩個 options。Value 屆時會在網頁上產生 TextBox,而 ListValue 則會在網頁上產生 Dropdown List (HTML 的 <select><option>…)
我們還要準備個 Controller 模組 (index.lua, 請存至 /usr/lib/lua/luci/controller/myapp/index.lua):
完成後,瀏覽 /cgi-bin/luci/myapp,便會看到如下畫面:
這是 LuCI 自動產生的介面,可以讓使用者管理 /etc/config/arduino 這個設定檔的內容,當你在 UI 上做好設定,點按 [Save & Apply] 後,/etc/config/arduino 的檔案內容就會自動更新。
再進一步
前一個版本只是方便管理 /etc/config/arduino 這個設定檔。現在,讓我們進一步做件事「當使用者改變 baud rate 時,便呼叫 stty 指令改變 serial port 的 baud rate」:
將 arduino.lua 修改成這樣:
現在,當使用者在 Web 管理介面上改變 baud rate 時,就會同時呼叫 stty 去修改 serial port 的 baud rate 囉。你可以利用 stty –F <serial port> 來確認 baud rate 是否有改變: