
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
}
参考解决方案:1、先确定ic卡是否有问题,如可以正常读取其他应用软件;
2、如使用谷歌浏览器,而不能正常读取ic卡,请确认当前ic卡阅读设备与谷歌浏览器是否正常配合工作,可以通过访问设备厂家网站查看支持该ic卡的浏览器;
3、针对谷歌浏览器,可以通过安装插件“Smart Card Reader”进行读取;
4、检查ic卡阅读设备是否已安装驱动并启用;
5、根据ic卡阅读设备安装提供商提供的说明安装该设备,检查电力供应是否正常;
6、如ic卡掘罩阅读判陵闹设备与谷歌浏览器正常配合,汪团但还是无法读取ic卡,请重启计算机,检查是否能够正常读取ic卡。
1、打开软件“Ickgl.exe”,出现“IC卡管理”界面如图1所示2
/9
2、点击“揭示编辑”进入“行车安全揭示输入”界面,如图2
3
/9
3、点击“读文件”选择要写入的文件,森拍如图3
4
/9
4点击“写卡”当写卡完成,会出现“写卡成功”界面,如图4,此时点击确定即可
5
/9
5、写卡成功后,点击“卡内信息显示”出现界面 如图5,此时点击“读文件”对写入卡内信息,进行核对(与写入文件一致)
(拔下IC卡,断开电脑与USB双口读卡器的连接)
京东
根据文章内容为您推荐
广告
智络(zhiluo) ID卡读卡器 IC卡读卡器 id卡发卡器 usb接口 会员卡阅读器 黑色IC感应读卡器
¥58 元¥199 元
查看
6
/9
6、把IC(已写入揭示)卡插入DMI,DMI将自动读取IC卡,则首春谈文字“IC卡”将显示绿色。
7、点击“设定”,再点击“设定”出现如图6所示
7
/9
8、对“车速等级”进行设定后,点击“确认”,出现界面,如图7
8
/9
9、当发送揭示完成后,点击“查询”。选择“3全部揭示”,如图8 所示
9
/9
10、进入“全部揭示信息查询”界面如图9
(查询显示揭示要与上者碰传揭示一致)
拔下IC卡即可
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)