二代身份证读卡器开发小结

最近用RC531开发了一款可以同时读IC卡和身份证的读卡器。网上读IC卡的程序很多,没什么好介绍的。这里总结下读身份证要注意的几个问题。

我做的身份证读卡器只是读身份证的ID号,身份证的内部内容是无法读出的。

身份证读卡器的程序流程如下:

先发送0x05,0x00,0x00询卡命令后,身份证返回12字节卡类型代码,不同身份证返回的数据不一样。比如我对两个身份证发送询卡命令后分别返回

0x50 0x00 0x00 0x00 0x00 0xd1 0x03 0x86 0x0c 0x00 0x80 0x80

0x50 0x00 0x00 0x00 0x00 0xd1 0x03 0x86 0x07 0x00 0x80 0x90

询卡成功后,发送SELECT命令:0x1d 0x00 0x00 0x00 0x00 0x00 0x08 0x01 0x08 对二代身份证进行选卡操作。这时身份证返回的第一个字节应该等于SELECT命令的最后一个字节0x08,根据这个条件来判断SELECT命令是否操作成功。

最后发送GUID命令:0x00 0x36 0x00 0x00 0x08,身份证会返回10字节数据,其中前8字节就是身份证的唯一ID,后两字节是0x90 0x00。可以用后两字节来判断得到的是否是身份证ID。

要注意的是二代身份证是TYPEB卡,但是用TYPEB卡的HALT命令对它不起作用。把身份证放在读卡器上会一直读卡。这个问题只能用软件解决,比如在500ms内检测到同一个ID号,只输出一次韦根信号。

我在测试时发现,有时把身份证放在读卡器上,会读不到卡。但是程序是一直循环发送询卡命令,SELECT命令,GUID命令的。我分析原因应该是身份证内部芯片死机了。因为身份证内部电路是靠射频供电的,如果读卡器一直发送射频信号,当身份证内部芯片死机后,由于外部一直有射频信号,所以内部芯片一直有电压,芯片也一直维持死机状态,即使不断重新发送命令也无济于事。解决这个问题的办法就是在每次发送询卡命令,SELECT命令,GUID命令前,先关闭射频信号,延时20ms后再打开射频信号,再延时10ms,然后发送命令。关闭射频信号的目的是让身份证内部电路断电,重新发送射频信号后,让芯片复位。这样修改后每次都能读到ID号。

RC531在读IC卡和二代证时的内部寄存器参数配置如下:

IC卡(TYPEA)

WriteIO(RegTxControl,0x5b);

WriteIO(RegCwConductance,0x3F);

WriteIO(RegModConductance,0x3F);

WriteIO(RegCoderControl,0x19);

WriteIO(RegPreSet16, 0x00);

WriteIO(RegTypeBFraming,0x00);

WriteIO(RegRxControl1,0x73);

WriteIO(RegDecoderControl,0x08);

WriteIO(RegBitPhase,0xAD);

WriteIO(RegRxThreshold,0xFF);

WriteIO(RegBPSKDemControl,0);

WriteIO(RegRxControl2,0x01);

WriteIO(RegRxWait,0x06);

WriteIO(RegChannelRedundancy,0x0F); WriteIO(RegCRCPresetLSB,0x63);

WriteIO(RegCRCPresetMSB,0x63);

WriteIO(RegPreSet25,0x00);

WriteIO(RegMfOutSelect,0x00);

WriteIO(RegPreSet27,0x00);

WriteIO(RegFIFOLevel,0x08);

WriteIO(RegTimerClock,0x07);

WriteIO(RegTimerControl,0x06);

WriteIO(RegTimerReload,0x0A);

WriteIO(RegPreSet2E,0x00);

WriteIO(RegPreSet2F,0x00);

Rc531_PcdSetTmo(1); // short timeout

二代证(TYPEB)

WriteIO(RegBitPhase,0xAD);

WriteIO(RegRxThreshold,0xff);

WriteIO(RegRxControl2,0x01);

WriteIO(RegRxWait,0x06);

WriteIO(RegFIFOLevel,0x08);

WriteIO(RegTimerControl,0x06/*0x02*/);

WriteIO(RegTxControl, 0x4b);

WriteIO(RegCoderControl,0x20);

WriteIO(RegRxControl1,0x73);

WriteIO(RegCwConductance, 0x3f);

WriteIO(RegModConductance, 0x03);

WriteIO(RegTypeBFraming, 0x23);

WriteIO(RegDecoderControl, 0x19);

WriteIO(RegBPSKDemControl, 0x3e);

WriteIO(RegChannelRedundancy, 0x2c);

WriteIO(RegCRCPresetLSB, 0xff);

WriteIO(RegCRCPresetMSB, 0xff);

WriteIO(RegClockQControl, 0x07);

Rc531_PcdSetTmo(1);

上面的参数在我做的读卡器里是可以的,读IC卡距离大概8cm,读二代证距离大概4.5cm。有些参数要根据实际电路调整。这里仅做参考。

如果读卡器同时有读IC卡和身份证的功能,要注意在配置参数时,在读IC卡时设置的寄存器在读身份证时必须重新设置。也就是保证在读IC卡和读身份证时设置的是同样的寄存器。否则可能会出现只能读IC卡或只能读身份证的情况。

© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发