《RFID射頻識別技術》-項目05 公交管理系統(tǒng)(工單)_第1頁
《RFID射頻識別技術》-項目05 公交管理系統(tǒng)(工單)_第2頁
《RFID射頻識別技術》-項目05 公交管理系統(tǒng)(工單)_第3頁
《RFID射頻識別技術》-項目05 公交管理系統(tǒng)(工單)_第4頁
《RFID射頻識別技術》-項目05 公交管理系統(tǒng)(工單)_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

《RFID射頻識別技術》 項目五公交管理系統(tǒng)項目五公交管理系統(tǒng)任務書一、任務描述與要求任務描述使用公交卡管理系統(tǒng)軟件完成公交卡的發(fā)卡操作,要求開戶一張學生卡,初始金額為100元,并驗證其內部數(shù)據(jù)存儲的情況。了解和熟悉開發(fā)出高頻卡的讀寫功能掌握高頻卡的電子錢包的相關知識。具體要求使用高頻RFID讀寫器發(fā)布公交卡開發(fā)高頻卡的讀寫功能使用仿真軟件查找電子錢包所在的扇區(qū)和值二、任務目標知識目標了解通信系統(tǒng)的組成了解RFID天線技術的特點理解RFID信號編碼和調制技術理解RFID中二進制樹形算法的工作原理能力目標能根據(jù)所學知識熟練使用高頻讀卡器和公交管理系統(tǒng)軟件三、知識儲備1、RFID通信的物理學原理通信在不同的環(huán)境下有不同的解釋,在出現(xiàn)電波傳遞通信后通信被單一解釋為信息的傳遞,是指由一地向另一地進行信息的傳輸與交換,其目的是傳輸消息。實現(xiàn)信息傳遞所需的一切技術設備和傳輸媒質的合稱為通信系統(tǒng)。下圖所示為通信系統(tǒng)組成圖。通信系統(tǒng)組成信源:消息的發(fā)生源,其作用是把消息轉換成電信號,稱之為消息信號或基帶信號。如電話機就是信源。發(fā)送設備:將信源產(chǎn)生的消息信號變換為適合在信道中傳輸?shù)脑O備,調制是發(fā)送設備最常見的一種變換方式。信道:傳輸信號的物理媒質。噪聲源:是通信系統(tǒng)中各種對信道產(chǎn)生干擾噪聲的統(tǒng)稱。接收設備:完成發(fā)送設備的反變換,調制對應的反變換就是解碼。它的任務是把帶有干擾的接收信號中恢復出相應的原始基帶信號來。信宿:信息發(fā)送的終點。天線技術根據(jù)應用場合的各有不同,RFID標簽可能需要貼在不同類型、不同形狀的物體上,甚至需要嵌入到物體內部。此外,標簽天線和讀寫器天線還分別承擔接收能量和發(fā)射能量的作用,這些因素對天線的設計提出了嚴格要求。電子標簽和讀寫器通過各自的天線構建起兩者之間的非接觸信息傳輸通道,如圖所示。無論是射頻標簽還是讀寫器的正常工作,都離不開天線或耦合線圈:一方面,無源射頻標簽芯片要啟動電路工作,需要通過天線在讀寫器天線產(chǎn)生的電磁場中獲得足夠的能量;另一方面,天線決定了射頻標簽與讀寫器之間的通信信道和通信方式,它在射頻標簽與讀寫器實現(xiàn)數(shù)據(jù)通信過程中起到了關鍵的作用,因此,對RFID天線的研究具有重要意義。RFID讀寫器、標簽天線構成示意圖RFID天線制作技術主要有蝕刻法、線圈繞制法和印刷天線三種。其中,RFID導電油墨印刷天線是發(fā)展的一種新技術。以上RFID標簽天線的制作方法分別適用于不同頻率的RFID電子標簽產(chǎn)品。低頻LFRFID電子標簽天線基本是繞線方式制作而成,高頻HFRFID電子標簽天線利用以上三種方式均可實現(xiàn),但以蝕刻天線為主,其材料一般為鋁或銅,超高頻UHFRFID電子標簽天線則以印刷天線為主。三種技術樣式如下圖所示。線圈線圈式印刷式蝕刻法圖5-1-3RFID天線各種款式2)RFID天線的主要參數(shù)天線的基本功能就是能量轉換和定向輻射,所謂天線的電參數(shù),就是能定量表征其能量轉換和定向輻射能力的量。(1)增益系數(shù)增益系數(shù)是綜合衡量天線能量轉換和方向特性的參數(shù),它的定義為:方向系數(shù)與天線效率的乘積。天線方向系數(shù)和越高,則增益系數(shù)也就越高。(2)方向系數(shù)在離天線某一距離處,天線在最大輻射方向上的輻射功率流密度與相同輻射功率的理想無方向性天線在同一距離處的輻射功率流密度之比。這是方向性中最重要的指標,能精確比較不同天線的方向性,表示了天線集束能量的電參數(shù)。下圖所示為天線信號方向視圖。立體視圖垂直視圖水平視圖信號方向視圖(3)阻抗天線可以看做是一個諧振回路。一個諧振回路當然有其阻抗。我們對阻抗的要求就是匹配:和天線相連的電路必須有與天線一樣的阻抗。和天線相連的是饋線,饋線的阻抗是確定的,所以我們希望天線的阻抗和饋線一樣。RFIDUHF天線系統(tǒng)使用50Ω阻抗的饋線。(4)極化方式天線的極化是指天線輻射時形成的電場強度方向。一般而言,特指為該天線在最大輻射方向上的電場的空間取向。天線的極化方式主要分為線極化和圓極化。線極化當收信天線的極化方向與線極化方向一致(電場方向)時,感應出的信號最大;隨著收信天線的極化方向與線極化方向偏離越來越多時,感應出的信號越小;當收信天線的極化方向與線極化方向正交(磁場方向)時,感應出的信號為零。圓極化無論收信天線的極化方向如何,感應出的信號都是相同的,不會有什么差別。所以,采用圓極化方式,使得系統(tǒng)對天線的方位敏感性降低。因為只有收信天線的極化方向與所接收電磁波的極化方向一致才能感應出最大的信號來。所以,線極化方式對天線的方向要求較高。而圓極化方式卻因其實現(xiàn)的功能而被大多數(shù)場合采用了。(5)駐波比駐波比的含義:駐波比就是一個數(shù)值,用來表示天線和電波發(fā)射臺是否匹配.如果駐波比的值等于1,則表示發(fā)射傳輸給天線的電波沒有任何反射,全部發(fā)射出去,這是最理想的情況.如果駐波比值大于1,則表示有一部分電波被反射回來,最終變成熱量,使得饋線升溫.被反射的電波在發(fā)射臺輸出口也可產(chǎn)生相當高的電壓,有可能損壞發(fā)射臺。2、RFID信號的編碼與調制在通信系統(tǒng)中,信息在發(fā)送過程中,要進行編碼,而RFID本質上就是一種無線通信技術,所以其也需要對發(fā)送的信息進行編碼。在通信理論中,編碼是對原始信息符號按一定的數(shù)學規(guī)則所進行的變換。編碼的目的是要使信息能夠在保證一定質量的條件下盡可能迅速地傳輸至信宿。在通信中一般要解決兩個問題:一是在不失真或允許一定程度失真的條件下,如何用盡可能少的符號來傳遞信息,這是信源編碼問題;其次是在信道存在干擾的情況下,如何增加信號的抗干擾能力,同時又使信息傳輸率最大,這是信道編碼問題。1)RFID編碼RFID數(shù)據(jù)傳輸常用的編碼格式(1)反向不歸零(NRZ)編碼反向不歸零編碼用高電平表示二進制“1”,低電平表示二進制“0”,如圖所示。NRZ編碼此碼型不宜傳輸,有以下原因:有直流,一般信道難于傳輸零頻附近的頻率分量;收端判決門限與信號功率有關,不方便使用;不能直接用來提取位同步信號,因為在NRZ中不含位同步信號頻率成分;要求傳輸線有一根接地。(2)曼徹斯特(Manchester)編碼曼徹斯特編碼也被稱為分相編碼(Split-PhaseCoding)。在曼徹斯特編碼中,某位的值是由該位長度內半個位周期時電平的變化(上升/下降)來表示的,在半個位周期時的負跳變表示二進制“1”,半個位周期時的正跳變表示二進制“0″,如圖所示。曼徹斯特編碼曼徹斯特編碼在采用負載波的負載調制或者反向散射調制時,通常用于從電子標簽到讀寫器的數(shù)據(jù)傳輸,因為這有利于發(fā)現(xiàn)數(shù)據(jù)傳輸?shù)腻e誤。這是因為在位長度內,“沒有變化”的狀態(tài)是不允許的。當多個電子標簽同時發(fā)送的數(shù)據(jù)位有不同值時,接收的上升邊和下降邊互相抵消,導致在整個位長度內是不間斷的副載波信號,由于該狀態(tài)不允許,所以讀寫器利用該錯誤就可以判定碰撞發(fā)生的具體位置。ISO14443TYPEA協(xié)議中電子標簽向閱讀器傳遞數(shù)據(jù)時采用的就是曼徹斯特編碼。(3)單極性歸零(UnipolarRZ)編碼單極性歸零編碼在第一個半個位周期中的高電平表示二進制“1”,而持續(xù)整個位周期內的低電平信號表示二進制“0”,如圖所示。單極性歸零編碼可用來提取位同步信號。單極性歸零編碼(4)米勒(Miller)編碼米勒編碼在半個位周期內的任意邊沿表示二進制“1”,而經(jīng)過下一個位周期中不變的電平表示二進制“0”。位周期開始時產(chǎn)生電平交變,如圖5-1-9所示。因此,對接收器來說,位節(jié)拍比較容易重建。米勒編碼(5)差動編碼差動編碼中,每個要傳輸?shù)亩M制“1”都會引起信號電平的變化,而對于二進制“0”,信號電平保持不變,如圖7所示。用XOR門的D觸發(fā)器就能很容易地從NRZ信號中產(chǎn)生差動編碼,具體電路如圖所示。差動編碼3、M1卡數(shù)據(jù)存儲結構高頻M1卡被激活后,經(jīng)過三次密碼認證,如果匹配,則允許進一步的讀/寫操作。M1卡片的存儲容量為1024×8b字長(即1KB),采用EEPROM作為存儲介質,整個結構劃分為16個扇區(qū),編為扇區(qū)0-15。每個扇區(qū)有4個塊(block),分別為塊0、塊1、塊2和塊3。每個塊有16個字節(jié),一個扇區(qū)共有16B×4=64B(如圖所示)。M1存儲結構每個扇區(qū)的塊0、塊1、塊2為數(shù)據(jù)塊,可用于存儲數(shù)據(jù)(扇區(qū)0只有兩個數(shù)據(jù)塊和一個只讀的廠商塊),每個塊有16個字節(jié)。數(shù)據(jù)塊可以被以下的訪問控制位(accessbits)配置為讀寫塊或值塊。讀寫塊:用作一般的數(shù)據(jù)保存,可用讀/寫命令直接讀/寫整個塊,例如在食堂消費時采用輸入飯菜金額的方式扣款。值塊:用作數(shù)值塊,可以進行初始化值、加值、減值、讀值的運算,系統(tǒng)配用相應的函數(shù)完成上述功能,有效的命令包括加/減/恢復/發(fā)送命令。例如在食堂消費時對于定額套餐采用輸入餐號的方式加以扣款,以及用于公交/地鐵等行業(yè)的檢票/收費系統(tǒng)。值塊有一個固定的數(shù)據(jù)格式,可以進行錯誤檢測和糾正并備份管理。值塊只能在值塊格式的寫操作時產(chǎn)生。值塊格式如表所示。其中,值(VALUE)表示一個帶符號的4字節(jié)值,這個值的最低一個字節(jié)保存在最低的地址中,取反的字節(jié)以標準的2的補碼的格式保存。為了保證數(shù)據(jù)的正確性和保密性,值被保存了三次,兩次不取反保存,一次取反(帶下劃線者)保存。M1卡的值塊格式表字節(jié)號0123456789101112131415說明addressaddressaddressaddressVALUEVALUEVALUE地址(address)表示一個1字節(jié)的地址,當執(zhí)行強大的備份管理時用于保存存儲塊的地址,地址字節(jié)保存了4次,取反和不取反各保存兩次。在執(zhí)行加/減/恢復/傳送操作時地址保持不變,它只能通過寫命令改變。通常數(shù)據(jù)塊中的數(shù)據(jù)都是需要保密的數(shù)據(jù),例如購買公交卡時所預付的車費,智能大廈/智能小區(qū)進出時所需的控制信息,股票交易時持卡人必須對已存放在卡中的交易密碼數(shù)據(jù)(如帳戶、存款信息、持有的股票數(shù)量/品種等)進行確認后方能進行股票交易等。對這些數(shù)據(jù)的讀/寫/加值/減值均需符合該塊存取條件的要求及通過該扇區(qū)的密碼認證。每個扇區(qū)的塊3為控制塊,包括了密碼A、存取控制、密碼B。具體結構如下表所示:MIFARE1卡控制塊的數(shù)據(jù)結構表密鑰A(第0-5字節(jié),共6B)和密鑰B(第10-15字節(jié),共6B,可選),讀密鑰時返回邏輯0。存取控制位(accessbits,第6-9字節(jié),共4B):訪問這個扇區(qū)中4個塊的條件,存取控制位也可以指出數(shù)據(jù)塊的類型(讀寫或值)。密鑰A的缺省值為A0A1A2A3A4A5H,密鑰B的缺省值為B0B1B2B3B4B5H,存取控制位的缺省值為FF078069H。如果不需要密鑰B,那么塊3的最后6B可以作為數(shù)據(jù)字節(jié)。用戶數(shù)據(jù)可以使用尾塊(塊3)的第9字節(jié),這個字節(jié)具有與字節(jié)6、7和8一樣的訪問權限。每個扇區(qū)的密碼和存取控制都是獨立的,可以根據(jù)實際需要設定各自的密碼及存取控制。存取控制為4個字節(jié),共32位,扇區(qū)中的每個塊(包括數(shù)據(jù)塊和控制塊)的存取條件是由密碼和存取控制共同決定的,在存取控制中每個塊都有相應的三個控制位,定義如下表所示:卡存取控制中每個塊的三個控制位表塊0:C10C20C30塊1:C11C21C31塊2:C12C22C32塊3:C13C23C33三個控制位以正和反兩種形式存在于存取控制字節(jié)中,決定了該塊的訪問權限(如進行減值操作必須驗證KEYA,進行加值操作必須驗證KEYB)。三個控制位在存取控制(4字節(jié),其中字節(jié)9為備用字節(jié))字節(jié)中的位置如下表所示:M1卡存取控制的結構表(注:_b表示取反)其中,bit7、3區(qū)為控制塊3,bit6、2區(qū)為控制塊2,bit5、1區(qū)為控制塊1,bit4、0區(qū)為控制塊0。數(shù)據(jù)塊(塊0、塊1、塊2)的存取控制如下表所示:M1卡存取控制對數(shù)據(jù)塊的控制結構表(KeyA|B表示密碼A或密碼B,Never表示任何條件下不能實現(xiàn))例如:當塊0的存取控制位C10C20C30=100時,驗證密碼A或密碼B正確后可讀;驗證密碼B正確后可寫;不能進行加值、減值操作??刂茐K塊3的存取控制與數(shù)據(jù)塊(塊0、1、2)不同,它的存取控制如下表所示:M1卡存取控制對塊3的控制結構表例如:當塊3的存取控制位C13C23C33=100時,表示:密碼A:不可讀,驗證KEYA或KEYB正確后,可寫(更改);存取控制:驗證KEYA或KEYB正確后,可讀、可寫;密碼B:驗證KEYA或KEYB正確后,可讀、可寫。操作指南一、制定計劃序號作業(yè)項目序號作業(yè)項目15263748計劃審核審核意見:二、實施方案使用高頻RFID讀寫器發(fā)布公交卡1、任務環(huán)境準備該任務需要用到高頻RFID讀寫器和RFID高頻卡,將高頻RFID讀寫器的usb口連接至電腦usb口,如下圖示。設備連接圖2、讀取卡號步驟1:打開公交卡管理系統(tǒng)軟件,點擊發(fā)卡模塊,選擇學生卡,金額輸入100,點擊確認激活,如下圖所示。激活卡步驟2:打開高頻卡測試管理軟件,首先連接端口,確保連接成功步驟3:對要讀取的數(shù)據(jù)扇區(qū)設置讀取密碼步驟4:讀取下列表格中的數(shù)據(jù)并填入下表中,相關扇區(qū)數(shù)據(jù)扇區(qū)塊數(shù)據(jù)0012310123本次存儲的100元錢,是在扇區(qū)_________塊__________中。開發(fā)高頻卡的讀寫功能ISO14443卡數(shù)據(jù)讀寫開發(fā)1工單名稱數(shù)據(jù)讀寫開發(fā)實驗2工單描述在仿真系統(tǒng)中,運用讀寫器(ISO14443讀寫器)識別高頻卡,制作項目案例,通過虛擬串口直接設置和采集仿真系統(tǒng)中高頻卡的卡號,并在界面上驗證密鑰A和密鑰B。1.實驗連線圖與流程圖連線圖流程圖2.實驗分階演示第1步:打開配套的項目案例,界面如下。第2步:設置虛擬串口,然后開啟模擬實驗。第3步:驗證卡內的信息前,需要給卡內先錄入信息,即為制卡,依照下列步驟完成實驗2.1制卡序號操作演示結果第1步選擇串口第2步打開串口第3步制卡2.2尋卡開發(fā)制卡成功后,進入“數(shù)據(jù)讀寫開發(fā)”界面,此界面包含三個部分。上面是運行的界面,下面分別是界面代碼和邏輯代碼。第1步:請點擊界面左下角的“運行”按鈕,查看程序運行起來的結果。點擊后,代碼開始編譯,編譯完成后,顯示出界面。連接仿真系統(tǒng),操作實驗。運行結果第2步:操作完畢后,即為本實驗的運行過程,接下來學員們點擊“開始編輯代碼”按鈕,流程完成下表各步驟序號操作成功1編寫代碼□是□否實驗分析:根據(jù)自己對ISO14443_A協(xié)議一些功能的理解,然后在代碼文本框寫入提示的方法2運行□是□否實驗分析:將你所填的文本框里面的全部內容,進行保存,然后編譯保存時的文件。會彈出一個數(shù)據(jù)讀寫界面。按照對前面實驗的理解,可自行操作。若成功,彈出數(shù)據(jù)讀寫界面。3.邏輯代碼using

ISO14443Handle_Shared;

using

NLE.Experiment.Common_Shared;

using

System;

using

System.Windows.Forms;

namespace

NLE.ISO14443_11

{

public

partial

class

FormMain

:

Form

{

public

FormMain()

{

InitializeComponent();

}

private

void

FormMain_Load(object

sender,

EventArgs

e)

{

RefreshCOM();

btnTag.Enabled

=

false;

btnActive.Enabled

=

false;

btnKeyA.Enabled

=

false;

btnKeyB.Enabled

=

false;

btnRead.Enabled

=

false;

btnWrite.Enabled

=

false;

}

private

void

RefreshCOM()

{

//載入串口

String[]

PortNames

=

System.IO.Ports.SerialPort.GetPortNames();

cmbCOM.Items.Clear();

if

(PortNames.Length

>

0)

{

for

(Int32

i

=

0;

i

<

PortNames.Length;

i++)

{

if

(PortNames[i].Length

<

7)

{

cmbCOM.Items.Add(PortNames[i]);

}

}

cmbCOM.SelectedIndex

=

0;

}

else

{

cmbCOM.Text

=

"無串口";

}

}

private

void

btnOpen_Click(object

sender,

EventArgs

e)

{

try

{

if

(btnOpen.Text

==

"打開串口")

{

if

(""

==

ISO14443Handle.OpenPort(cmbCOM.Text))

{

btnOpen.Text

=

"關閉串口";

MessageBox.Show("打開串口成功");

btnTag.Enabled

=

true;

}

}

else

{

ISO14443Handle.ClosePort();

btnOpen.Text

=

"打開串口";

MessageBox.Show("關閉串口成功");

btnTag.Enabled

=

false;

btnActive.Enabled

=

false;

btnKeyA.Enabled

=

false;

btnKeyB.Enabled

=

false;

}

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

}

private

async

void

btnTag_Click(object

sender,

EventArgs

e)

{

try

{

string

tag

=

await

ISO14443Handle.ReadTagAsync();

if

(!string.IsNullOrWhiteSpace(tag))

{

txtTag.Text

=

tag;

btnActive.Enabled

=

true;

}

else

{

MessageBox.Show("讀取卡片失敗");

}

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

}

private

async

void

btnActive_Click(object

sender,

EventArgs

e)

{

try

{

string

tag

=

await

ISO14443Handle.ReadTagAsync();

if

(await

ISO14443Handle.ActiveTagAsync()

==

"")

{

btnKeyA.Enabled

=

true;

btnKeyB.Enabled

=

true;

}

else

{

MessageBox.Show("激活失敗");

}

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

}

private

async

void

btnKeyA_Click(object

sender,

EventArgs

e)

{

//塊地址的值

byte

addr

=

0;

try

{

addr

=

byte.Parse(txtAddress.Text);

}

catch

{

MessageBox.Show("你填寫的塊地址無效");

}

//密鑰A的值

byte[]

KeyAData

=

new

byte[6];

try

{

KeyAData

=

Converter.HexStrToArray(txtKeyA.Text);

}

catch

{

MessageBox.Show("你填寫的密碼A無效,請確保數(shù)據(jù)都是十六進制的");

}

if

(KeyAData.Length

!=

6)

{

MessageBox.Show("你填寫的密鑰A無效,必須是12位十六進制數(shù)據(jù)");

return;

}

//標簽號

byte[]

TagNumber

=

new

byte[4];

try

{

TagNumber

=

Converter.HexStrToArray(txtTag.Text);

}

catch

{

MessageBox.Show("卡號無效,請先尋卡");

}

if

(TagNumber.Length

!=

4)

{

MessageBox.Show("卡號無效,請先尋卡");

return;

}

//驗證A密鑰

try

{

if

(await

ISO14443Handle.VaildKeyAAsync(txtAddress.Text,

txtKeyA.Text,

txtTag.Text)

==

"")

{

MessageBox.Show("驗證A密鑰成功");

btnRead.Enabled

=

true;

btnWrite.Enabled

=

true;

}

else

{

MessageBox.Show("驗證A密鑰失敗");

}

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

}

private

async

void

btnKeyB_Click(object

sender,

EventArgs

e)

{

//塊地址的值

byte

addr

=

0;

try

{

addr

=

byte.Parse(txtAddress.Text);

}

catch

{

MessageBox.Show("你填寫的塊地址無效");

}

//密鑰

B

的值

byte[]

KeyBData

=

new

byte[6];

try

{

KeyBData

=

Converter.HexStrToArray(txtKeyB.Text);

}

catch

{

MessageBox.Show("你填寫的密碼

B

無效,請確保數(shù)據(jù)都是十六進制的");

}

if

(KeyBData.Length

!=

6)

{

MessageBox.Show("你填寫的密鑰

B

無效,必須是12位十六進制數(shù)據(jù)");

return;

}

//標簽號

byte[]

TagNumber

=

new

byte[4];

try

{

TagNumber

=

Converter.HexStrToArray(txtTag.Text);

}

catch

{

MessageBox.Show("卡號無效,請先尋卡");

}

if

(TagNumber.Length

!=

4)

{

MessageBox.Show("卡號無效,請先尋卡");

return;

}

//驗證B密鑰

try

{

if

(await

ISO14443Handle.VaildKeyBAsync(txtAddress.Text,

txtKeyB.Text,

txtTag.Text)

==

"")

{

MessageBox.Show("驗證B密鑰成功");

btnRead.Enabled

=

true;

btnWrite.Enabled

=

true;

}

else

{

MessageBox.Show("驗證B密鑰失敗");

}

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

}

private

async

void

btnRead_Click(object

sender,

EventArgs

e)

{

byte

addr

=

0;

try

{

addr

=

byte.Parse(txtAddress.Text);

if

(addr

<

0)

{

MessageBox.Show("地址不能小于0");

return;

}

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

try

{

string

data

=

await

ISO14443Handle.ReadDataAsync(txtAddress.Text);

txtReadData.Text

=

data;

MessageBox.Show("讀取數(shù)據(jù)成功");

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

}

private

async

void

btnWrite_Click(object

sender,

EventArgs

e)

{

byte

addr

=

0;

try

{

addr

=

byte.Parse(txtAddress.Text);

if

(addr

<

0)

{

MessageBox.Show("地址不能小于0");

return;

}

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

return;

}

byte[]

dataWrite

=

new

byte[16];

try

{

dataWrite

=

Converter.HexStrToArray(txtWriteData.Text);

}

catch

{

MessageBox.Show("你所填的數(shù)據(jù)無效");

return;

}

if

(await

ISO14443Handle.WriteDataAsync(txtAddress.Text,

txtWriteData.Text)

==

"")

{

MessageBox.Show("寫入成功");

}

else

{

MessageBox.Show("寫入失敗,你填寫數(shù)據(jù)錯誤或者沒有權限");

return;

}

}

}

}

高頻卡的電子錢包讀寫工單描述:打開仿真包與實驗案例在實驗案例案例中,制卡并且驗證A或B密鑰可扣款驗證B密鑰可充值,而A密鑰不可充值最后再初始化卡內金額,了解和熟悉金額的轉換和存儲模式驗證卡內金額是通過密鑰B方可寫。工單目的1、掌握電子錢包的工作流程和原理思路2、初步了解每個塊的權限值的概念3、掌握初始化電子錢包的詳細步驟和規(guī)律1.實驗連線圖與流程圖連線圖流程圖第1步:界面如下2.實驗分階演示2.1制卡序號操作第1步選擇串口2打開串口3制卡實驗分析:首先確立要進行操作的扇區(qū)和塊區(qū),算出操作塊地址。本實驗是對扇區(qū)2,塊0塊地址為8。點擊制卡時進行設置電子錢包、密鑰修改、權限修改。將塊地址為8的塊區(qū)設置為電子錢包,并且充值100元,然后修改該扇區(qū)的A密鑰為AAAAAAAAAAAA,B密鑰修改為BBBBBBBBBBBB,控制權限修改為“08778F69”。單擊制卡按鈕,如提示成功,會彈出該制卡卡號的制卡信息,如寫入數(shù)據(jù)的塊地址、金額、密鑰A、密鑰B等。如果提示失敗,原因可能是驗證B密鑰失敗,這時你要確定你制卡時是否是一張空白卡。如提示寫入失敗,則要保證你操作是否是一張空白卡。2.2密鑰A扣款序號操作成功失敗1選擇串口無提示無提示2打開串口打開成功失敗原因可能是串口線未連或電源接觸不良以及設備異常3尋卡實驗界面顯示卡號場區(qū)內無卡4選卡選卡成功與制卡時的卡號不符5驗證驗證A密鑰成功A密鑰錯誤,或者未制卡6輸入扣款金額數(shù)金額數(shù)變化無提示實驗分析:在消費金額中,輸入數(shù)字,如果輸入其他非數(shù)字的話會自動清0,將輸入的金額數(shù)乘以100得到要扣款的金額數(shù),乘以100的原因是高頻14443卡片的數(shù)據(jù)塊作為電子錢包時,不支持存儲小數(shù),只支持整數(shù)的加減。所以在本實驗中進行了數(shù)據(jù)處理。7扣款扣款成功,顯示當前余額無權限,或者字符串錯誤等實驗分析:對當前選擇的塊區(qū)進行扣款操作,電子錢包當前金額數(shù)減去扣款金額數(shù),從而得到余額。如成功的話會提示當前余額是多少,并且制卡信息界面中會顯示當前余額的值。如失敗的話可能是并沒有扣款權限,或者輸入的金額數(shù)不正確。2.3密鑰B充值序號操

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論