射頻識別(RFID)中間件位于RFID閱讀器與上層服務(wù)器應(yīng)用層之間,具有屏蔽底層設(shè)備、標(biāo)簽數(shù)據(jù)清洗、數(shù)據(jù)交互等功能。目前,國內(nèi)外許多企業(yè)以及機(jī)構(gòu)也都致力于RFID 中間件的研究,如:IBM、Microsoft、清華同方等都有自己的RFID 中間件產(chǎn)品。 這些產(chǎn)品大多部署在服務(wù)器端,如果短時間內(nèi)產(chǎn)生了海量RFID 數(shù)據(jù),大量原始數(shù)據(jù)都將集中在服務(wù)器端,對中間件的數(shù)據(jù)處理能力是很大的考驗(yàn)。同時,海量數(shù)據(jù)的傳輸會占用網(wǎng)絡(luò)帶寬,如果網(wǎng)絡(luò)出現(xiàn)故障,有可能會造成數(shù)據(jù)的丟失。隨著大數(shù)據(jù)時代的到來,傳統(tǒng)RFID 中間件的瓶頸逐漸暴露,直接影響系統(tǒng)的整體性能。因此,在面對海量RFID原始數(shù)據(jù)的情況下,如何減小服務(wù)器端處理壓力,降低系統(tǒng)對網(wǎng)絡(luò)的依賴性成為RFID 中間件急需解決的問題。本文就一種基于 NFC手機(jī)的RFID中間件進(jìn)行研究與實(shí)現(xiàn),將RFID 中間件技術(shù)與移動互聯(lián)網(wǎng)相結(jié)合,彌補(bǔ)了傳統(tǒng)RFID 中間件的不足之處,并且符合當(dāng)前發(fā)展趨勢。
1 中間件設(shè)計方案
1.1 系統(tǒng)架構(gòu)
根據(jù)RFID 中間件功能需求以及移動設(shè)備資源有限等特點(diǎn),提出了如圖1 所示的系統(tǒng)架構(gòu)。

圖1 系統(tǒng)總體架構(gòu)圖
1)設(shè)備管理模塊主要包含 4 個部分,NFC讀卡部分負(fù)責(zé)調(diào)用手機(jī)自帶 NFC模塊進(jìn)行讀取標(biāo)簽信息;外接閱讀器管理部分兼容外接閱讀器驅(qū)動,并通過藍(lán)牙、WiFi、3G網(wǎng)絡(luò)等與之進(jìn)行數(shù)據(jù)交互;工作日志管理部分主要對手機(jī)及中間件的工作日志進(jìn)行管理;手機(jī)狀態(tài)查詢部分能夠?qū)崟r地對手機(jī)電量、剩余存儲空間、信號等狀態(tài)進(jìn)行查詢。
2)數(shù)據(jù)處理模塊主要包含5 個部分,協(xié)議校驗(yàn)部分負(fù)責(zé)對RFID 標(biāo)簽數(shù)據(jù)根據(jù)標(biāo)識位進(jìn)行初步校驗(yàn),去除殘缺的或者非本系統(tǒng)數(shù)據(jù);標(biāo)簽緩存部分采用BlockingQueue 隊列作為緩存將初步校驗(yàn)后的數(shù)據(jù)存儲;冗余數(shù)據(jù)處理部分采用自適應(yīng)的臨近排序算法(Sorted Neighborhood Method,SNM)去除冗余數(shù)據(jù);數(shù)據(jù)校驗(yàn)部分采用 CRC16 算法對標(biāo)簽數(shù)據(jù)中的校驗(yàn)源數(shù)據(jù)進(jìn)行校驗(yàn),以此驗(yàn)證標(biāo)簽數(shù)據(jù)是否被篡改過;數(shù)據(jù)分類部分根據(jù)約定的數(shù)據(jù)規(guī)則將數(shù)據(jù)進(jìn)行分類。
3)數(shù)據(jù)庫模塊采用 SQLite 嵌入式數(shù)據(jù)庫存儲處理好的數(shù)據(jù)。
4)數(shù)據(jù)交互模塊采用Quartz框架結(jié)合Socket編程實(shí)現(xiàn)中間件與服務(wù)器之間的數(shù)據(jù)交互。
5)任務(wù)管理模塊負(fù)責(zé)將服務(wù)器端發(fā)送來的命令文件進(jìn)行緩存與管理。
1.2 系統(tǒng)設(shè)計重點(diǎn)
1.2.1 設(shè)備管理模塊
該模塊主要為對硬件設(shè)備的管理與監(jiān)控,集成NFC以及外接讀卡器驅(qū)動,并且能夠?qū)ο到y(tǒng)工作日志以及手機(jī)狀態(tài)進(jìn)行查詢。
系統(tǒng)主要采用 NFC模塊對RFID 卡片進(jìn)行讀寫,集成多種NFC標(biāo)準(zhǔn),可自動判別卡片類型,相關(guān)代碼如下所示:
mTechLists =new String[][]{new String[]{MifareClassic.class.getName()},
new String[]{MifareUltralight.class.getName()},
new String[]{NdefFormatable.class.getName()},
new String[]{Ndef.class.getName()},
new String[]{IsoDep.class.getName()},
new String[]{NfcV.class.getName()},
new String[]{NfcF.class.getName()},
new String[]{NfcB.class.getName()},
new String[]{NfcA.class.getName()}};
為了使系統(tǒng)有良好的可擴(kuò)展性,中間件兼容多種讀卡器驅(qū)動,通過藍(lán)牙、WiFi、3G 網(wǎng)絡(luò)等與外接讀卡器進(jìn)行數(shù)據(jù)傳輸。
此外,提供良好的接口,可對中間件工作日志以及手機(jī)電量、信號強(qiáng)度、剩余存儲空間等信息進(jìn)行實(shí)時查詢與管理。
1.2.2 數(shù)據(jù)處理模塊
1)數(shù)據(jù)緩存、校驗(yàn)及冗余數(shù)據(jù)處理。
系統(tǒng)采用BlockingQueue 隊列作為緩存來存儲短時間內(nèi)接收的大量數(shù)據(jù)。 將接收的卡片數(shù)據(jù)進(jìn)行初步校驗(yàn),去除殘缺或者非本系統(tǒng)數(shù)據(jù)。
表1 為標(biāo)簽數(shù)據(jù)格式,其中UID 為每個標(biāo)簽唯一標(biāo)識,校驗(yàn)數(shù)據(jù)中前7 位是用于生成校驗(yàn)碼的原始數(shù)據(jù),第8 位為本系統(tǒng)標(biāo)簽標(biāo)識,且對每個標(biāo)簽的前7位校驗(yàn)數(shù)據(jù)采用 CRC16 算法生成校驗(yàn)碼,與標(biāo)簽UID 一起由服務(wù)器通過JSON 文件寫入到手機(jī)端數(shù)據(jù)庫中。 當(dāng)讀取到標(biāo)簽數(shù)據(jù)后,中間件首先根據(jù)校驗(yàn)源數(shù)據(jù)中第8 位標(biāo)識符來判斷該卡片是否為本系統(tǒng)所屬,然后采用相同的 CRC16 算法對前7 位校驗(yàn)數(shù)據(jù)生成校驗(yàn)碼,并根據(jù)標(biāo)簽 UID 與數(shù)據(jù)庫中的校驗(yàn)碼相比較,以此來判斷標(biāo)簽數(shù)據(jù)是否被改寫。 8 位校驗(yàn)源數(shù)據(jù)在校驗(yàn)完成后需去掉,只將有用數(shù)據(jù)存儲。