
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)nudBlockValue;try{byte[] data = null;
data = new byte[NfcLibMF_BLOCK_LENGTH];if (card is Mifare)
{
StringBuilder readSB = new StringBuilder();for(byte i=0;i < 45; i++)//我现在的卡包含45个blocks/pages{
((Mifare)card)Read(i, data, 0);
readSBAppendLine(UtilityByteToHex(data, 0, dataLength));
}
tbReadText = readSBToString();
}
}catch (Exception ex)
{
MessageBoxShow(exMessage);
}
}
有个小遗憾就是,如果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 TLV; has 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)
{
cardBytesAddRange(rowCardContentTake(4));
} byte[] cardUid = cardBytesTake(8)ToArray(); string cardUidStr = UtilityByteToHex(cardUid, 0, cardUidLength); byte[] cardMaker = cardBytesSkip(8)Take(8)ToArray(); string cardMakerStr = UtilityByteToHex(cardMaker, 0, cardMakerLength); byte[] memoryBytes = cardBytesSkip(16)ToArray(); byte lockControlByte = memoryBytes[0]; byte lockByteCount = memoryBytes[1];//how many bytes are the lock bytes
byte[] lockBytes = memoryBytesSkip(2)Take(lockByteCount)ToArray(); int nedfLengthByteIndex = 1 + lockByteCount + 1 + 1; byte ndefLength = memoryBytes[nedfLengthByteIndex]; if (ndefLength == 0)//Tag empty
return stringEmpty; byte[] ndefBytes = memoryBytesSkip(nedfLengthByteIndex + 1)Take(ndefLength)ToArray(); byte payloadHeader = ndefBytes[0]; byte payloadTypeLength = ndefBytes[1]; byte payloadLength = ndefBytes[2]; byte[] payloadType = ndefBytesSkip(3)Take(payloadTypeLength)ToArray(); byte[] payloadBytes = ndefBytesSkip(3 + payloadTypeLength)Take(payloadLength)ToArray(); byte languageCodeLength = payloadBytes[0]; byte[] languageCode = payloadBytesSkip(1)Take(languageCodeLength)ToArray(); byte[] tag = payloadBytesSkip(1 + languageCodeLength)Take(payloadLength - languageCodeLength - 1)ToArray(); string tagHex= UtilityByteToHex(tag , 0, tag Length); string tagStr = EncodingUTF8GetString(tag); return tagStr;
}
头文件都是对所有函数的申明,比如说我有一个helloc,默认就应该对应一个helloh,两个文件是一套的,里面有两个函数a()和b(),h文件里面就是对他们的申明,c文件就是对函数体的描述。当在其他工程中用到这些函数时就可以把helloc和helloh拷贝到你的工程目录下,#include "helloh"(这里是引号""不是<>),这样就可以直接使用a()和b()了。
你说的那些网上的资源,如果你能下载到完整的工程文件你就可以把c和h文件移到你的工程中使用,否则是没有办法的。这也是保护自己代码的一种方式吧,通常网络文章或者论文里面常见,只让读者看到函数名称却看不到函数体。
既然你买了模块那么厂家肯定有资料给你的,要么是完整的代码,或者就是 *** 作指令等,找卖家要吧。
要做产品的话你就得完全搞明白模块功能是怎么实现的,然后用散装元件组成你自己的功能模块,用别人的模块都不能叫产品。
有疑问请追问
可以应用Baiduhi告诉我
有时间能够处理你所遇到的工作
相关的要求也能够告诉我
ES:\\84F6390AE45A8CE0375F32FE29C01020
交易提醒:预付定金有风险
以上就是关于电脑读取ic卡芯片方法全部的内容,包括:电脑读取ic卡芯片方法、我想做一个非接触式IC卡,程序中的头文件是怎么来的、用C++编写一个公交公司的公交IC卡管理系统的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)