周 楊,李 燕,李范鳴
(1.中國科學(xué)院 上海技術(shù)物理研究所,上海 200083;2.中國科學(xué)院大學(xué),北京 100049;3.中國科學(xué)院 紅外探測器與成像技術(shù)重點實驗室,上海 200083)
目前,隨著NFC系統(tǒng)的應(yīng)用越來越廣泛,相應(yīng)的讀寫器的部署規(guī)模也越來越大,相應(yīng)地對這些讀寫器的管理問題也日益嚴(yán)重。目前管理NFC讀寫器的方法主要有兩種:一種是人工手動管理,例如食堂收費系統(tǒng)等。這種管理方式人力成本過高,當(dāng)系統(tǒng)的規(guī)模擴(kuò)大時,這種弊端隨之加重。另一種是通過局域網(wǎng)或者廣域網(wǎng)進(jìn)行分布式集中管理,由客戶端對分布式的NFC讀寫器進(jìn)行參數(shù)的配置和數(shù)據(jù)的采集。這種方式使得用戶可以隨時隨地登錄服務(wù)器的網(wǎng)址,同時對大量NFC讀寫器進(jìn)行監(jiān)控,這是將來對NFC讀寫系統(tǒng)進(jìn)行管理的主流趨勢。
傳統(tǒng)的軟件架構(gòu)技術(shù)的實現(xiàn)方式主要分為MFC/C++.SQL SERVER.MYSQL,HTML+CSS+JS/php.java.net和Qt/Qt.C++三種[1]。MFC/C++.SQL SERVER.MYSQL實現(xiàn)的架構(gòu)方案前后端的耦合度過高且語法復(fù)雜,沒有跨平臺特性;HTML+CSS+JS/php.java.net實現(xiàn)的架構(gòu)方案雖然降低了前后端的耦合度,但是前端設(shè)計語法過于復(fù)雜,且后端沒有跨平臺特性;Qt/Qt.C++實現(xiàn)的架構(gòu)方案雖然具有跨平臺特性,但是前端設(shè)計語法復(fù)雜且前后端耦合度過高[2]。
針對上述問題,文中采用基于QML/Qt.C++的軟件架構(gòu)和MVC設(shè)計模式。其中,QML(Qt元語言)的引入,降低了前端設(shè)計技術(shù)的復(fù)雜度;前后端分離的MVC設(shè)計模式,提高了系統(tǒng)的可擴(kuò)展性和可維護(hù)性[3]。
MVC即模型(model)-視圖(view)-控制器(controller),是軟件架構(gòu)技術(shù)中常用的設(shè)計模式,這種設(shè)計模式將前端顯示和后端數(shù)據(jù)處理分離,從而使得軟件架構(gòu)邏輯清晰,增強(qiáng)了軟件產(chǎn)品的可維護(hù)性和可擴(kuò)展性[4]。其中,模型是“數(shù)據(jù)模型”的簡稱,是用戶在磁盤上或內(nèi)存中存儲的數(shù)據(jù),這些數(shù)據(jù)按照一定的結(jié)構(gòu)存放,從而便于用戶在需要的時候進(jìn)行存取[5];視圖是“用戶視圖”的簡稱,是顯示模型中數(shù)據(jù)的用戶界面,它由特定的語言繪制完成,從而使得模型中的數(shù)據(jù)按照用戶的意愿進(jìn)行組織、呈現(xiàn)[6];控制器是“模型-視圖顯示控制器”的簡稱,更加精細(xì)化地控制著模型中的數(shù)據(jù)在視圖中的顯示方式,當(dāng)模型中的數(shù)據(jù)發(fā)生變化時,控制器會主動向視圖反饋變化的模型數(shù)據(jù),從而保證了視圖中顯示的數(shù)據(jù)和模型中的數(shù)據(jù)保持同步[7-8]。
本系統(tǒng)應(yīng)用程序基于MVC模式實現(xiàn):模型由Qt/C++語言實現(xiàn),保證了底層數(shù)據(jù)模型的跨平臺特性;視圖由QML(Qt元語言)實現(xiàn),保證了前端設(shè)計的簡潔性、跨平臺性及與后臺Qt/C++銜接的緊密性;控制器由QML實現(xiàn),保證了與模型、視圖銜接的緊密性,進(jìn)而使得整個應(yīng)用程序的邏輯架構(gòu)清晰、完整、嚴(yán)謹(jǐn)。當(dāng)用戶向底層數(shù)據(jù)模型發(fā)送提取數(shù)據(jù)請求時,QML實現(xiàn)的視圖將該請求轉(zhuǎn)換為信號,并且由QML實現(xiàn)的控制器發(fā)送到Qt/C++實現(xiàn)的底層數(shù)據(jù)模型,底層數(shù)據(jù)模型向控制器反饋數(shù)據(jù),并且通過槽機(jī)制將數(shù)據(jù)發(fā)送到視圖,由控制器完成在視圖上的細(xì)節(jié)顯示工作。
計算機(jī)軟件架構(gòu)方面采用全新的QML/Qt.C++架構(gòu)方案。
QML即Qt meta language(Qt元語言),是一種全新的界面設(shè)計技術(shù),于2011年由Digia公司提出。它將常見的圖元(部件,圖片,窗口,動畫等)做了簡易的封裝,使得用戶可以靈活地組合這些圖元,從而達(dá)到想要的界面效果[9]。
Qt是一種跨平臺的類庫,封裝了諸如數(shù)據(jù)庫等數(shù)據(jù)處理和前端顯示的函數(shù),QML相比于Qt前端的進(jìn)步之處在于它的語法設(shè)計更加簡潔直觀,使得跨平臺的界面設(shè)計可以更加靈活,并且和Qt/C++后端技術(shù)銜接緊密[10]。
C++是一種跨平臺語言,可用于后臺的數(shù)據(jù)處理工作,并且可用于基于C++語言實現(xiàn)的Qt庫的混合程序設(shè)計工作,而QML又是在Qt的基礎(chǔ)上發(fā)展出來的前端技術(shù),所以基于QML/Qt.C++技術(shù)的前后端架構(gòu)方案有實現(xiàn)的可行性。
QML/Qt.C++架構(gòu)相較于傳統(tǒng)的軟件架構(gòu)方案的技術(shù)對比見圖1。
圖1 軟件架構(gòu)方案技術(shù)對比
前端(QML)優(yōu)勢:
QML的語法實現(xiàn)可以理解為HTML+CSS+JS的精簡版,相比于傳統(tǒng)的HTML+CSS+JS的前端技術(shù):
(1)QML去除了繁瑣的CSS樣式表操作,將HTML和JS的語法濃縮,使前端設(shè)計的語法更清晰,使用更簡潔。
(2)QML在桌面端的界面設(shè)計效果要明顯優(yōu)于HTML+CSS+JS。
相比于Qt的前端的進(jìn)步之處在于:QML是專業(yè)的前端描述語言,語法更加簡潔直觀,使得跨平臺的界面設(shè)計更加靈活、高效[11]。
相比于MFC前端的進(jìn)步之處在于:當(dāng)用戶使用QML時,不用像使用MFC一樣,記憶繁瑣的標(biāo)識符,語法更加簡潔、高效,并且跨平臺特性良好[12]。
后臺(Qt/C++/MYSQL)優(yōu)勢:
在php/java/.net/SQL SERVER/MYSQL的后臺架構(gòu)技術(shù)實現(xiàn)中,java跨平臺需要虛擬機(jī)的支撐,系統(tǒng)的開銷會增大,而.net是微軟公司開發(fā)的程序設(shè)計語言,只能在Windows平臺下運行。Qt/C++/MYSQL設(shè)計的后臺方案可以運行在Windows,Linux,Android,OS X平臺上,應(yīng)用領(lǐng)域更加廣泛。
前端與后臺(信號/槽的變種)連接的優(yōu)勢:
QML是在Qt之上發(fā)展出來的一門前端描述語言,它繼承了Qt中的信號/槽通信機(jī)制的原理,語法實現(xiàn)上要異于信號/槽,所以稱這種通信機(jī)制為信號/槽的變種。
相比于通用的軟件架構(gòu)技術(shù)1和3的通信機(jī)制(消息),文中的通信機(jī)制(信號/槽的變種)更加簡潔高效。
相比于通用的軟件架構(gòu)技術(shù)2,文中的前端(QML實現(xiàn))和后臺(Qt/C++/SQL SERVER/MYSQL實現(xiàn))實現(xiàn)了完全的代碼層面的分離,降低了前后端的耦合度,使得軟件體系架構(gòu)邏輯更加清晰,可維護(hù)性和可擴(kuò)展性更強(qiáng)的同時,延續(xù)了軟件架構(gòu)技術(shù)2的跨平臺優(yōu)勢和便利的信號/槽通信機(jī)制。
系統(tǒng)由客戶端主機(jī)、數(shù)據(jù)庫服務(wù)器、網(wǎng)絡(luò)連接線部分組成,分別負(fù)責(zé)用戶界面的呈現(xiàn)工作、數(shù)據(jù)的存儲工作、物品柜中物品狀態(tài)的顯示工作、數(shù)據(jù)的傳輸工作。架構(gòu)方案拓?fù)湟妶D2。
圖2 系統(tǒng)模型結(jié)構(gòu)
系統(tǒng)主要由NFC硬件讀卡器部分和上位機(jī)管理軟件兩部分組成。NFC讀寫器通過以太網(wǎng)將數(shù)據(jù)信息匯總到數(shù)據(jù)庫服務(wù)器,客戶端從數(shù)據(jù)庫服務(wù)器提取信息向上位機(jī)顯示。上位機(jī)軟件基于QML/Qt.C++架構(gòu)方案和MVC設(shè)計模式設(shè)計和實現(xiàn),系統(tǒng)軟件架構(gòu)見圖3。
圖3 系統(tǒng)軟件架構(gòu)
圖中,用戶發(fā)送請求(如點擊鼠標(biāo)等輸入操作),該請求在視圖層被接收,之后由QML轉(zhuǎn)換為對應(yīng)的信號,該信號通知控制層,指引控制層從Qt或C++語言實現(xiàn)的數(shù)據(jù)模型中提取數(shù)據(jù)(該數(shù)據(jù)由上位機(jī)軟件的網(wǎng)絡(luò)端口使用TCP協(xié)議,從NFC讀寫器硬件采集),該數(shù)據(jù)依托控制器,通過槽機(jī)制,被發(fā)送到視圖層,從而完成用戶所請求的數(shù)據(jù)的顯示工作。其中,視圖層的架構(gòu)方案見圖4。
圖4 視圖層架構(gòu)
圖中,QML主窗口在應(yīng)用程序啟動時被加載,主窗口的實現(xiàn)代碼中定義了N個子窗口加載器,分別映射到子窗口的啟動圖標(biāo)上。當(dāng)用戶點擊某子窗口的啟動圖標(biāo)時,子窗口加載器加載對應(yīng)的子窗口描述代碼,啟動子窗口運行。其中,每個子窗口分別屬于幾個獨立的線程,子窗口之間通過信號/槽機(jī)制的變種進(jìn)行數(shù)據(jù)交互。這種窗體加載方式使得前端界面設(shè)計的模塊性和可擴(kuò)展性更強(qiáng)。
類的對象需要在進(jìn)入應(yīng)用程序大循環(huán)之前注冊為QML前端環(huán)境的上下文屬性,以便該對象在QML環(huán)境中被發(fā)現(xiàn)和使用。
(1)模型層設(shè)計。
模型層由Qt/C++語言設(shè)計完成,模型層分為數(shù)據(jù)庫模型、樹模型、網(wǎng)格模型、線性模型和用戶自定義模型五種。
(2)控制層設(shè)計。
控制層由QML設(shè)計完成,負(fù)責(zé)模型層數(shù)據(jù)向視圖層的顯示控制工作。用于控制前端報表中的小方格的顯示方式的控制層示例代碼如下:
//設(shè)置物件代理(表格中的每個小方格)
itemDelegate: Item{
focus: true;
id:itemDelegate;
Text {
id:text;
anchors.centerIn:parent;
color: "#6b6868"
//使用默認(rèn)的文本省略方式
elide:styleData.elideMode;
text:styleData.value;
font.family: "微軟雅黑";
}
}
(3)視圖層設(shè)計。
視圖層由QML設(shè)計完成,分為報表前端、樹前端、網(wǎng)格前端、線性前端、用戶自定義前端五種,這五種顯示方式和模型層的五種模型相對應(yīng),形成了特定的五種顯示方式。其中,模型和視圖匹配的關(guān)鍵因素是role即角色屬性的對應(yīng)。例如,用戶想要提取數(shù)據(jù)庫中姓名和性別兩個字段的值并顯示到前端。在QML實現(xiàn)的視圖報表中,需要指明角色值,即想要提取的字段名稱,并且該字段名稱必須和數(shù)據(jù)庫中的字段名稱完全吻合。視圖報表的示例代碼如下:
//視圖報表從數(shù)據(jù)庫中提取“姓名”,“性別”數(shù)據(jù)項
TableViewColumn {
id: name;
role: "姓名";
title: "姓名";
}
TableViewColumn {
id: sex;
role: "性別";
title: "性別";
}
NFC方面,數(shù)據(jù)交換格式采用NDEF規(guī)范:NDEF定義了NFC設(shè)備之間以及設(shè)備與標(biāo)簽之間傳輸數(shù)據(jù)的一種消息封裝格式。設(shè)備之間傳輸?shù)男畔⒖梢苑庋b成一個NDEF消息,每個消息可以由多個NDEF記錄構(gòu)成[13-14]。
NFC采用主動和被動兩種讀取模式,發(fā)展了三種功能模式[15]:讀卡器模式(被動模式)、卡片模擬模式(被動模式)、點對點通信模式(主動模式)。文中采用的是被動模式的讀卡器功能模式。
系統(tǒng)的軟件界面可以達(dá)到藝術(shù)級的效果,監(jiān)控界面分為主界面、物品位界面、物品信息數(shù)據(jù)庫顯示界面等。應(yīng)用程序的界面整體運行效果見圖5。
圖5 應(yīng)用程序的運行界面
NFC數(shù)據(jù)速率見表1。
表1 NFC數(shù)據(jù)傳輸速率
表1中,使用ISO 15693協(xié)議的最高傳輸速率可以達(dá)到52.97 kb/s,使用ISO 14443協(xié)議的最高傳輸速率可以達(dá)到848 kb/s,滿足對于少量字符串?dāng)?shù)據(jù)的實時傳輸需求。
針對高效管理大規(guī)模NFC讀寫器的需求,設(shè)計實現(xiàn)了基于MVC設(shè)計模式和QML/Qt.C++軟件架構(gòu)方案的NFC讀寫器管理系統(tǒng)。其中,MVC設(shè)計模式降低了應(yīng)用程序中各模塊的耦合度,使得應(yīng)用程序的架構(gòu)邏輯清晰。QML/Qt.C++軟件架構(gòu)方案使得應(yīng)用程
序前端設(shè)計更加簡潔高效,模塊性更強(qiáng)。
[1] ZULKERNINE M,SEVIORA R.Towards automatic monitoring of component-based software systems[J].Journal of Systems and Software,2005,74(1):15-24.
[2] 李衛(wèi)華,傅曉東.可拓創(chuàng)新軟件體系結(jié)構(gòu)研究[J].廣東工業(yè)大學(xué)學(xué)報,2016,33(2):1-4.
[3] 劉 暢,伍 星,遲毅林,等.設(shè)備在線監(jiān)測系統(tǒng)的軟件架構(gòu)研究[J].計算機(jī)工程,2010,36(23):69-71.
[4] PESSEMIER N,SEINTURIER L,DUCHIEN L.A component-based and aspect-oriented model for software evolution[J].International Journal of Computer Applications in Technology,2008,31(1/2):94-105.
[5] 梁 弼.基于MVC的高??蒲谐晒芾硐到y(tǒng)的設(shè)計與實現(xiàn)[J].計算機(jī)技術(shù)與發(fā)展,2011,21(10):161-163.
[6] LI J M,MA G S,F(xiàn)ENG G,et al.Research on web application of struts framework based on MVC pattern[C]//Proceedings of the 2006 international conference on advanced web and network technologies,and applications.[s.l.]:[s.n.],2006:1029-1032.
[7] 趙 琳,楊輝之,郝 勇,等.基于MVC的敏捷衛(wèi)星工作模式仿真技術(shù)研究[J].系統(tǒng)仿真學(xué)報,2017,29(3):537-545.
[8] 于湛麟,李仲秋,任永昌.SSH框架實現(xiàn)MVC架構(gòu)的電子商務(wù)軟件平臺[J].計算機(jī)技術(shù)與發(fā)展,2012,22(10):169-172.
[9] 安曉輝.Qt quick核心編程[M].北京:電子工業(yè)出版社,2015.
[10] 陸文周.Qt5開發(fā)及實例[M].第2版.北京:電子工業(yè)出版社,2015.
[11] 安曉輝.Qt on Android核心編程[M].北京:電子工業(yè)出版社,2015.
[12] 尼俊紅,張 麗,張 淼,等.基于Ajax和MVC的電力通信告警系統(tǒng)的設(shè)計實現(xiàn)[J].計算機(jī)應(yīng)用與軟件,2013,30(8):226-227.
[13] 蘇 婕,王 忠.基于NFC技術(shù)的巡更巡檢管理系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機(jī)工程與設(shè)計,2015,36(4):1068-1072.
[14] 蔣 華,孫 強(qiáng).近距離無線通信技術(shù)標(biāo)準(zhǔn)解析[J].信息技術(shù)與標(biāo)準(zhǔn)化,2006(5):26-30.
[15] 徐 磊,周 喜,馬玉鵬,等.一種基于NFC手機(jī)的RFID中間件的設(shè)計與實現(xiàn)[J].計算機(jī)與現(xiàn)代化,2014(9):90-94.