VB.net复制Ntag213卡写入UID

本示例使用的发卡器:https://item.taobao.com/item.htm?ft=t&id=615391857885

一、读取旧Ntag卡的UID和数据

vbnet 复制代码
    Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click
        '轻松读卡
        '技术支持:
        '网站:
        Dim i, j As Integer
        Dim cardidhex, authkey, Str As String
        Dim 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 Byte
        Dim myblockaddr As Byte '起始块地址
        Dim myblocksize As Byte '总块数

        If CheckBox3.Checked Then
            If Len(Trim(TextBox7.Text)) < 8 Then
                i = MsgBox("卡认证密码位数不足!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
                If i <> vbOK Then
                    TextBox7.Select()
                    Exit Sub
                End If
            Else
                authkey = Trim(TextBox7.Text)
                For i = 0 To 3
                    mypicckey(i) = CByte("&H" & Mid(authkey, i * 2 + 1, 2))
                Next
            End If
            myctrlword = &H10  '需要认证卡密码后再继续
        Else
            myctrlword = 0
        End If

        myblockaddr = CByte(rwbeginp.Value)
        myblocksize = CByte(rwps.Value)

        j = 0
        For i = myblockaddr To myblockaddr + myblocksize - 1
            status = piccreadex_ntag(myctrlword, mypiccserial(0), mypicckey(0), i, 1, mypiccdata(0))
            If status = 0 Then
                piccdata(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 + 1
            Else
                Exit For
            End If
        Next

        Select Case status
            Case 0
                pcdbeep(50)
                cardidhex = ""
                For i = 0 To 6
                    cardidhex = cardidhex + Strings.Right("00" + Hex(mypiccserial(i)), 2)
                Next
                TextBox8.Text = cardidhex


                cardidhex = ""
                For i = 0 To myblocksize * 4 - 1
                    cardidhex = cardidhex + Strings.Right("00" + Hex(piccdata(i)), 2)
                Next
                RichTextBox1.Text = cardidhex
                lcddispfull("读卡成功!                        ")
                MsgBox("读卡成功!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")

            Case 8
                lcddispfull("请将卡放在感应区!                        ")
                MsgBox("请将卡放在感应区!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
            Case 12
                lcddispfull("读块" + Convert.ToString(i) + "失败,密码错误!                       ")
                MsgBox("读块" + Convert.ToString(i) + "失败,密码错误!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
            Case 13
                lcddispfull("读块" + Convert.ToString(i) + "失败,可能需要验证密码!                       ")
                MsgBox("读块" + Convert.ToString(i) + "失败,可能需要验证密码!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
            Case 23
                MsgBox("请连上USB读写器!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
            Case Else
                lcddispfull("读块" + Convert.ToString(i) + "时操作异常,返回代码:" + Convert.ToString(status) + "                        ")
                MsgBox("读块" + Convert.ToString(i) + "时操作异常,返回代码:" + Convert.ToString(status), MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
        End Select
    End Sub

二、将读取的UID和数据写入新标签

vbnet 复制代码
    Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click
        '技术支持:
        '网站:
        Dim i, j As Integer
        Dim cardidhex, authkey, Str, writstr As String
        Dim 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 Byte
        Dim rwlen As Integer

        If rwps.Value < 1 Then
            MsgBox("写卡页数必须大于0!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
            Exit Sub
        End If

        myblockaddr = CByte(rwbeginp.Value)
        myblocksize = CByte(rwps.Value)

        If CheckBox3.Checked Then
            If Len(Trim(TextBox7.Text)) < 8 Then
                i = MsgBox("卡认证密码位数不足!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
                If i <> vbOK Then
                    TextBox7.Select()
                    Exit Sub
                End If
            Else
                authkey = Trim(TextBox7.Text)
                For i = 0 To 3
                    mypicckey(i) = CByte("&H" & Mid(authkey, i * 2 + 1, 2))
                Next
            End If
            myctrlword = &H10  '需要认证卡密码后再继续
        Else
            myctrlword = 0
        End If

        rwlen = myblocksize * 4
        If Not checkhexstr(RichTextBox1.Text.Trim(), rwlen, piccdata) Then
            MessageBox.Show("写卡信息不足,建议先读取对应块内数据后再改写!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return
        End If

        j = 0
        For i = myblockaddr To myblockaddr + myblocksize - 1
            mypiccdata(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 Then
                mypiccdata(2) = 0
                mypiccdata(3) = 0
                status = picclock_ntag(0, mypiccdata(0))   '2块的后两个字节是静态锁
            Else
                status = piccwriteex_ntag(myctrlword, mypiccserial(0), mypicckey(0), i, 1, mypiccdata(0))
            End If
            If status = 0 Then
                j = j + 1
            Else
                Exit For
            End If
        Next

        Select Case status
            Case 0
                pcdbeep(50)
                cardidhex = ""
                For i = 0 To 6
                    cardidhex = cardidhex + Strings.Right("00" + Hex(mypiccserial(i)), 2)
                Next
                TextBox8.Text = cardidhex
                lcddispfull("写卡成功!                        ")
                MsgBox("写卡成功!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")

            Case 8
                lcddispfull("请将卡放在感应区!                        ")
                MsgBox("请将卡放在感应区!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
            Case 12
                lcddispfull("写块" + Convert.ToString(i) + "时失败,卡密码错误!                        ")
                MsgBox("写块" + Convert.ToString(i) + "时失败,卡密码错误!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
            Case 14
                lcddispfull("写块" + Convert.ToString(i) + "时失败,可能需要验证密码或页已经锁定!                        ")
                MsgBox("写块" + Convert.ToString(i) + "时失败,可能需要验证密码或页已经锁定!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
            Case 23
                MsgBox("请连上USB读写器!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
            Case Else
                lcddispfull("写块" + Convert.ToString(i) + "时操作异常,代码:" + Convert.ToString(status) + "                        ")
                MsgBox("写块" + Convert.ToString(i) + "时操作异常,返回代码:" + Convert.ToString(status), MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "提示")
        End Select
    End Sub
相关推荐
qq_410194299 小时前
.NET 8.0 下基于 PaddleOCRSharp 的离线文字识别落地指南
算法·.net
唐青枫2 天前
别急着拆服务:C#.NET 微服务架构从边界设计到实战
c#·.net
唐青枫3 天前
别把 Razor 当成几段 HTML:C#.NET Razor Pages、MVC 视图与实战详解
c#·.net
宝桥南山3 天前
Microsoft Fabric - 简单尝试一下Microsoft Fabric .NET SDK
microsoft·微软·.net·.netcore·powerbi·fabric
Lost of 程序猿3 天前
.NET 10 船端单机部署与离线升级实战:从闪退事故到无感回滚
c#·asp.net·.net
慧都小妮子3 天前
Word/Excel/PPT 如何稳定导出 Markdown?文档 SDK 三线能力拆解
.net·markdown·知识库·aspose·rag·文档转换·文档互操作
唐青枫4 天前
对象到底住在哪里?C#.NET 托管堆从分配、GC 到内存排查
c#·.net
geovindu4 天前
CSharp:Condition Variable Pattern
后端·设计模式·c#·.net·.netcore·条件变量模式·同步型模式
de之梦-御风4 天前
【未来】.NET 开发在「劳动价值重估」下的定位与走向
职场和发展·.net
fogota4 天前
C# 如何调用系统图标
c#·.net