T5557卡是多功能非接触式射频芯片卡,属于125KHz的低频卡,在国内有广大的应用市场,如很多酒店的门禁卡都是使用T5557卡。该芯片共有330bit(比特)的EPROM(分布为10个区块, 每个区块33bit)。0页的块0是被保留用于设置T5557操作模式的参数配置块。第0页第7块可以作用户数据块使用,也可以作为保护全部数据的密码(假如在配置块中启用密码功能的话),防止非法改写数据。 第1页的1、2块保存了出厂商信息及唯一出厂ID,只能读取不可更改。T5567、T5577是T5557的升级版。
通过修改T5557卡的参数配置块,可以将t5557卡模拟成ID卡、HID卡。
本示例使用的发卡器:T5557 T5567 T5577低频RFID读写器 EM4100 HID卡复制器 酒店门卡-淘宝网 (taobao.com)
一、读、写卡函数声明
Declare Function idr_beep Lib "OUR_IDR.dll" (ByVal xms As Integer) As Byte
Declare Function pcdgetdevicenumber Lib "OUR_IDR.dll" (ByRef devicenumber As Byte) As Byte
Declare Function idr_read Lib "OUR_IDR.dll" (ByRef serial As Byte) As Byte
Declare Function hid_read Lib "OUR_IDR.dll" (ByRef serial As Byte) As Byte
Declare Function t5557_init Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef key As Byte, ByRef configdata As Byte, ByRef newkey As Byte) As Byte
Declare Function t5557_read Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef key As Byte, ByRef blockflag As Byte, ByRef readdata As Byte) As Byte
Declare Function t5557_write Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef key As Byte, ByRef blockflag As Byte, ByRef writedata As Byte) As Byte
Declare Function t5557_changekey Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef oldkey As Byte, ByRef newkey As Byte) As Byte
Declare Function t5557_to4100 Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef oldkey As Byte, ByRef newkey As Byte, ByRef myuidbuf As Byte) As Byte
Declare Function t5557_tohid Lib "OUR_IDR.dll" (ByVal ctrlword As Byte, ByRef seria As Byte, ByRef oldkey As Byte, ByRef newkey As Byte, ByRef myuidbuf As Byte) As Byte
Public myCheckBox As New ArrayList
Public myTextBox As New ArrayList
Dim NEEDSERIAL As Byte = 1 '需要只对指定系列号的卡操作
Dim NEEDKEY As Byte = 2 '需要用密码认证
Dim LOCKBIT As Byte = 4 '锁定配置块或数据块,仅对 t5557_init,t5557_write ,t5557_changekey函数有效
Dim KEYENABLE As Byte = 8 '启用本卡的密码功能
Dim RESETCARD As Byte = 16 '操作成功后重启卡片
二、轻松读取T5557卡块数据
Private Sub button1_Click(sender As Object, e As EventArgs) Handles button1.Click
Dim status As Byte '存放返回值
Dim myctrlword As Byte = 0 '控制字
Dim oldpicckey(3) As Byte '密码
Dim mypiccserial(5) As Byte '卡序列号
Dim mypiccdata(49) As Byte '读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),及最多返回12个块的数据
Dim mypiccblockflag(1) As Byte '指定读哪一块
Dim j As Integer
Dim i As Integer
Dim PasswStr As String = textBox14.Text.Trim()
Dim seriaStr As String = textBox15.Text.Trim()
If checkBox1.Checked Then '本次操作需要密码验证
myctrlword = myctrlword + NEEDKEY
Try
oldpicckey(0) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16))
oldpicckey(1) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16))
oldpicckey(2) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16))
oldpicckey(3) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16))
Catch
MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox14.Select()
Return
End Try
End If
If (checkBox2.Checked) Then '仅操作指定卡号的卡
Try
myctrlword = myctrlword + NEEDSERIAL
mypiccserial(0) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16))
mypiccserial(1) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16))
mypiccserial(2) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16))
mypiccserial(3) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16))
mypiccserial(4) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(8, 2), 16))
mypiccserial(5) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(10, 2), 16))
Catch
MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox15.Select()
Return
End Try
End If
j = 0
mypiccblockflag(0) = 0
For i = 0 To 7
If (myCheckBox(i).Checked) Then
mypiccblockflag(0) = mypiccblockflag(0) + Math.Pow(2, i)
j = j + 1
End If
Next
mypiccblockflag(1) = 0
For i = 0 To 3
If (myCheckBox(8 + i).Checked) Then
mypiccblockflag(1) = mypiccblockflag(1) + Math.Pow(2, i + 1)
j = j + 1
End If
Next
status = t5557_read(myctrlword, mypiccserial(0), oldpicckey(0), mypiccblockflag(0), mypiccdata(0))
If (status = 0) Then
Dim blockdata As String = ""
For i = 0 To mypiccdata(1) - 1
blockdata = blockdata + mypiccdata(2 + i).ToString("X2")
Next
j = 0
For i = 0 To 11
If (myCheckBox(i).Checked) Then
myTextBox(i).Text = blockdata.Substring(j, 8)
j = j + 8
End If
Next
seriaStr = ""
For i = 0 To 5
seriaStr = seriaStr + mypiccserial(i).ToString("X2")
Next
idr_beep(30)
MessageBox.Show("读卡成功,卡无线转输分频比:" + mypiccdata(0).ToString("D") + ",卡号:" + seriaStr, "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageErrInf(status)
End If
End Sub
三、轻松写T5557卡
Private Sub button3_Click(sender As Object, e As EventArgs) Handles button3.Click
Dim status As Byte '存放返回值
Dim myctrlword As Byte = 0 '控制字
Dim oldpicckey(3) As Byte '密码
Dim mypiccserial(5) As Byte '卡序列号
Dim mypiccdata(49) As Byte '写卡数据缓冲
Dim mypiccblockflag(1) As Byte '指定读哪一块
Dim j As Integer
Dim i As Integer
Dim PasswStr As String = textBox14.Text.Trim()
Dim seriaStr As String = textBox15.Text.Trim()
Dim chtxt As Integer = chedkdata()
If chtxt <> 100 Then
MessageBox.Show("写卡数据输入错误,请重新输入!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
myTextBox(chtxt).Select()
Return
End If
If checkBox1.Checked Then '本次操作需要密码验证
myctrlword = myctrlword + NEEDKEY
Try
oldpicckey(0) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16))
oldpicckey(1) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16))
oldpicckey(2) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16))
oldpicckey(3) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16))
Catch
MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox14.Select()
Return
End Try
End If
If (checkBox2.Checked) Then '仅操作指定卡号的卡
Try
myctrlword = myctrlword + NEEDSERIAL
mypiccserial(0) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16))
mypiccserial(1) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16))
mypiccserial(2) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16))
mypiccserial(3) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16))
mypiccserial(4) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(8, 2), 16))
mypiccserial(5) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(10, 2), 16))
Catch
MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox15.Select()
Return
End Try
End If
j = 0
mypiccblockflag(0) = 0
For i = 0 To 7
If (myCheckBox(i).Checked) Then
mypiccblockflag(0) = mypiccblockflag(0) + Math.Pow(2, i)
j = j + 1
End If
Next
mypiccblockflag(1) = 0
For i = 0 To 3
If (myCheckBox(8 + i).Checked) Then
mypiccblockflag(1) = mypiccblockflag(1) + Math.Pow(2, i + 1)
j = j + 1
End If
Next
Dim WriteStr As String = ""
For i = 0 To 11
If (myCheckBox(i).Checked) Then
WriteStr = WriteStr + myTextBox(i).Text
End If
Next
For i = 0 To (WriteStr.Length / 2) - 1
mypiccdata(i) = Convert.ToByte(Convert.ToInt32(WriteStr.Substring(i * 2, 2), 16))
Next
status = t5557_write(myctrlword, mypiccserial(0), oldpicckey(0), mypiccblockflag(0), mypiccdata(0))
If (status = 0) Then
seriaStr = ""
For i = 0 To 5
seriaStr = seriaStr + mypiccserial(i).ToString("X2")
Next
idr_beep(30)
MessageBox.Show("卡号:" + seriaStr + "写卡成功!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageErrInf(status)
End If
End Sub
四、将T5557卡配置成HID、ID卡
Private Sub button8_Click(sender As Object, e As EventArgs) Handles button8.Click
Dim status As Byte '存放返回值
Dim myctrlword As Byte = 0 '控制字
Dim oldpicckey(3) As Byte '旧密码
Dim newpicckey(3) As Byte '新密码
Dim mypiccserial(5) As Byte '卡序列号
Dim PasswStr As String = textBox14.Text.Trim()
Dim seriaStr As String = textBox15.Text.Trim()
Dim newpassw As String = textBox20.Text.Trim()
Dim newuidstr As String = textBox17.Text.Trim()
If checkBox1.Checked Then '本次操作需要密码验证
myctrlword = myctrlword + NEEDKEY
Try
oldpicckey(0) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16))
oldpicckey(1) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16))
oldpicckey(2) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16))
oldpicckey(3) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16))
Catch
MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox14.Select()
Return
End Try
End If
If (checkBox2.Checked) Then '仅操作指定卡号的卡
Try
myctrlword = myctrlword + NEEDSERIAL
mypiccserial(0) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(0, 2), 16))
mypiccserial(1) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(2, 2), 16))
mypiccserial(2) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(4, 2), 16))
mypiccserial(3) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(6, 2), 16))
mypiccserial(4) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(8, 2), 16))
mypiccserial(5) = Convert.ToByte(Convert.ToInt32(seriaStr.Substring(10, 2), 16))
Catch
MessageBox.Show("卡号输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox15.Select()
Return
End Try
End If
If (checkBox11.Checked) Then '修改卡片密码
Try
myctrlword = myctrlword + KEYENABLE
newpicckey(0) = Convert.ToByte(Convert.ToInt32(newpassw.Substring(0, 2), 16))
newpicckey(1) = Convert.ToByte(Convert.ToInt32(newpassw.Substring(2, 2), 16))
newpicckey(2) = Convert.ToByte(Convert.ToInt32(newpassw.Substring(4, 2), 16))
newpicckey(3) = Convert.ToByte(Convert.ToInt32(newpassw.Substring(6, 2), 16))
Catch
MessageBox.Show("新密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox20.Select()
Return
End Try
End If
myctrlword = myctrlword + RESETCARD '操作后重启卡片,否则在制卡后,需要拿开卡片重放才能成功读ID卡
If (radioButton3.Checked) Then
Dim myuid(4) As Byte '写入的新EM4100卡号
Try
myuid(0) = Convert.ToByte(Convert.ToInt32(textBox16.Text.Substring(0, 2), 16))
Catch
MessageBox.Show("产家标识输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox16.Select()
Return
End Try
Try
myuid(1) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(0, 2), 16))
myuid(2) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(2, 2), 16))
myuid(3) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(4, 2), 16))
myuid(4) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(6, 2), 16))
Catch
MessageBox.Show("新卡号输入错误,请输入8位16进制数的卡号!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox17.Select()
Return
End Try
status = t5557_to4100(myctrlword, mypiccserial(0), oldpicckey(0), newpicckey(0), myuid(0))
If (status = 0) Then
idr_beep(50)
MessageBox.Show("卡号:" + System.Convert.ToString(myuid(1) * 256 * 256 * 256 + myuid(2) * 256 * 256 + myuid(3) * 256 + myuid(4)) + " 写卡成功变成ID卡!不能再用t5557的指令读写此卡,可重新设置配置块恢复t5557卡功能。", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageErrInf(status)
End If
Else
Dim myuid(6) As Byte '写入的新HID卡号
Try
myuid(0) = Convert.ToByte(Convert.ToInt32(textBox16.Text.Substring(0, 2), 16))
Catch
MessageBox.Show("HID卡号位数错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox16.Select()
Return
End Try
Try
myuid(1) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(0, 2), 16))
myuid(2) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(2, 2), 16))
myuid(3) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(4, 2), 16))
myuid(4) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(6, 2), 16))
myuid(5) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(8, 2), 16))
myuid(6) = Convert.ToByte(Convert.ToInt32(newuidstr.Substring(10, 2), 16))
Catch
MessageBox.Show("新卡号输入错误,请输入12位16进制数的卡号!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox17.Select()
Return
End Try
status = t5557_tohid(myctrlword, mypiccserial(0), oldpicckey(0), newpicckey(0), myuid(0))
If (status = 0) Then
idr_beep(50)
MessageBox.Show("卡号:" + System.Convert.ToString(myuid(3) * 256 * 256 * 256 + myuid(4) * 256 * 256 + myuid(5) * 256 + myuid(6)) + " 写卡成功变成HID卡!不能再用t5557的指令读写此卡,可重新设置配置块恢复t5557卡功能。", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageErrInf(status)
End If
End If
End Sub
五、初始化T5557卡
Private Sub button9_Click(sender As Object, e As EventArgs) Handles button9.Click
Dim status As Byte '存放返回值
Dim oldpicckey(3) As Byte '旧密码
Dim newpicckey(3) As Byte '启用的新密码
Dim mypiccserial(5) As Byte '卡序列号
Dim mypiccdata(3) As Byte '配置值
Dim PasswStr As String = textBox14.Text.Trim()
Dim NewPass As String = textBox21.Text.Trim()
Dim ConfStr As String = textBox18.Text.Trim()
Dim myctrlword As Byte = 0 '控制字
If (checkBox1.Checked) Then '本次操作需要密码验证
myctrlword = myctrlword + NEEDKEY
Try
oldpicckey(0) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(0, 2), 16))
oldpicckey(1) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(2, 2), 16))
oldpicckey(2) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(4, 2), 16))
oldpicckey(3) = Convert.ToByte(Convert.ToInt32(PasswStr.Substring(6, 2), 16))
Catch
MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox14.Select()
Return
End Try
End If
If (checkBox13.Checked) Then '卡片启用新密码
myctrlword = myctrlword + KEYENABLE
Try
newpicckey(0) = Convert.ToByte(Convert.ToInt32(NewPass.Substring(0, 2), 16))
newpicckey(1) = Convert.ToByte(Convert.ToInt32(NewPass.Substring(2, 2), 16))
newpicckey(2) = Convert.ToByte(Convert.ToInt32(NewPass.Substring(4, 2), 16))
newpicckey(3) = Convert.ToByte(Convert.ToInt32(NewPass.Substring(6, 2), 16))
Catch
MessageBox.Show("认证密码输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox21.Select()
Return
End Try
End If
Try
mypiccdata(0) = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(0, 2), 16))
mypiccdata(1) = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(2, 2), 16))
mypiccdata(2) = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(4, 2), 16))
mypiccdata(3) = Convert.ToByte(Convert.ToInt32(ConfStr.Substring(6, 2), 16))
Catch
MessageBox.Show("配置值输入错误!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
textBox18.Select()
Return
End Try
status = t5557_init(myctrlword, mypiccserial(0), oldpicckey(0), mypiccdata(0), newpicckey(0))
If (status = 0) Then
Dim seriaStr As String = ""
For i = 0 To 5
seriaStr = seriaStr + mypiccserial(i).ToString("X2")
Next
idr_beep(30)
MessageBox.Show("卡号:" + seriaStr + "配置成功!", "提示:", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageErrInf(status)
End If
End Sub