Mifare Ultra Light 非接触式IC卡发卡总结
概述:
1、? 容量512bit,分為16個page,每個page占4byte
2、? 每個page可以通過編程的方式鎖定為只讀功能
3、? 384位(從page4往后)用戶讀寫區域
4、? 唯一7字節物理卡號(page0前3個byte加page1)
存儲結構:
| 頁號 | Byte0 | Byte1 | Byte2 | Byte3 | 說明 |
| 0 | SN0 | SN1 | SN2 | BCC0 | 只讀,存放卡的序列號:Page0前3字節+整個Page1 |
| 1 | SN3 | SN4 | SN5 | SN6 | |
| 2 | BCC1 | 保留 | LOCK0 | LOCK1 | 只讀,通過設置LOCK0和LOCK1可以講16個page設為只讀 |
| 3 | OTP0 | OTP1 | OTP2 | OTP3 | 可讀寫,一次性交易計數器,不可逆 |
| 4 | Data0 | Data1 | Data2 | Data3 | 可讀寫,數據存放區域 |
| 5 | Data0 | Data1 | Data2 | Data3 | |
| 6 | Data0 | Data1 | Data2 | Data3 | |
| 7 | Data0 | Data1 | Data2 | Data3 | |
| 8 | Data0 | Data1 | Data2 | Data3 | |
| 9 | Data0 | Data1 | Data2 | Data3 | |
| 10 | Data0 | Data1 | Data2 | Data3 | |
| 11 | Data0 | Data1 | Data2 | Data3 | |
| 12 | Data0 | Data1 | Data2 | Data3 | |
| 13 | Data0 | Data1 | Data2 | Data3 | |
| 14 | Data0 | Data1 | Data2 | Data3 | |
| 15 | Data0 | Data1 | Data2 | Data3 |
?
總的來說,你可以把UltraLight卡簡單地看成是一種存儲介質,對它的操作也就是對扇區中每個Page的讀取和寫入的過程。
UltraLight卡的發卡流程:
第一步:尋卡
dc_card(icdev, cardMode, snr)
dc_anticoll2(icdev, 0, snr2)
dc_select2(icdev, snr2, size)
第二步:寫卡
獲得想要寫入卡片的數據(十六進制字符串形式),調用dc_write_hex函數,寫入對應page
關于這個函數有個比較怪的問題,文檔中規定,對于Ultralight卡,一次必須寫入4個字節,也就是一個Page,但你仍需將你寫入的數據以后補0的方式補足16字節,盡管它實際寫入的只是前4個字節。自己寫的功能函數:
''' <summary>''' 將進制串寫入指定地址的卡片內存中''' </summary>''' <param name="start">要寫入的起始塊地址</param>''' <param name="finish">要寫入的結束塊地址</param>''' <param name="dataBufHex">要寫入的串</param>''' <returns>寫卡是否成功</returns>''' <remarks></remarks>Private Function Write(ByVal start As Short, ByVal finish As Short, ByVal dataBufHex As String)Dim i As Byte '循環標記Write = False'假設dataBufHex為字8節,start為4,finsh為5,但對Ultralight來說,一次只能寫4個字節,即'一次只能寫一個塊,因此需要分兩次來寫。雖然每次只能寫四個字節,但'dc_write_hex函數規定寫入的數據必須為16字節,因此需要做右補0操作For i = 0 To (finish - start)Dim tmp As Stringtmp = Mid(dataBufHex, i * 8 + 1, 8)'補0If Len(tmp) < 32 Thentmp = tmp & New String("0", 32 - Len(tmp))End IfLog("往Page" & (start + i) & "中寫數據:" & tmp)st = dc_write_hex(icdev, start + i, tmp)If (st <> 0) Then '寫卡失敗Write = FalseExit FunctionEnd IfNextWrite = True End Function
第三步:讀卡
發好卡后,需要驗證寫入的數據是否正確,這時你就需要調用dc_read_hex函數讀入卡片中的數據,有例子:
st = dc_read_hex(icdev, address, dataBufHex)
這里icdev是通訊設備標識符,address是要讀入的起始頁地址,dataBufHex是存放讀入數據的變量。
dc_read_hex函數一次性讀入16字節數據,因此dataBufHex字符串長度最長為32,但是不管你的dataBufHex設成任何長度(只要不大于32),該函數仍然讀出16字節數據,只不過它會截取前面的部分放到dataBufHex中返還給你罷了。
其他:
關于發行驗證碼和交易TAC的計算方法,等過幾天總結了CPU卡和M1卡的發卡流程之后再寫出來。還有就是卡片的應用,我發的UltraLight是拿來作為單程票的,它的消費充值等流程是由其他人來做的,而且跟具體的卡結構有關,不好講。
轉載于:https://www.cnblogs.com/chenguanwei/archive/2011/01/07/1930169.html
總結
以上是生活随笔為你收集整理的Mifare Ultra Light 非接触式IC卡发卡总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是CDN ,CDN的作用
- 下一篇: Eclipse中启动tomcat报错ja