本示例使用的發卡器:https://item.taobao.com/item.htm?ft=t&id=615391857885?
一、讀取舊Ntag卡的UID和數據
Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click'輕松讀卡'技術支持:'網站:Dim i, j As IntegerDim cardidhex, authkey, Str As StringDim status, myctrlword, comedc As Byte '存放返回值Dim mypiccserial(7) As Byte '卡序列號Dim mypicckey(0 To 3) As Byte '認證密碼Dim mypiccdata(0 To 3) As Byte '讀卡的數據緩沖,Ultralight卡及NTAG21x卡的數組長度必須為16個字節,寫卡的為4個字節Dim piccdata(0 To 8191) As ByteDim myblockaddr As Byte '起始塊地址Dim myblocksize As Byte '總塊數If CheckBox3.Checked ThenIf Len(Trim(TextBox7.Text)) < 8 Theni = MsgBox("卡認證密碼位數不足!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")If i <> vbOK ThenTextBox7.Select()Exit SubEnd IfElseauthkey = Trim(TextBox7.Text)For i = 0 To 3mypicckey(i) = CByte("&H" & Mid(authkey, i * 2 + 1, 2))NextEnd Ifmyctrlword = &H10 '需要認證卡密碼后再繼續Elsemyctrlword = 0End Ifmyblockaddr = CByte(rwbeginp.Value)myblocksize = CByte(rwps.Value)j = 0For i = myblockaddr To myblockaddr + myblocksize - 1status = piccreadex_ntag(myctrlword, mypiccserial(0), mypicckey(0), i, 1, mypiccdata(0))If status = 0 Thenpiccdata(j * 4 + 0) = mypiccdata(0)piccdata(j * 4 + 1) = mypiccdata(1)piccdata(j * 4 + 2) = mypiccdata(2)piccdata(j * 4 + 3) = mypiccdata(3)j = j + 1ElseExit ForEnd IfNextSelect Case statusCase 0pcdbeep(50)cardidhex = ""For i = 0 To 6cardidhex = cardidhex + Strings.Right("00" + Hex(mypiccserial(i)), 2)NextTextBox8.Text = cardidhexcardidhex = ""For i = 0 To myblocksize * 4 - 1cardidhex = cardidhex + Strings.Right("00" + Hex(piccdata(i)), 2)NextRichTextBox1.Text = cardidhexlcddispfull("讀卡成功! ")MsgBox("讀卡成功!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")Case 8lcddispfull("請將卡放在感應區! ")MsgBox("請將卡放在感應區!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")Case 12lcddispfull("讀塊" + Convert.ToString(i) + "失敗,密碼錯誤! ")MsgBox("讀塊" + Convert.ToString(i) + "失敗,密碼錯誤!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")Case 13lcddispfull("讀塊" + Convert.ToString(i) + "失敗,可能需要驗證密碼! ")MsgBox("讀塊" + Convert.ToString(i) + "失敗,可能需要驗證密碼!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")Case 23MsgBox("請連上USB讀寫器!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")Case Elselcddispfull("讀塊" + Convert.ToString(i) + "時操作異常,返回代碼:" + Convert.ToString(status) + " ")MsgBox("讀塊" + Convert.ToString(i) + "時操作異常,返回代碼:" + Convert.ToString(status), MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")End SelectEnd Sub
二、將讀取的UID和數據寫入新標簽
Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click'技術支持:'網站:Dim i, j As IntegerDim cardidhex, authkey, Str, writstr As StringDim status, myctrlword, comedc As Byte '存放返回值Dim mypiccserial(7) As Byte '卡序列號Dim mypicckey(0 To 3) As Byte '認證密碼Dim mypiccdata(0 To 3) As Byte '寫卡的為4個字節Dim myblockaddr As Byte '起始塊地址Dim myblocksize As Byte '總塊數Dim piccdata(0 To 8100) As ByteDim rwlen As IntegerIf rwps.Value < 1 ThenMsgBox("寫卡頁數必須大于0!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")Exit SubEnd Ifmyblockaddr = CByte(rwbeginp.Value)myblocksize = CByte(rwps.Value)If CheckBox3.Checked ThenIf Len(Trim(TextBox7.Text)) < 8 Theni = MsgBox("卡認證密碼位數不足!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")If i <> vbOK ThenTextBox7.Select()Exit SubEnd IfElseauthkey = Trim(TextBox7.Text)For i = 0 To 3mypicckey(i) = CByte("&H" & Mid(authkey, i * 2 + 1, 2))NextEnd Ifmyctrlword = &H10 '需要認證卡密碼后再繼續Elsemyctrlword = 0End Ifrwlen = myblocksize * 4If Not checkhexstr(RichTextBox1.Text.Trim(), rwlen, piccdata) ThenMessageBox.Show("寫卡信息不足,建議先讀取對應塊內數據后再改寫!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error)ReturnEnd Ifj = 0For i = myblockaddr To myblockaddr + myblocksize - 1mypiccdata(0) = piccdata(j * 4 + 0)mypiccdata(1) = piccdata(j * 4 + 1)mypiccdata(2) = piccdata(j * 4 + 2)mypiccdata(3) = piccdata(j * 4 + 3)If i = 2 Thenmypiccdata(2) = 0mypiccdata(3) = 0status = picclock_ntag(0, mypiccdata(0)) '2塊的后兩個字節是靜態鎖Elsestatus = piccwriteex_ntag(myctrlword, mypiccserial(0), mypicckey(0), i, 1, mypiccdata(0))End IfIf status = 0 Thenj = j + 1ElseExit ForEnd IfNextSelect Case statusCase 0pcdbeep(50)cardidhex = ""For i = 0 To 6cardidhex = cardidhex + Strings.Right("00" + Hex(mypiccserial(i)), 2)NextTextBox8.Text = cardidhexlcddispfull("寫卡成功! ")MsgBox("寫卡成功!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")Case 8lcddispfull("請將卡放在感應區! ")MsgBox("請將卡放在感應區!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")Case 12lcddispfull("寫塊" + Convert.ToString(i) + "時失敗,卡密碼錯誤! ")MsgBox("寫塊" + Convert.ToString(i) + "時失敗,卡密碼錯誤!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")Case 14lcddispfull("寫塊" + Convert.ToString(i) + "時失敗,可能需要驗證密碼或頁已經鎖定! ")MsgBox("寫塊" + Convert.ToString(i) + "時失敗,可能需要驗證密碼或頁已經鎖定!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")Case 23MsgBox("請連上USB讀寫器!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")Case Elselcddispfull("寫塊" + Convert.ToString(i) + "時操作異常,代碼:" + Convert.ToString(status) + " ")MsgBox("寫塊" + Convert.ToString(i) + "時操作異常,返回代碼:" + Convert.ToString(status), MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")End SelectEnd Sub
?