当前位置: 首页 > article >正文

VB.net读写S50/F08IC卡,修改卡片密码控制位源码

本示例使用设备:Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com)

 函数声明

Module Module1

    '读卡函数声明
    Public Declare Function piccreadex Lib "OUR_MIFARE.dll" (ByVal ctrlword As Byte, ByRef serial As Byte, ByVal area As Byte, ByVal keyA1B0 As Byte, ByRef picckey As Byte, ByRef piccdata0_2 As Byte) As Byte

    '写卡函数声明
    Public Declare Function piccwriteex Lib "OUR_MIFARE.dll" (ByVal ctrlword As Byte, ByRef serial As Byte, ByVal area As Byte, ByVal keyA1B0 As Byte, ByRef picckey As Byte, ByRef piccdata0_2 As Byte) As Byte

    '修改单区函数声明
    Public Declare Function piccchangesinglekey Lib "OUR_MIFARE.dll" (ByVal ctrlword As Byte, ByRef serial As Byte, ByVal area As Byte, ByVal keyA1B0 As Byte, ByRef piccoldkey As Byte, ByRef piccnewkey As Byte) As Byte

    '让设备发出声响函数声明
    Public Declare Function pcdbeep Lib "OUR_MIFARE.dll" (ByVal xms As Long) As Byte

    '读取设备编号函数声明
    Public Declare Function pcdgetdevicenumber Lib "OUR_MIFARE.dll" (ByRef devicenumber As Byte) As Byte

    '寻卡并返回该卡的序列号
    Public Declare Function piccrequest Lib "OUR_MIFARE.dll" (ByRef serial As Byte) As Byte

    '密码认证方式1,用外部密码认证,必须指定外部密码。本函数必须在piccrequest或piccrequestex函数执行之后运行,并且要紧接着调用,中途不能调用其他函数。
    Public Declare Function piccauthkey1 Lib "OUR_MIFARE.dll" (ByRef serial As Byte, ByVal area As Byte, ByVal keyA1B0 As Byte, ByRef picckey As Byte) As Byte

    '读出一块的数据,也就是16个字节。必须在执行piccrequest或 Piccrequestex函数,接着执行piccauthkey1或 piccauthkey2函数,然后执行piccread才能成功读出一块的数据。
    Public Declare Function piccread Lib "OUR_MIFARE.dll" (ByVal block As Byte, ByRef blockdata As Byte) As Byte

    '写一块的数据,也就是16个字节。必须在执行piccrequest或 Piccrequestex函数,接着执行piccauthkey1或 piccauthkey2函数,然后执行piccread才能成功读出一块的数据。
    Public Declare Function piccwrite Lib "OUR_MIFARE.dll" (ByVal block As Byte, ByRef blockdata As Byte) As Byte

    '修改卡A/B密码及控制字
    Public Declare Function piccchangesinglekeyex Lib "OUR_MIFARE.dll" (ByVal ctrlword As Byte, ByRef serial As Byte, ByVal area As Byte, ByVal keyA1B0 As Byte, ByRef piccoldkey As Byte, ByRef piccnewkey As Byte) As Byte


    '控制字定义,控制字指定,控制字的含义请查看本公司网站提供的动态库说明
    Public Const BLOCK0_EN = &H1 '操作第0块
    Public Const BLOCK1_EN = &H2 '操作第1块
    Public Const BLOCK2_EN = &H4 '操作第2块
    Public Const NEEDSERIAL = &H8 '仅对指定序列号的卡号操作
    Public Const EXTERNKEY = &H10 '需要在参数中指定认证密码
    Public Const NEEDHALT = &H20 '操作后休眠该卡,必须拿开卡再放回感应区才能重新感应到卡
End Module

轻松读卡 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim status As Byte '存放返回值
        Dim myareano As Byte '区号
        Dim authmode As Byte '密码类型,用A密码或B密码
        Dim myctrlword As Byte '控制字

        Dim mypiccserial(3) As Byte '卡序列号,从0~3四个字节
        Dim mypicckey(5) As Byte '密码,从0~5六个字节
        Dim mypiccdata(47) As Byte '卡数据缓冲,从0~47四十八个字节

        Dim hexstr As String
        Dim i As Integer

        '控制字指定,控制字的含义请查看本公司网站提供的动态库说明
        myctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY

        '指定区号
        myareano = ComboBox1.SelectedIndex        '指定为第区        '批定密码模式
        authmode = ComboBox2.SelectedIndex        '大于0表示用A密码认证,推荐用A密码认证

        '指定密码
        Try
            hexstr = TextBox2.Text.Trim()
            mypicckey(0) = "&H" & hexstr.Substring(0, 2)
            mypicckey(1) = "&H" & hexstr.Substring(2, 2)
            mypicckey(2) = "&H" & hexstr.Substring(4, 2)
            mypicckey(3) = "&H" & hexstr.Substring(6, 2)
            mypicckey(4) = "&H" & hexstr.Substring(8, 2)
            mypicckey(5) = "&H" & hexstr.Substring(10, 2)
        Catch
            MessageBox.Show("卡片认证密码错误,请输入12位正确的16进制卡密码!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            TextBox2.Select()
            Return
        End Try


        status = piccreadex(myctrlword, mypiccserial(0), myareano, authmode, mypicckey(0), mypiccdata(0))
        If status = 0 Then
            hexstr = ""
            For i = 0 To 47
                hexstr = hexstr + mypiccdata(i).ToString("X2") + " "
            Next
            TextBox3.Text = hexstr

            status = piccread((myareano + 1) * 4 - 1, mypiccdata(0))
            If status = 0 Then
                hexstr = ""
                For i = 0 To 15
                    hexstr = hexstr + mypiccdata(i).ToString("X2") + " "
                Next
                TextBox4.Text = hexstr
            End If
        Else
            TextBox3.Text = ""
            TextBox4.Text = ""
            disperrinf(status)
        End If
    End Sub

轻松写卡

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim i As Integer
        Dim status As Byte '存放返回值
        Dim myareano As Byte '区号
        Dim authmode As Byte '密码类型,用A密码或B密码
        Dim myctrlword As Byte '控制字
        Dim mypicckey(5) As Byte '密码
        Dim mypiccserial(3) As Byte '卡序列号
        Dim mypiccdata(47) As Byte '卡数据缓冲

        Dim hexstr As String

        '控制字指定,控制字的含义请查看本公司网站提供的动态库说明
        myctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY

        '指定区号
        myareano = ComboBox1.SelectedIndex        '指定为第区        '批定密码模式
        authmode = ComboBox2.SelectedIndex        '大于0表示用A密码认证,推荐用A密码认证

        '指定密码
        Try
            hexstr = TextBox2.Text.Trim()
            mypicckey(0) = "&H" & hexstr.Substring(0, 2)
            mypicckey(1) = "&H" & hexstr.Substring(2, 2)
            mypicckey(2) = "&H" & hexstr.Substring(4, 2)
            mypicckey(3) = "&H" & hexstr.Substring(6, 2)
            mypicckey(4) = "&H" & hexstr.Substring(8, 2)
            mypicckey(5) = "&H" & hexstr.Substring(10, 2)
        Catch
            MessageBox.Show("卡片认证密码错误,请输入12位正确的16进制卡密码!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            TextBox2.Select()
            Return
        End Try


        '指定写卡数据
        Try
            hexstr = TextBox3.Text.Trim()
            For i = 0 To 47
                mypiccdata(i) = "&H" & hexstr.Substring(i * 3, 2)
            Next i
        Catch
            MessageBox.Show("写卡数据输入错误,请输入48个正确的16进制写卡数据!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            TextBox3.Select()
            Return
        End Try

        status = piccwriteex(myctrlword, mypiccserial(0), myareano, authmode, mypicckey(0), mypiccdata(0))
        If status = 0 Then
            pcdbeep(50)
            MessageBox.Show("写卡成功!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
            disperrinf(status)
        End If
    End Sub

 修改卡片密码及控制位

 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim i As Integer
        Dim status As Byte '存放返回值
        Dim myareano As Byte '区号
        Dim authmode As Byte '密码类型,用A密码或B密码
        Dim myctrlword As Byte '控制字
        Dim mypiccserial(3) As Byte '卡序列号
        Dim mypiccoldkey(5) As Byte '旧密码
        Dim mypiccnewkey(16) As Byte '新密码
        Dim hexstr As String

        i = MessageBox.Show("    您确定要修改卡片的密码吗,如确定修改请一定记住新密码,否则卡片将报废!", "示例提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        If i <> 6 Then
            Return
        End If

        '控制字指定,控制字的含义请查看本公司网站提供的动态库说明
        myctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY

        '指定区号
        myareano = ComboBox1.SelectedIndex        '指定为第区        '批定密码模式
        authmode = ComboBox2.SelectedIndex        '大于0表示用A密码认证,推荐用A密码认证

        '指定密码
        Try
            hexstr = TextBox2.Text.Trim()
            mypiccoldkey(0) = "&H" & hexstr.Substring(0, 2)
            mypiccoldkey(1) = "&H" & hexstr.Substring(2, 2)
            mypiccoldkey(2) = "&H" & hexstr.Substring(4, 2)
            mypiccoldkey(3) = "&H" & hexstr.Substring(6, 2)
            mypiccoldkey(4) = "&H" & hexstr.Substring(8, 2)
            mypiccoldkey(5) = "&H" & hexstr.Substring(10, 2)
        Catch
            MessageBox.Show("卡片认证密码错误,请输入12位正确的16进制卡密码!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            TextBox2.Select()
            Return
        End Try


        '指定新密码,注意:指定新密码时一定要记住,否则有可能找不回密码,导致该卡报废。
        Try
            hexstr = TextBox4.Text.Trim()
            For i = 0 To 15
                mypiccnewkey(i) = "&H" & hexstr.Substring(i * 3, 2)
            Next i
            mypiccnewkey(16) = 3    '3是表示同时更改A、B、 密码权限访问字,为2表示密码权限访问字不更改,只改A、B密码,为0表示只改A密码
        Catch
            MessageBox.Show("新密码输入错误,请输入6字节A密码+4字节控制位+6字节B密码(16进制)!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            TextBox4.Select()
            Return
        End Try

        status = piccchangesinglekey(myctrlword, mypiccserial(0), myareano, authmode, mypiccoldkey(0), mypiccnewkey(0))
        If status = 0 Then
            pcdbeep(50)
            MessageBox.Show("修改卡片密码成功!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
            disperrinf(status)
        End If
    End Sub

 读写卡操作异常说明

 Private Sub disperrinf(ByVal errcode As Byte)
        Select Case errcode
            Case 1
                MessageBox.Show("0~2块数据都没读出来,可能刷卡太块。但卡序列号已被读出!", "示例程序", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 2
                MessageBox.Show("第0块已被读出,但1~2块读取失败。卡序列号已被读出来!", "示例程序", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 3
                MessageBox.Show("第0、1块已被读出,但2块读取失败。卡序列号已被读出来!", "示例程序", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 8
                MessageBox.Show("未寻到卡,请将卡放在感应区!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 9
                MessageBox.Show("读序列码错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 10
                MessageBox.Show("选卡错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 11
                MessageBox.Show("装载密码错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 12
                MessageBox.Show("卡密码认证错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 13
                MessageBox.Show("读卡错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 14
                MessageBox.Show("写卡错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 18
                MessageBox.Show("写UID错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 21
                MessageBox.Show("没有动态库!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 22
                MessageBox.Show("动态库或驱动程序异常!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 23
                MessageBox.Show("驱动程序错误或尚未安装!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 24
                MessageBox.Show("操作超时,一般是动态库没有反映!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 25
                MessageBox.Show("发送字数不够!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 26
                MessageBox.Show("发送的CRC错!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 27
                MessageBox.Show("接收的字数不够!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case 28
                MessageBox.Show("接收的CRC错!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Case Else
                MessageBox.Show("返回码(对应的说明请看例子中的注释):" + errcode.ToString(), "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Select
    End Sub


http://www.kler.cn/news/134810.html

相关文章:

  • 警惕.360勒索病毒,您需要知道的预防和恢复方法。
  • IPKISS Tutorials 3------绘制矩形版图
  • Docker 安装 Oracle Database 23c
  • 前端图片转成base64
  • 8年资深测试,自动化测试常见问题总结,惊险避坑...
  • Docker基础知识总结
  • 医院陪诊服务预约小程序的作用如何
  • 源启容器平台KubeGien 打造云原生转型的破浪之舰
  • [uni-app]记录APP端跳转页面自动滚动到底部的bug
  • hiredis/examples /example-libevent.c
  • 如何进行手动脱壳
  • Hive客户端hive与beeline的区别
  • VR智慧景区:VR赋能文旅产业,激活消费潜能
  • EtherCAT 伺服控制功能块实现
  • 3D建模基础教程:编辑多边形功能命令快捷方式
  • SpringBoot 整合 Freemarker
  • 小程序判断是否授权位置信息和手动授权
  • 【每日一题】最大子数组和
  • 小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c
  • 越南MIC新规针对ICT和ITE产品电气授权标准变更
  • 一起学docker系列之四docker的常用命令--系统操作docker命令及镜像命令
  • Springcloud可视化物联网智慧工地云SaaS平台源码 支持二开和私有化部署
  • 沸点 | Ultipa 图数据库金融应用场景优秀案例首批入选,金融街论坛年会发布
  • Chat GPT 用于论文润色,常用指令这里都全了
  • ts视频文件转为mp4(FFmpeg)
  • 『亚马逊云科技产品测评』活动征文|基于next.js搭建一个企业官网
  • 每天一道算法题(五)——判断一组数字是否连续,出现连续数字的时候以‘-’输出
  • Flutter笔记:目录与文件存储以及在Flutter中的使用(上)
  • Git 提交竟然还能这么用?
  • css设置下划线