1 引言
射頻識別(Radio Frequency Identification, RFID)中間件介于RFID 閱讀器和上層應用之間,用來屏蔽不同型號的閱讀器和各種協議標準的標簽,為上層應用軟件提供統一接口。另外,還負責整合和過濾數據,產生報表,減少應用層軟件的處理負擔,使海量標簽數據的傳輸和應用成為可能。目前,國內外的RFID 中間件體積龐大,只適用于PC 機,不能移植到嵌入式閱讀器中。本文提出一種可直接運行于各種嵌入式閱讀器設備,基于EPCglobal ALE 標準的嵌入式 RFID 中間件,并詳細研究其中的標簽數據處理流程。
2 軟件體系結構
嵌入式 RFID 中間件體系結構如圖1 所示。采用Linux 2.4.18 作為操作系統,操作系統自帶有網絡驅動和串口驅動。DSP 驅動是為本閱讀器DSP 模塊開發的驅動模塊,相當于一個連接到中間件服務器的閱讀器。中間層是GoAhead Web 服務器和嵌入式數據庫SQLite,上層是閱讀器管理,閱讀器協議服務和ALE 服務模塊。
圖 1 軟件體系結構
GoAhead Web 服務器是一款面向嵌入式系統的Web 服務器,作為中間件的數據轉發和模塊承載平臺。閱讀器與客戶端之間,閱讀器與閱讀器之間的數據通信都是由GoAhead Web服務器完成。ALE 服務模塊,數據庫管理模塊,閱讀器管理模塊,閱讀器協議服務模塊等的開發也是建立在GoAhead 基礎上。
數據庫采用 SQLite 3.3.9。SQLite 是輕型,免費和開源的嵌入式數據庫。提供絕大多數標準的SQL92 語句,工作速度快,滿足中間件數據處理的實時要求。在嵌人式系統中,數據庫管理、執行、維護的簡單化比企業數據庫提供的復雜應用更重要。因此選用SQLite數據庫在大小和功能方面是一個理想的折中。
ALE 協議服務模塊是過濾和統計數據的基層部件與高層應用程序之間的接口。ALE 協議服務模塊采用EPCglobal ALE 標準,為高層軟件提供了通用接口。
3 標簽數據處理流程
SQLite 的應用開發是在GoAhead 基礎上對數據進行接收、過濾和分組處理。客戶端將用戶填寫的XML 表單通過HTTP 協議發送到GoAhead 服務器端。GoAhead 進程中的主線程接收XML文件,將文件內容通過命令消息通道傳給ALE子進程。ALE子進程通過ezXML模塊把XML 文件解析出來,提取出數據存入ECSpec 結構體中。
DSP 解調出二進制EPC 數據,通過DSP 驅動發送到接收模塊。接收模塊濾除重復EPC碼,屏蔽閱讀器數據格式差異,轉換成統一數據格式后將數據送入到SQLite 中,作為數據庫操作的數據源。每個 ECSpec 對應創建一個線程。該線程根據ECSpec 結構體執行數據庫操作,將查詢結果封裝成XML 數據報表通過數據消息通道發送給XML 報告線程。XML 報告線程通過TCP 協議發送給客戶端。數據流程圖如圖2 所示。下面以EPC 標簽數據的流動方向進行詳細分析。
圖2 標簽數據處理流程
3.1 EPC 標簽數據格式
EPC(Electronic Product Code)是本世紀初由美國麻省理工學院(MIT)的AUTO-ID 中心提出的編碼方式。EPC 數據標準1.3 版本[5]中,EPC 由代表版本號的頭部、過濾字段、制造商、物品種類以及物品序列號組成。是唯一存儲在RFID 標簽中的信息。AUTO-ID 中心將全球接受的EAN/UCC 編碼整合到新的EPC 中,共8 種格式:GID,SGTIN,SSCC,GLN,GRAI,GIAI,GDTI 和GSRN。后兩種是數據標準1.4 版本新增加的。為了在應用軟件中更好地表示EPC 碼以及方便用戶閱讀和查詢,AUTO-ID 中心定義另一種表示方式:統一資源標識符(Uniform. Resource Identifier,URI)。嵌入式中間件中用到的URI 格式如:urn:epc:pat:sgtin-96:0.*.*.*。“urn:epc:pat:”部分為URI 命令格式的固定內容,“sgtin-96”即由EAN/UCC 編碼轉化而來的96 位二進制SGTIN 編碼頭部分,其后四部分為具體編碼內容。
3.2 EPC 二進制數據轉化成標準URI
在數據轉化標準[6]中,EPC 有四種表示方式:二進制、URI、不帶物品序列號的純識別URI 和EAN/UCC 編碼。在中間件中需要將閱讀器發送過來的二進制EPC 編碼轉換成標準URI 形式,才能方便數據庫的分組過濾操作。方法是首先將EPC 二進制數據轉換成一個字符一位的‘0’和‘1’字符串。選出代表版本號的頭部,根據頭部查詢EPC 格式表找到這種類型標簽的分段結構,然后依據該分段結構分別提取出各個部分。例如96 位標簽數據300833B2DDD9014935050007(十六進制數表示)轉換成URI 格式為urn:epc:pat:sgtin-96:0.0867360217.005.39544225799。
3.3 標簽數據插入 SQLite 數據庫
因為用戶端的 filter 或group 命令是以URI 命令格式發送,查詢結果也是以URI 格式返回,所以在二進制EPC 碼到達數據庫時,立即轉化為URI 格式存儲到SQLite 中,方便查詢操作。tableURI 就是用來保存URI 形式標簽數據的信息表。tableURI 分成七個字段存貯URI 標簽數據:Header,Filter,Company,Class,Serial,ReaderID,Time。前五個字段都是EPC 碼URI 格式的組成部分,ReaderID 為閱讀器ID 號,表明EPC 碼來自哪個物理閱讀器。Time 為DSP 上交標簽數據的時間,是控制產生報表的邊界條件。EPC 數據轉化成標準URI 后提取各個數據段,使用sqlite3_mprintf 函數將數據段的值添加到SQL 語句中,然后通過sqlite3_exec 函數執行該SQL 語句把標簽數據插入到數據庫中。
3.4 過濾和分組標簽數據
用戶定義的 ECSpec 中包含一個或多個Report,每個Report 由一個或多個filterSpec 或groupSpec 組成,每個filterSpec 有一個或多個includePattern 和excludePattern 組成,每個groupSpec 也包含一個或多個groupPattern 命令。這些過濾和分組命令可以方便用戶選擇出所需標簽數據。因此,需要實現兩種數據庫操作:filter 和group。
3.4.1 過濾
filter 是根據所給規則對數據進行過濾篩選,找出符合過濾條件的標簽數據。整個filter命令包含若干includePattern 和若干excludePattern,結果集為包含于任何一個或多個includePattern 中但是不包含于任何一個excludePattern 中的EPC 碼。用集合形式表示為:
其中,R 為EPC 數據源集合,Ii 為EPC 集中符合第i 個includePattern 的數據集,Ei 為EPC集中的符合第i 個excludePattern 的數據集。
過濾操作的 URI 命令中可出現:確定數值/部分值[low-high]/所有值*,如:urn:epc:pat:sgtin-96:0.0867360217.[001-1000].*。查詢時直接使用SELECT 操作,對各個字段逐個判斷格式類型生成SQL 語句,將各部分生成的SQL 語句匯總到一句中即可完成過濾操作。
3.4.2 分組
group 是根據用戶所給規則對標簽數據進行分組歸類,不屬于任何group 命令條件的EPC 碼自動歸為default group 組中。分組操作的URI 命令可出現:確定數值/部分值[low-high]/所有值*/分組X(即按該字段分組,有不同的值就分組,相同值的EPC 碼分到同一組中)。如:urn:epc:pat:sgtin-96:0.0867360217.X.*。
當使用多個 groupPattern 命令時,為使EPC 碼只被歸為一個groupPattern 組中,要求URI 命令設置時,幾個groupPattern 不能有重疊區域。命令集:G = (Pat_1, Pat_2, 。.., Pat_N)。Pat_i 和 Pat_j 為命令集G 中任意兩個URI 命令。
Pat_i = urn:epc:pat:type_i:field_i_1.field_i_2.field_i_3.。.
Pat_j = urn:epc:pat:type_j:field_j_1.field_j_2.field_j_3.。.
Pat_i 和Pat_j 滿足下面任一規則時兩個URI 命令是無重疊區域的,允許使用。
(1) type_i 和type_j 為不同編碼方式;
(2) type_i 和type_j 編碼方式相同,但是字段field_i_1 和field_j_1 取值不沖突;
(3) type_i 和type_j 編碼方式相同而且前面對應k-1 個字段都是固定值且相等,但是field_i_k 和field_j_k 取值不沖突;
對應字段 field_i_k 和field_j_k 滿足下面任一規則時不沖突。
(1) field_i_k 和field_j_k 都為固定值且不相同;
(2) field_i_k 和field_j_k 一個是固定值,另一個是區間low-high,固定值不包含在區間中;
(3) field_i_k 和field_j_k 都是區間值而且沒有重疊。
groupPattern 無重疊,即可進行分組操作。分組時URI 命令明確指出頭部分,查詢時直接使用SELECT 操作。其他4 個字段,因為格式可選(確定的數值/部分值[low-high]/所有值*/分組X),所以要對各個字段逐個判斷其格式類型,對不同格式分別生成SQL 語句,將各部分生成的SQL 語句匯總到一句中。例如分組命令urn:epc:pat:sgtin-96:0.X.*.[20000-90000],最終產生SQL 操作語句為:
CREATE VIEW viewGroup AS SELECT * FROM tableURI WHERE Header=’sgtin-96’AND
Filter = 0 AND Serial BETWEEN 20000 AND 90000 GROUP BY Company。
3.5 提交數據報表
每個 EventCycle(中間件向客戶端提供報表的時間間隔,客戶端定義ECSpec 時設置)結束時根據Time 字段,選取生成視圖中當前EventCycle 的數據封裝成XML 數據報表發送給客戶端。相應操作語句為:
//time2 = 當前時間,time1 = time2 - EventCycle
sql = sqlite3_mprintf(“SELECT * FROM viewGroup WHERE Time BETWEEN %d AND %d”,
time1, time2);
3.6 刪除過期數據
為了使中間件能長期穩定工作,必須定期刪除過期數據。過期數據包括多次插入數據庫的重復URI 以及過濾和分組產生的臨時視圖。對重復產生的URI 標簽數據,只保留最新記錄。標簽數據表table URI 總記錄條數大于某個值時調用數據備份程序,將表中的數據存貯到另一個目錄下,供用戶進一步處理。EventCycle 結束時刪除相應視圖。
4 結束語
經編譯運行測試,該系統體積非常小,除去 SQLite 動態庫不足1MB。兼容不同類型閱讀器,穩定可靠,標簽數據處理速度高。客戶端使用過濾和分組命令能非常方便地訂閱所需數據。SQLite 憑借輕型,易于移植,免費開源的優點,除了可以作為RFID 中間件的數據庫,還可廣泛用于其它嵌入式領域,比如嵌入式家庭網關,POS 終端、智能手機和遠程監控系統等。
責任編輯:ct
評論