周 楊,李 燕,李范鳴
(1.中國科學院 上海技術物理研究所,上海 200083;2.中國科學院大學,北京 100049;3.中國科學院 紅外探測器與成像技術重點實驗室,上海 200083)
目前,隨著NFC系統的應用越來越廣泛,相應的讀寫器的部署規模也越來越大,相應地對這些讀寫器的管理問題也日益嚴重。目前管理NFC讀寫器的方法主要有兩種:一種是人工手動管理,例如食堂收費系統等。這種管理方式人力成本過高,當系統的規模擴大時,這種弊端隨之加重。另一種是通過局域網或者廣域網進行分布式集中管理,由客戶端對分布式的NFC讀寫器進行參數的配置和數據的采集。這種方式使得用戶可以隨時隨地登錄服務器的網址,同時對大量NFC讀寫器進行監控,這是將來對NFC讀寫系統進行管理的主流趨勢。
傳統的軟件架構技術的實現方式主要分為MFC/C++.SQL SERVER.MYSQL,HTML+CSS+JS/php.java.net和Qt/Qt.C++三種[1]。MFC/C++.SQL SERVER.MYSQL實現的架構方案前后端的耦合度過高且語法復雜,沒有跨平臺特性;HTML+CSS+JS/php.java.net實現的架構方案雖然降低了前后端的耦合度,但是前端設計語法過于復雜,且后端沒有跨平臺特性;Qt/Qt.C++實現的架構方案雖然具有跨平臺特性,但是前端設計語法復雜且前后端耦合度過高[2]。
針對上述問題,文中采用基于QML/Qt.C++的軟件架構和MVC設計模式。其中,QML(Qt元語言)的引入,降低了前端設計技術的復雜度;前后端分離的MVC設計模式,提高了系統的可擴展性和可維護性[3]。
MVC即模型(model)-視圖(view)-控制器(controller),是軟件架構技術中常用的設計模式,這種設計模式將前端顯示和后端數據處理分離,從而使得軟件架構邏輯清晰,增強了軟件產品的可維護性和可擴展性[4]。其中,模型是“數據模型”的簡稱,是用戶在磁盤上或內存中存儲的數據,這些數據按照一定的結構存放,從而便于用戶在需要的時候進行存取[5];視圖是“用戶視圖”的簡稱,是顯示模型中數據的用戶界面,它由特定的語言繪制完成,從而使得模型中的數據按照用戶的意愿進行組織、呈現[6];控制器是“模型-視圖顯示控制器”的簡稱,更加精細化地控制著模型中的數據在視圖中的顯示方式,當模型中的數據發生變化時,控制器會主動向視圖反饋變化的模型數據,從而保證了視圖中顯示的數據和模型中的數據保持同步[7-8]。
本系統應用程序基于MVC模式實現:模型由Qt/C++語言實現,保證了底層數據模型的跨平臺特性;視圖由QML(Qt元語言)實現,保證了前端設計的簡潔性、跨平臺性及與后臺Qt/C++銜接的緊密性;控制器由QML實現,保證了與模型、視圖銜接的緊密性,進而使得整個應用程序的邏輯架構清晰、完整、嚴謹。當用戶向底層數據模型發送提取數據請求時,QML實現的視圖將該請求轉換為信號,并且由QML實現的控制器發送到Qt/C++實現的底層數據模型,底層數據模型向控制器反饋數據,并且通過槽機制將數據發送到視圖,由控制器完成在視圖上的細節顯示工作。
計算機軟件架構方面采用全新的QML/Qt.C++架構方案。
QML即Qt meta language(Qt元語言),是一種全新的界面設計技術,于2011年由Digia公司提出。它將常見的圖元(部件,圖片,窗口,動畫等)做了簡易的封裝,使得用戶可以靈活地組合這些圖元,從而達到想要的界面效果[9]。
Qt是一種跨平臺的類庫,封裝了諸如數據庫等數據處理和前端顯示的函數,QML相比于Qt前端的進步之處在于它的語法設計更加簡潔直觀,使得跨平臺的界面設計可以更加靈活,并且和Qt/C++后端技術銜接緊密[10]。
C++是一種跨平臺語言,可用于后臺的數據處理工作,并且可用于基于C++語言實現的Qt庫的混合程序設計工作,而QML又是在Qt的基礎上發展出來的前端技術,所以基于QML/Qt.C++技術的前后端架構方案有實現的可行性。
QML/Qt.C++架構相較于傳統的軟件架構方案的技術對比見圖1。

圖1 軟件架構方案技術對比
前端(QML)優勢:
QML的語法實現可以理解為HTML+CSS+JS的精簡版,相比于傳統的HTML+CSS+JS的前端技術:
(1)QML去除了繁瑣的CSS樣式表操作,將HTML和JS的語法濃縮,使前端設計的語法更清晰,使用更簡潔。
(2)QML在桌面端的界面設計效果要明顯優于HTML+CSS+JS。
相比于Qt的前端的進步之處在于:QML是專業的前端描述語言,語法更加簡潔直觀,使得跨平臺的界面設計更加靈活、高效[11]。
相比于MFC前端的進步之處在于:當用戶使用QML時,不用像使用MFC一樣,記憶繁瑣的標識符,語法更加簡潔、高效,并且跨平臺特性良好[12]。
后臺(Qt/C++/MYSQL)優勢:
在php/java/.net/SQL SERVER/MYSQL的后臺架構技術實現中,java跨平臺需要虛擬機的支撐,系統的開銷會增大,而.net是微軟公司開發的程序設計語言,只能在Windows平臺下運行。Qt/C++/MYSQL設計的后臺方案可以運行在Windows,Linux,Android,OS X平臺上,應用領域更加廣泛。
前端與后臺(信號/槽的變種)連接的優勢:
QML是在Qt之上發展出來的一門前端描述語言,它繼承了Qt中的信號/槽通信機制的原理,語法實現上要異于信號/槽,所以稱這種通信機制為信號/槽的變種。
相比于通用的軟件架構技術1和3的通信機制(消息),文中的通信機制(信號/槽的變種)更加簡潔高效。
相比于通用的軟件架構技術2,文中的前端(QML實現)和后臺(Qt/C++/SQL SERVER/MYSQL實現)實現了完全的代碼層面的分離,降低了前后端的耦合度,使得軟件體系架構邏輯更加清晰,可維護性和可擴展性更強的同時,延續了軟件架構技術2的跨平臺優勢和便利的信號/槽通信機制。
系統由客戶端主機、數據庫服務器、網絡連接線部分組成,分別負責用戶界面的呈現工作、數據的存儲工作、物品柜中物品狀態的顯示工作、數據的傳輸工作。架構方案拓撲見圖2。

圖2 系統模型結構
系統主要由NFC硬件讀卡器部分和上位機管理軟件兩部分組成。NFC讀寫器通過以太網將數據信息匯總到數據庫服務器,客戶端從數據庫服務器提取信息向上位機顯示。上位機軟件基于QML/Qt.C++架構方案和MVC設計模式設計和實現,系統軟件架構見圖3。

圖3 系統軟件架構
圖中,用戶發送請求(如點擊鼠標等輸入操作),該請求在視圖層被接收,之后由QML轉換為對應的信號,該信號通知控制層,指引控制層從Qt或C++語言實現的數據模型中提取數據(該數據由上位機軟件的網絡端口使用TCP協議,從NFC讀寫器硬件采集),該數據依托控制器,通過槽機制,被發送到視圖層,從而完成用戶所請求的數據的顯示工作。其中,視圖層的架構方案見圖4。

圖4 視圖層架構
圖中,QML主窗口在應用程序啟動時被加載,主窗口的實現代碼中定義了N個子窗口加載器,分別映射到子窗口的啟動圖標上。當用戶點擊某子窗口的啟動圖標時,子窗口加載器加載對應的子窗口描述代碼,啟動子窗口運行。其中,每個子窗口分別屬于幾個獨立的線程,子窗口之間通過信號/槽機制的變種進行數據交互。這種窗體加載方式使得前端界面設計的模塊性和可擴展性更強。
類的對象需要在進入應用程序大循環之前注冊為QML前端環境的上下文屬性,以便該對象在QML環境中被發現和使用。
(1)模型層設計。
模型層由Qt/C++語言設計完成,模型層分為數據庫模型、樹模型、網格模型、線性模型和用戶自定義模型五種。
(2)控制層設計。
控制層由QML設計完成,負責模型層數據向視圖層的顯示控制工作。用于控制前端報表中的小方格的顯示方式的控制層示例代碼如下:
//設置物件代理(表格中的每個小方格)
itemDelegate: Item{
focus: true;
id:itemDelegate;
Text {
id:text;
anchors.centerIn:parent;
color: "#6b6868"
//使用默認的文本省略方式
elide:styleData.elideMode;
text:styleData.value;
font.family: "微軟雅黑";
}
}
(3)視圖層設計。
視圖層由QML設計完成,分為報表前端、樹前端、網格前端、線性前端、用戶自定義前端五種,這五種顯示方式和模型層的五種模型相對應,形成了特定的五種顯示方式。其中,模型和視圖匹配的關鍵因素是role即角色屬性的對應。例如,用戶想要提取數據庫中姓名和性別兩個字段的值并顯示到前端。在QML實現的視圖報表中,需要指明角色值,即想要提取的字段名稱,并且該字段名稱必須和數據庫中的字段名稱完全吻合。視圖報表的示例代碼如下:
//視圖報表從數據庫中提取“姓名”,“性別”數據項
TableViewColumn {
id: name;
role: "姓名";
title: "姓名";
}
TableViewColumn {
id: sex;
role: "性別";
title: "性別";
}
NFC方面,數據交換格式采用NDEF規范:NDEF定義了NFC設備之間以及設備與標簽之間傳輸數據的一種消息封裝格式。設備之間傳輸的信息可以封裝成一個NDEF消息,每個消息可以由多個NDEF記錄構成[13-14]。
NFC采用主動和被動兩種讀取模式,發展了三種功能模式[15]:讀卡器模式(被動模式)、卡片模擬模式(被動模式)、點對點通信模式(主動模式)。文中采用的是被動模式的讀卡器功能模式。
系統的軟件界面可以達到藝術級的效果,監控界面分為主界面、物品位界面、物品信息數據庫顯示界面等。應用程序的界面整體運行效果見圖5。

圖5 應用程序的運行界面
NFC數據速率見表1。

表1 NFC數據傳輸速率
表1中,使用ISO 15693協議的最高傳輸速率可以達到52.97 kb/s,使用ISO 14443協議的最高傳輸速率可以達到848 kb/s,滿足對于少量字符串數據的實時傳輸需求。
針對高效管理大規模NFC讀寫器的需求,設計實現了基于MVC設計模式和QML/Qt.C++軟件架構方案的NFC讀寫器管理系統。其中,MVC設計模式降低了應用程序中各模塊的耦合度,使得應用程序的架構邏輯清晰。QML/Qt.C++軟件架構方案使得應用程
序前端設計更加簡潔高效,模塊性更強。
[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] 李衛華,傅曉東.可拓創新軟件體系結構研究[J].廣東工業大學學報,2016,33(2):1-4.
[3] 劉 暢,伍 星,遲毅林,等.設備在線監測系統的軟件架構研究[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的高校科研成果管理系統的設計與實現[J].計算機技術與發展,2011,21(10):161-163.
[6] LI J M,MA G S,FENG 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的敏捷衛星工作模式仿真技術研究[J].系統仿真學報,2017,29(3):537-545.
[8] 于湛麟,李仲秋,任永昌.SSH框架實現MVC架構的電子商務軟件平臺[J].計算機技術與發展,2012,22(10):169-172.
[9] 安曉輝.Qt quick核心編程[M].北京:電子工業出版社,2015.
[10] 陸文周.Qt5開發及實例[M].第2版.北京:電子工業出版社,2015.
[11] 安曉輝.Qt on Android核心編程[M].北京:電子工業出版社,2015.
[12] 尼俊紅,張 麗,張 淼,等.基于Ajax和MVC的電力通信告警系統的設計實現[J].計算機應用與軟件,2013,30(8):226-227.
[13] 蘇 婕,王 忠.基于NFC技術的巡更巡檢管理系統的設計與實現[J].計算機工程與設計,2015,36(4):1068-1072.
[14] 蔣 華,孫 強.近距離無線通信技術標準解析[J].信息技術與標準化,2006(5):26-30.
[15] 徐 磊,周 喜,馬玉鵬,等.一種基于NFC手機的RFID中間件的設計與實現[J].計算機與現代化,2014(9):90-94.