韓少男
摘要:針對計算機(jī)物聯(lián)網(wǎng)專業(yè)RFID應(yīng)用開發(fā)課程實驗內(nèi)容涉及大篇幅電子技術(shù)、多數(shù)實驗設(shè)備僅能提供驗證性實驗的現(xiàn)狀,本文提出了一種RFID實踐教學(xué)的簡易開發(fā)框架用于指導(dǎo)學(xué)生進(jìn)行系統(tǒng)開發(fā)及課程設(shè)計,詳細(xì)介紹了開發(fā)框架的實現(xiàn)及使用方法,并討論了針對計算機(jī)專業(yè)學(xué)生設(shè)計RFID實踐教學(xué)項目的思路。
關(guān)鍵詞:RFID應(yīng)用開發(fā);Arduino;實踐教學(xué)
中圖分類號:G642 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)27-0094-03
射頻識別技術(shù)是計算機(jī)科學(xué)物聯(lián)網(wǎng)專業(yè)的核心課程之一,教學(xué)內(nèi)容深入、細(xì)節(jié)具體,往往需要兩門以上的配套課程才能使學(xué)生掌握。而在課程的實驗及課程設(shè)計部分,相當(dāng)?shù)钠婕半娮訉W(xué)科的內(nèi)容,使得沒有前置知識的學(xué)生難以把握,加之市場上提供的RFID相關(guān)的實驗設(shè)備都比較封閉,大多僅能完成驗證性實驗,學(xué)生無法順利開展課程項目設(shè)計[1-2]。
為了滿足實踐教學(xué),我們使用Arduino UNO作為開發(fā)平臺、MFRC522作為閱讀器,一個雙軸按鍵搖桿JoyStick作為用戶交互控制,實現(xiàn)了一套用于進(jìn)行RFID應(yīng)用開發(fā)課程設(shè)計的框架,以資源庫的形式提供給學(xué)生,并在其上完成了一個校園一卡通系統(tǒng)業(yè)務(wù)的代碼例程,用于支撐、指導(dǎo)學(xué)生完成課程項目開發(fā),例如公交卡系統(tǒng)、門禁系統(tǒng)等。這套硬件平臺及庫資源可以以一門單獨實驗課程開設(shè),約48~54學(xué)時,或以應(yīng)用技術(shù)課程的綜合實驗出現(xiàn)??蚣艿娜吭创a及配套的實驗指導(dǎo)、文獻(xiàn)都分享至GitHub:https://github.com/sketchpink/RFID.git。
1 設(shè)計思路
1.1 設(shè)計原則
本課程項目開發(fā)框架必須具有較強(qiáng)的復(fù)用性以滿足不同的RFID應(yīng)用場景。它應(yīng)該可以滿足典型的校園一卡通系統(tǒng)、公交卡系統(tǒng)、地鐵計費卡系統(tǒng)、門禁系統(tǒng)等不同場景的需要。所以,要求系統(tǒng)中的各個模塊具有清晰的接口,以及簡明易用的整合方法以提高整個框架的復(fù)用性。
開發(fā)框架必須較少的引入其他商業(yè)設(shè)施,以方便教學(xué)。我們在希望構(gòu)建應(yīng)用系統(tǒng)時盡量少的引入其他商業(yè)化的軟硬件,設(shè)計一個RFID應(yīng)用系統(tǒng)“最小集”,從而將教學(xué)核心放在RFID技術(shù)本身。所以,開發(fā)框架中的控制主機(jī)的功能,例如數(shù)據(jù)存儲,僅考慮在Arduino UNO的1K 大小的EEPROM上實現(xiàn),同時,用戶控制也僅考慮使用JoyStick搖桿的四個方向作為輸入,從而完全脫離對開發(fā)端PC機(jī)上其他軟硬件的依賴。也就是說,我們希望應(yīng)用系統(tǒng)可以在接通5V電源的情況下即開始正常工作,PC機(jī)僅僅起到一個串口監(jiān)視器的作用。
1.2 課程開發(fā)環(huán)境
Arduino官方提供的IDE環(huán)境僅僅由最基本的文本編輯器、編譯器及燒錄器構(gòu)成。相較較為流行的IDE環(huán)境中所提供的代碼高亮、代碼自動補(bǔ)全以及重要的Debug工具等,Arduino IDE對于用戶可謂并不友好。為了方便學(xué)生使用,我們設(shè)計在課程中采用學(xué)生熟悉的Visual Studio 2015并配合Visual Micro Arduino Plugin插件來完成課程設(shè)計的開發(fā)。
1.3 硬件開發(fā)平臺
采用Arduino作為開發(fā)平臺是考慮到計算機(jī)專業(yè)學(xué)生沒有單片機(jī)等前置知識。Arduino作為一款非專業(yè)開發(fā)板,簡化了嵌入式開發(fā)的準(zhǔn)備工作,對于不熟悉電子的計算機(jī)專業(yè)學(xué)生非常友好。MFRC522閱讀器通過SPI接口接入Arduino,選取這一款13.56MHz 的閱讀器通過是考慮到ISO 14443高頻協(xié)議是目前市場RFID應(yīng)用場景最多的技術(shù),便于學(xué)生利用身邊常見的情景完成自己的項目設(shè)計。
2 功能定義
本課程項目開發(fā)框架所提供的功能可以分為四個部分:對ISO/IEC 14443協(xié)議的實現(xiàn)、對卡片的管理、對數(shù)據(jù)的管理、對用戶交互控制支持,如表1所示。
3 框架實現(xiàn)
框架以C/C++作為開發(fā)語言,我們實現(xiàn)了以下類來描述并實現(xiàn)功能定義,如圖1所示。DATA類描述了數(shù)據(jù)在Arduino EEPROM的存儲方式,STORAGE類則負(fù)責(zé)對數(shù)據(jù)的所有存取改查操作;OPTION類完成了用戶通過JoyStick完成菜單選取的功能,另一方面,CreateUI類負(fù)責(zé)格式化輸出開發(fā)者自定義的菜單;MONEY類負(fù)責(zé)完成輸入金額的字符串到數(shù)值之間的轉(zhuǎn)換。在MFRC522上對ISO/IEC 14443協(xié)議的實現(xiàn)由RFID類完成,這個類引用自GitHub上的一個開源項目①。BUSINESS類及UI類則是針對校園一卡通這項應(yīng)用場景所編寫的業(yè)務(wù)類,它作為例程提供給學(xué)生使用框架的方法。學(xué)生可以通過這些類所組成的開發(fā)框架,自行修改、編寫B(tài)USINESS類來實現(xiàn)自己的RFID應(yīng)用系統(tǒng),或者也可以考慮以繼承的方式獲取BUSINESS中的卡片管理功能。所有的類定義及類實現(xiàn)文件都需要導(dǎo)入到$( Arduino)\libraries\RFID下才能被工程正常編譯。
3.1 數(shù)據(jù)管理功能的實現(xiàn)
3.1.1 數(shù)據(jù)的存儲位置
首先要確定不同數(shù)據(jù)的存儲位置。對于一些初始化狀態(tài)的信息,例如卡片基本信息,發(fā)卡單位,卡片狀態(tài)等等,將其保存在系統(tǒng)中,構(gòu)成一條卡片記錄,而金額數(shù)據(jù)一般的做法是僅保存在卡片上,由加密系統(tǒng)保證這一金額不被隨意改動。同時,考慮如何在卡片與系統(tǒng)之間建立綁定關(guān)系,我們讓每一條記錄都維護(hù)一個卡號字段,以表示當(dāng)前記錄所對應(yīng)的卡片。同時,為了方便卡片在系統(tǒng)的中的標(biāo)識及查詢,我們額外創(chuàng)建一個索引字段,同時存放于系統(tǒng)與卡片之中,確定卡片歸屬于本系統(tǒng)管理。
為了盡可能不使用其他的數(shù)據(jù)庫技術(shù)的情況下,我們采用Arduino UNO自身的一塊EEPROM作為數(shù)據(jù)存儲區(qū)域,它的大小為1KB,我們使用其一半的空間512B用于卡片記錄的存儲,另一半的空間留給開發(fā)者自行使用。EEPROM空間被劃分為塊為單位進(jìn)行讀寫,每一塊的大小為1字節(jié),塊號從0開始編址,即塊0,塊1,…,塊511。Arduino為程序員提供了一個名為EEPROM的庫來完成讀寫操作,它通過塊號進(jìn)行訪問,這個庫被定義在Arduino Library的EEPROM.h中。
3.1.2 記錄塊的結(jié)構(gòu)設(shè)計
利用EEPROM保存卡片記錄,記錄塊結(jié)構(gòu)表如表2所示。這個結(jié)構(gòu)由DATA類實現(xiàn),并將這些字段設(shè)置為公有暴露給外部函數(shù)使用。
其中,設(shè)計index字段是這樣考慮的:首先,index字段用于記錄的索引,雖然卡號也具有唯一性,但是如果利用5字節(jié)的卡號進(jìn)行索引,效率較為低下;第二,index字段同時兼具記錄有效性標(biāo)識的作用,我們要求index編號一定是一個大于0的整數(shù),表示“第XX條記錄”,一旦index值為0,則表示此條記錄已經(jīng)從系統(tǒng)中刪去,所以在清除記錄時,我們可以通過將該記錄的index置為0來完成。所有的記錄塊以圖2所示的方式排列在EEPROM中。
3.1.3 記錄的存儲管理
記錄存儲管理通過STORAGE類實現(xiàn),它通過index完成對記錄的新增、查詢、修改,并且能夠以塊為單位管理EEPROM存儲區(qū)。類中設(shè)置了一個用戶查找EEPROM存儲區(qū)的指針ptr,并設(shè)置了一個對DATA類實例的引用,用于操作來自閱讀器的卡號、金額等數(shù)據(jù)。
3.1.4 數(shù)據(jù)存儲結(jié)構(gòu)的使用
DATA實現(xiàn)為一個結(jié)構(gòu),這樣設(shè)計是為了便于RFID類相關(guān)操作函數(shù)直接使用,可以將DATA看做連接卡片數(shù)據(jù)與系統(tǒng)數(shù)據(jù)的橋梁。當(dāng)有數(shù)據(jù)從卡片發(fā)到系統(tǒng),一個Data對象將從RFID的對象接收這些數(shù)據(jù),隨后系統(tǒng)使用STORAGE類來對這個Data對象進(jìn)行數(shù)據(jù)存儲的相關(guān)操作。
3.2 用戶交互控制的實現(xiàn)
本系統(tǒng)選取了一款常見的雙軸按鍵搖桿JoyStick用于用戶與系統(tǒng)的交互控制。我們設(shè)計讓學(xué)生只允許構(gòu)建這樣的菜單:每一級菜單具有4中選項,分別對應(yīng)up、down、left、right。當(dāng)搖桿推向某一方向時,菜單被選中,執(zhí)行相應(yīng)功能或進(jìn)入下一級菜單。例如,在框架提供的例程中,我們總是將down選項定義為“返回上一級菜單”功能。
我們實現(xiàn)OPTION類來完成JoyStick的用戶輸入。這里需要注意多級菜單的情況:多級菜單下,在推動的過程Arduino將檢測到連續(xù)變化的模擬信號,會造成同一方向連續(xù)多次輸入,所以業(yè)務(wù)邏輯要保證有彈回檢測機(jī)制。
3.3 菜單的設(shè)計與實現(xiàn)
系統(tǒng)通過串口監(jiān)視器向用戶輸出菜單與控制信息。我們提供了一個CreateUI類來規(guī)范菜單的樣式,包括菜單上方及下方由連續(xù)若干個“*”構(gòu)成的裝飾行。這樣做一方面是簡化開發(fā),生成統(tǒng)一美觀的菜單,更重要的是,由于Arduino UNO的運(yùn)行內(nèi)存很小,如果所創(chuàng)建的界面包含若干級菜單,那么大量重復(fù)的符號常量將使程序的全局靜態(tài)區(qū)占用過多的運(yùn)行內(nèi)存,造成運(yùn)行時棧區(qū)空間不足,這將導(dǎo)致運(yùn)行的不穩(wěn)定甚至是錯誤。
3.4 金額處理
金額處理的主要工作時將用戶通過串口輸入字符轉(zhuǎn)換為數(shù)值、將數(shù)值轉(zhuǎn)換為字節(jié)流、緩沖區(qū)處理等功能,由MONEY類實現(xiàn)。
4 項目例程
為了指導(dǎo)學(xué)生正確使用課程開發(fā)框架,我們構(gòu)建了一個校園一卡通系統(tǒng)例程,包括BUSINESS類、對應(yīng)的UI菜單類以及相應(yīng)的工程文件。
BUSINESS類實現(xiàn)了開卡管理、注銷管理、查詢、充值、消費等功能,并且實現(xiàn)了一個UI類來輸出操作菜單。這一例程是利用框架完成的,學(xué)生可以通過這一例程了解開發(fā)框架的使用方式。它可以作為實踐課程的引例為學(xué)生展示框架的功能,啟發(fā)學(xué)生自行設(shè)計自己的RFID應(yīng)用系統(tǒng)。
5 結(jié)束語
本文以構(gòu)建RFID應(yīng)用系統(tǒng)“最小集”的方式提供了一個課程設(shè)計開發(fā)框架。框架被設(shè)計為現(xiàn)在這樣的形式出于多方面的考慮。第一是利用Arduino UNO作為開發(fā)平臺保證了對嵌入式、單片機(jī)知識的簡化;第二是盡可能少的引入例如數(shù)據(jù)庫等商業(yè)化軟件,使課程內(nèi)容集中在RFID技術(shù)應(yīng)用這一話題上;第三,框架將實現(xiàn)ISO 14443協(xié)議下閱讀器讀寫機(jī)制的RFID類暴露給學(xué)生直接使用(而不是將其設(shè)計在看不到的底層),這區(qū)別于市場上封裝的閉源的實驗設(shè)備,可以幫助學(xué)生熟悉、掌握RFID協(xié)議流程及機(jī)制,最終達(dá)到理解技術(shù)原理,掌握實踐應(yīng)用的教學(xué)目標(biāo)。
注釋:本文所引用GitHub RFID開源項目可以從 https://github.com/miguelbalboa/rfid.git獲得。
參考文獻(xiàn):
[1] 吳功宜.對物聯(lián)網(wǎng)工程專業(yè)教學(xué)體系建設(shè)的思考[J].計算機(jī)教育,2010(21):26-29.
[2] 曹國平.應(yīng)用型本科物聯(lián)網(wǎng)專業(yè) RFID 課程實踐教學(xué)研究[J].計算機(jī)教育,2015(10):100-102.