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