电脑里realtek pcie card reader这个程序是读卡器驱动。
读卡器(Card Reader)是一种读卡设备,由于卡片种类较多,所以读卡器的含义覆盖范围比较广。
根据卡片类型的不同,可以将其分为IC卡读卡器,包括接触式IC卡,遵循ISO7816接口标准非接触式IC卡读卡器,遵循ISO14443接口标准,远距离读卡器,遵循ETC国标GB20851接口标准。
存储卡的接口也不太统一,主要类型有CF卡、SD卡、MiniSD卡、SM卡、Memory Stick卡等。
RFID电子标签阅读器,称之为远距离读卡器,比如ETC系统中,可以在10m内读写车载的IC卡。
存储卡大量应用于智能手机、照相机,广义来讲,智能手机和照相机也成为读卡器。按所存储卡的种类分分为CF卡读卡器、SM卡读卡器、PCMICA卡读卡器以及记忆棒读写器等,还有双槽读卡器可以同时使用两种或两种以上的卡按端口类型分可分为串行口读卡器、并行口读卡器、USB读卡器。
1,读取
我们需要外接一个NFC Reader让Windows可以读取NFC卡片的内容。
因为特殊原因,我们选择了Sony rc-s380 NFC Reader。相关介绍
我们需要下载并安装NFC Port Software,以便我们可以顺利使用上述NFC Reader。
安装之后,我们需要去Github获取一个NFC Port Software的.Net封装包:tijins/NfcLib
解压并运行nfc_lib_sample之后我们可以看到这样一个WindowFrom程序。
因为现在要读取的卡类型试MIFARE,所以我们勾选正确的CheckBox,其他设置保持不变,依次点击上述三个橘色方框按钮。
在红色箭头所指的方向就能看到第一个block的十六进制字符串的数据。
为了读取卡片所有block/page的信息,我们将btRead_Click的代码稍稍修改为:
private void btRead_Click(object sender, EventArgs e)
{
byte block = (byte)nudBlock.Valuetry{byte[] data = null
data = new byte[NfcLib.MF_BLOCK_LENGTH]if (card is Mifare)
{
StringBuilder readSB = new StringBuilder()for(byte i=0i <45i++)//我现在的卡包含45个blocks/pages{
((Mifare)card).Read(i, data, 0)
readSB.AppendLine(Utility.ByteToHex(data, 0, data.Length))
}
tbRead.Text = readSB.ToString()
}
}catch (Exception ex)
{
MessageBox.Show(ex.Message)
}
}
有个小遗憾就是,如果NFC Reader没有连接的时候启动app会抛出异常,而如果app已经启动再拔出然后插入NFC Reader又会无法再读卡除非重启app或者重新初始化。这个需要有点改进。
2,解析
根据上述步骤,我们得到了某张卡的信息如下:
04 C9 02 47 0A C9 5A 84 1D 48 00 00 E1 10 12 00 0A C9 5A 84 1D 48 00 00 E1 10 12 00 01 03 A0 0C
1D 48 00 00 E1 10 12 00 01 03 A0 0C 34 03 0F D1
E1 10 12 00 01 03 A0 0C 34 03 0F D1 01 0B 54 02 01 03 A0 0C 34 03 0F D1 01 0B 54 02 65 6E 32 30 34 03 0F D1 01 0B 54 02 65 6E 32 30 31 38 31 30 01 0B 54 02 65 6E 32 30 31 38 31 30 32 35 FE 00 65 6E 32 30 31 38 31 30 32 35 FE 00 00 00 00 00 31 38 31 30 32 35 FE 00 00 00 00 00 00 00 00 00 32 35 FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(以下省略...)
然后,我们对它做一点移位:
04 C9 02 47 0A C9 5A 84 1D 48 00 00 E1 10 12 00 0A C9 5A 84 1D 48 00 00 E1 10 12 00 01 03 A0 0C
1D 48 00 00 E1 10 12 00 01 03 A0 0C 34 03 0F D1
E1 10 12 00 01 03 A0 0C 34 03 0F D1 01 0B 54 02
01 03 A0 0C 34 03 0F D1 01 0B 54 02 65 6E 32 30
34 03 0F D1 01 0B 54 02 65 6E 32 30 31 38 31 30
01 0B 54 02 65 6E 32 30 31 38 31 30 32 35 FE 00
65 6E 32 30 31 38 31 30 32 35 FE 00 00 00 00 00
31 38 31 30 32 35 FE 00 00 00 00 00 00 00 00 00
32 35 FE 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
可以看出,每一行只有第一列是我们需要的tag信息。
04 C9 02 470A C9 5A 841D 48 00 00E1 10 12 00
01 03 A0 0C
34 03 0F D101 0B 54 0265 6E 32 3031 38 31 3032 35 FE 00
前面的四行是卡的UID以及制造商等信息。我们只需要关心下半段的数据。
01 (Tag: Lock Control TLV)03 (Length: 3 bytes)
A0 0C 34 (Value: Information on position and function of lock bytes)03 (Tag: NDEF Message TLV)
0F (Length: 15 bytes)
D1 01 0B 54 02 65 6E 32 30 31 38 31 30 32 35 FE (Tag: Terminator TLVhas no length field)00
所以,我们得到了NDEF message:D1 01 0B 54 02 65 6E 32 30 31 38 31 30 32 35
NDEF message:
D1 (Header byte of record 1)01 (Type length: 1 byte)
0B (Payload length: 11 bytes)54 (Type: "T")02 65 6E 32 30 31 38 31 30 32 35 (Payload field)
我们再分析最为关键的payload field,如下:
The payload field:02 (Status byte: Text is UTF-8 encoded, Language code has a length of 2 bytes)65 6E (Language code: "en")32 30 31 38 31 30 32 35 (Text: "20181025")
可以用在线工具来验证一下 “32 30 31 38 31 30 32 35 ”
最后,上述步骤,用写C#的实现如下(不保证所有Mifare卡适用):
private string GetNfcTag(List<byte[]>cardContentList)
{
List<byte>cardBytes = new List<byte>() foreach(byte[] rowCardContent in cardContentList)
{
cardBytes.AddRange(rowCardContent.Take(4))
} byte[] cardUid = cardBytes.Take(8).ToArray() string cardUidStr = Utility.ByteToHex(cardUid, 0, cardUid.Length) byte[] cardMaker = cardBytes.Skip(8).Take(8).ToArray() string cardMakerStr = Utility.ByteToHex(cardMaker, 0, cardMaker.Length) byte[] memoryBytes = cardBytes.Skip(16).ToArray() byte lockControlByte = memoryBytes[0] byte lockByteCount = memoryBytes[1]//how many bytes are the lock bytes
byte[] lockBytes = memoryBytes.Skip(2).Take(lockByteCount).ToArray() int nedfLengthByteIndex = 1 + lockByteCount + 1 + 1 byte ndefLength = memoryBytes[nedfLengthByteIndex] if (ndefLength == 0)//Tag empty
return string.Empty byte[] ndefBytes = memoryBytes.Skip(nedfLengthByteIndex + 1).Take(ndefLength).ToArray() byte payloadHeader = ndefBytes[0] byte payloadTypeLength = ndefBytes[1] byte payloadLength = ndefBytes[2] byte[] payloadType = ndefBytes.Skip(3).Take(payloadTypeLength).ToArray() byte[] payloadBytes = ndefBytes.Skip(3 + payloadType.Length).Take(payloadLength).ToArray() byte languageCodeLength = payloadBytes[0] byte[] languageCode = payloadBytes.Skip(1).Take(languageCodeLength).ToArray() byte[] tag = payloadBytes.Skip(1 + languageCode.Length).Take(payloadLength - languageCode.Length - 1).ToArray() string tagHex= Utility.ByteToHex(tag , 0, tag .Length) string tagStr = Encoding.UTF8.GetString(tag) return tagStr
}
① 如使用ZXT3220读卡器,检查读卡器电源是否连接及打开(观察红灯是否长亮),与计算机主机的九针串口是否连接紧密。② 如果计算机主机上面有两个九针的串口,可以把读卡器的接头插在另一个九针串口上(不必关闭电脑);如果计算机主机上面只有一个九针串口,可以将读卡器的九针接头拔出,再重新插一下。
③ 采用以上方法无效的情况下,退出IC卡申报软件,返回至电脑桌面,用鼠标右键点击【我的电脑】→【属性】→【硬件】选项卡→【设备管理器】按钮,在d出的界面中找到【端口】项,查看通讯端口是否设置为COM1或COM2。如果不是,选中其中一个端口,用鼠标右键点击,选择“卸载”命令,然后在左上角的【文件】菜单中点击【扫描检测硬件改动】或“刷新”即可。检索刷新完成后,再重新执行读、写卡 *** 作。
④ 确认是否使用USB转接线(一分二接口),USB转换线需要安装自带驱动,驱动安装成功后可采用方法3进行解决。
⑤ 如果使用的是MCS-C读卡器,在读取IC时提示:“连接读卡器失败”,先按一下读卡器后面黑色的复位键按钮,如果无效在设备管理器中刷新端口, *** 作步骤同方法3(如使用的是PCI接口的COM口建议将端口号改为 COM3、COM4)。
⑥ 如果使用的是GC481读卡器,在读取IC时提示:“连接读卡器失败”, 建议直接在设备管理器中刷新端口, *** 作步骤同方法3(端口号也可为 COM3、COM4)。
⑦ 如果使用的是R801读卡器,在读取IC时提示“连接读卡器失败”,可通过下面的方法进行解决:
确认驱动是否安装正确(驱动安装正确的前提是读卡器的红灯亮)。
查看所使用的电子申报软件的版本是否为:Version 3.09,点击【帮助】菜单→【关于电子申报】查看一下。
如果使用的软件版本正确,读卡仍然提示连接读卡器失败,点击【接口】→【IC卡申报】→【读卡器接口】,查看一下显示的【设置读卡器接口】界面是否为3.09版本软件的接口设置界面(图7-1);如果显示不正确,首先在添加或删除程序项中将“中兴通电子申报信息采集系统(企业端)+纳税人识别号”卸载,然后将位于“C:\Program Files\ZXT_LTD\ZxtTab+企业纳税人识别号”的文件夹(默认路径)删除,再重装3.09版电子申报软件,找到位于“C:\Program Files\ZXT_Ltd\ ZxtTab+企业纳税人识别号\Stable”文件夹中的IcReader.dll文件(图7-2),右键单击此文件点击属性,把此文件属性改为只读(图7-3),再重新读卡。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)