鄭紅黨, 劉燦斌, 孫彥景, 李 松
(中國礦業(yè)大學 信息與控制工程學院, 江蘇 徐州 221116)
隨著“三網融合”的提速,手機、數字電視、信息家電、網絡電話、汽車電子、醫(yī)療電子等行業(yè)成為嵌入式系統(tǒng)的重要應用領域[1-3]。盡管高校開設了嵌入式系統(tǒng)課程,但學生的軟件開發(fā)能力仍顯不足[4-5]。因此,相關實驗教學需更具直觀性和實用性[6],使學生能夠掌握嵌入式軟件開發(fā)的方法,具備計算機網絡、圖形界面設計、嵌入式服務器等技術的研發(fā)能力[7]。
常用嵌入式操作系統(tǒng)有Linux、Windows Mobile、VxWorks等。Linux開放源代碼,有GNU下的各種開源軟件的支持,且支持幾乎所有的嵌入式CPU,具有低開發(fā)成本、高開發(fā)效率的優(yōu)勢,是目前應用最為廣泛的嵌入式操作系統(tǒng)[8]。本文基于Linux操作系統(tǒng)設計了遠程控制系統(tǒng)綜合實驗。下位機的應用軟件基于Linux操作系統(tǒng)開發(fā),搭建了可外網訪問的Web服務器和簡單的圖形界面;上位機應用軟件基于Web和Electron技術開發(fā),構建了桌面應用程序。
遠程控制系統(tǒng)綜合實驗的功能為:用電腦或手機對嵌入式開發(fā)板中的LED燈、蜂鳴器和電位計進行遠程控制和狀態(tài)顯示,嵌入式開發(fā)板也可通過操作本地LCD面板界面控制設備和顯示設備狀態(tài)。設計包括上位機和下位機兩部分,如圖1所示。
圖1 系統(tǒng)設計
上位機提供桌面應用程序,對下位機中的LED燈和蜂鳴器進行遠程控制,并顯示下位機的狀態(tài)以及輔助性說明等內容。
下位機硬件采用三星Exynos4412嵌入式平臺,軟件設計選用Linux操作系統(tǒng),運用QTE技術設計LCD面板的圖形用戶界面(GUI)。用戶可通過GUI操作,實現對下位機中LED燈、蜂鳴器的控制,實現電位計的數據采集,并在LCD面板中顯示各設備狀態(tài)。下位機還需搭建Boa Web服務器并使用內網透傳技術實現上位機的遠程訪問。
綜上,實驗內容具體包括:
(1) 嵌入式Linux開發(fā)環(huán)境的搭建及操作系統(tǒng)移植;
(2) 設備驅動程序的開發(fā);
(3) 嵌入式圖形界面的設計;
(4) 嵌入式Web服務器的搭建;
(5) 內網透傳技術的實現;
(6) 上位機軟件設計。
有關嵌入式Linux環(huán)境的搭建、移植及設備驅動設計方面的文獻較多,本文不再贅述,重點介紹上述(3)—(6)項內容的實現。
采用QTE(Qt/Embedded)平臺設計面板的圖形界面。QTE是Qt平臺專門針對嵌入式Linux提供的API,可在嵌入式環(huán)境下構建GUI圖形界面。Qt Creator是跨平臺的Qt集成開發(fā)環(huán)境(IDE),有良好的圖形界面,通過“所見即所得”的開發(fā)方式,放置好控件并進行參數設定,即可生成Qt界面的XML文件[9]。
QMainWindow控件是窗體控件,是圖形界面的載體。根據開發(fā)板平臺顯示面板的分辨率,設置窗體的長寬為480×272像素,并且刪除無關的標題欄、信息欄、選單欄、達到簡約的效果。
下位機布置了3個Check Box控件:checkBox_led1、checkBox_led2、checkBox_beep,Check Box控件有“勾選”和“未勾選”兩種選擇,分別表示2個LED燈和蜂鳴器運行與否。
QLCDNumber控件是一個類似數碼管顯示效果的數字顯示控件,它支持配置顯示樣式以及數字的位數。該實驗中,能實時顯示電位計的AD采樣值,實例化為LCDNumber。
Label控件是可以顯示圖片、文字的標簽控件。在完成上述主要控件布置后,需要對軟件名稱、按鍵操作、顯示數字進行指引,故添加了若干Label控件。
信號和槽是Qt自行定義的一種通信機制,應用于對象之間的通信[10]。當某個信號對其客戶或所有者的內部狀態(tài)發(fā)生改變,信號則被對象發(fā)射,和其相關聯(lián)的槽將被即時執(zhí)行,就像一個正常的函數調用。信號和槽的關系如圖2所示。
圖2 信號與槽
設計中一共有3個控制控件及1個數字顯示控件,信號與槽的設計見表1。為實現電位計數值的動態(tài)變化,采用Timer定時器每隔500 ms觸發(fā)一次timerEvent事件。
表1 信號與槽函數對應關系
在MainWindow.cpp窗體對象中,進行Signal和Slot的連接:
connect(ui->checkBox_led1,SIGNAL(toggled(bool)),
this,SLOT(LED1_Toggle()));
connect(ui->checkBox_led2,SIGNAL(toggled(bool)),
this,SLOT(LED2_Togg,le())); connect(ui->checkBox_beep,SIGNAL(toggled(bool)),
this,SLOT(BUZZER_Toggle()));
startTimer(500);
對應的check_Box_ledx發(fā)出toggled信號,將執(zhí)行LEDx_Toggled()函數:
LEDx_Toggled()
{LEDx=~LEDx;
if(LEDx==0)
{ioctl(fb_led,1,1);}
else
{ioctl(fb_led,0,1);}
}
為實現上位機(本地計算機或手機)的遠程控制,搭建了BOA服務器。BOA是一個小型的嵌入式Web服務器,可以有效減少資源的占用,提高Web服務器的穩(wěn)定性與可靠性,支持CGI編程和單線程處理用戶的訪問[11]。
為實現上位機與下位機不在同一局域網內的遠程控制,設計中搭建了NGROK服務器,使用內網透傳技術實現局域網內的服務器被外網訪問。NGROK是一款開源的軟件,內網透傳的原理為反向代理。服務端要求有公網的IP地址,內網設備有相對固定的訪問接口,內網與公網NGROK服務端之間建立通道,進行反向代理,實現對客戶端的動態(tài)域名解析[12]。
從NGROK官方網站ngrok.org可以得到免費的NGROK服務,下載對應平臺的客戶端并運行,就可以通過域名訪問內網的資源。設計中將本地的80端口映射為test.ngrok.cucb17.cn。
下位機軟件包括BOA服務器和QTE的GUI軟件。模擬Linux設備驅動程序的方法,使用了共享文件的方式實現兩者的通信,程序流程如圖3所示。
圖3 程序流程圖
使用Web技術設計上位機界面,再用Electron構建一個桌面應用程序。Electron是使用Web前端技術開發(fā)跨平臺桌面應用的開源庫,它將Chromium和Node.js整合為一體,由Chromiun負責渲染前端界面,Node.js負責后臺的數據處理,并支持將Electron環(huán)境下運行的程序打包為Mac,為Windows和Linux系統(tǒng)下無環(huán)境依賴的桌面應用程序[13]。
上位機界面包括控制操作以及下位機狀態(tài)顯示。根據需求,將上位機界面劃分為幾個區(qū)域:
(1) 標題信息區(qū):用于顯示基本的標題和信息;
(2) 控制操作區(qū):用于顯示控制界面;
(3) 數據接收區(qū):用于接收下位機返回的數據;
(4) 時延顯示區(qū):用于顯示連接時延;
(5) IP配置區(qū):用于進行遠程IP地址的配置。
使用屬性,添加了訪問設備地址的選擇區(qū)域。訪問設備地址IP有2種選項:(1)本地控制,上位機與下位機在同一局域網內;(2)遠程控制模式,NGROK服務器主機位于紐約。
根據手機和PC端的兩種應用場景,分別進行界面布局。以手機為例,手機通常是屏幕較小的手機,豎屏顯示,其典型的顯示分辨率為360×640像素,界面設計如圖4所示。
圖4 手機控制界面
桌面應用程序實際運行方式為命令行,輸入eletron main.js執(zhí)行,main.js為主程序。配置窗體信息以及進行數據處理的主要代碼如下:
function createWindow() {
mainWindow = new BrowserWindow({width: 360, height: 640})
mainWindow.loadURL(url.format({
pathname:path.join(__dirname, ′index.html′),
protocol: ′file:′,
slashes: true
}))
……}
基于Linux遠程控制系統(tǒng)的綜合實驗內容既有Linux系統(tǒng)移植、驅動開發(fā)基本實驗,也有應用層軟件嵌入式圖形界面、Web服務器以及上位機應用程序的開發(fā)實驗。通過LCD面板界面和上位機軟件可同時控制LED燈和蜂鳴器并顯示其狀態(tài),實驗結果具有直觀性。