cqsrmxxzyx 发表于 2015-2-5 00:06:31

贴一个PN532 读取二代证 UID 的完整C程序

最近在调试PN532读取二代证UID的程序,看到坛友pengjun334曾经也研究过这个问题,并给出了很有价值的信息
http://www.amobbs.com/forum.php?mod=viewthread&tid=5588921

在他的基础上,我也成功地用PN532+libnfc读取了二代证,在此表示感谢,并分享一下完整的代码。



只要一个C文件,需要libnfc才能编译运行,编译方法同libnfc的examples一样,linux下的命令为
gcc emu-atqb.c -o emu-atqb `pkg-config --cflags --libs libnfc`

运行效果如图:


最后一行就是UID及其CRC

cqsrmxxzyx 发表于 2015-2-5 00:11:00

解释一下程序,
由于二代证的ATTRIB操作非标,所以不能直接用PN532提供的InListPassiveTarget等上层指令来选卡,
只能靠自己设置寄存器,并通过InCommunicateThru底层通讯,发送ATQB和ATTRIB,完成选卡操作。

llj1007 发表于 2015-2-5 08:42:17

学习了,最近可能也要研究这块

youthdou 发表于 2015-2-5 09:06:17

读过公交卡号,身份证还没试过。。。

throg 发表于 2015-3-10 12:26:02

这个帖子很强。值得参考!

flotox 发表于 2015-3-21 12:56:39

非常感谢,最近也要弄PN532了

videofun 发表于 2015-5-15 06:28:24

这个帖子很强。值得参考!

90soso 发表于 2015-5-15 09:10:27

终于有这样的强帖了。之前也做过类似的

zwjiang8212 发表于 2015-5-15 09:28:31

多谢楼主分享

plaman801123 发表于 2015-5-20 23:13:54

谢谢楼主分享

nil00 发表于 2015-8-15 21:47:00

mark!多谢分享!

dun2010 发表于 2015-8-17 16:48:45

多谢分享,顶一下

34480016 发表于 2015-10-25 10:47:16

奇怪, 我用楼主的代码失败,返回全部是-20

cqsrmxxzyx 发表于 2015-10-31 19:04:32

34480016 发表于 2015-10-25 10:47
奇怪, 我用楼主的代码失败,返回全部是-20

根据libnfc的代码来看,-20应该是射频通讯错误。不知你直接用nfc-poll工具能不能寻到卡?

00151 /* Error codes */
00156 #define NFC_SUCCESS      0
00157
00161 #define NFC_EIO       -1
00162
00166 #define NFC_EINVARG   -2
00167
00171 #define NFC_EDEVNOTSUPP   -3
00172
00176 #define NFC_ENOTSUCHDEV   -4
00177
00181 #define NFC_EOVFLOW   -5
00182
00186 #define NFC_ETIMEOUT      -6
00187
00191 #define NFC_EOPABORTED      -7
00192
00196 #define NFC_ENOTIMPL      -8
00197
00201 #define NFC_ETGRELEASED   -10
00202
00206 #define NFC_ERFTRANS      -20
00207
00211 #define NFC_EMFCAUTHFAIL    -30
00212
00216 #define NFC_ESOFT   -80
00217
00221 #define NFC_ECHIP   -90

34480016 发表于 2015-10-31 22:41:11

cqsrmxxzyx 发表于 2015-10-31 19:04
根据libnfc的代码来看,-20应该是射频通讯错误。不知你直接用nfc-poll工具能不能寻到卡?

...

可能跟天线有关,需要调整寄存器
http://www.amobbs.com/forum.php?mod=viewthread&tid=5635844&page=1#pid8837627

yick 发表于 2015-10-31 23:15:48

{:smile:}!!!!!!!!!!!!!!

sml009 发表于 2015-11-14 13:30:49

学习研究

cumthe 发表于 2015-11-16 11:10:11

身份证读取ID号,mark

linglingkaimen 发表于 2016-6-22 11:46:46

为啥我返回都是-20?

anrey337 发表于 2017-1-2 20:08:51

PN532读取二代证UID能否实现,现在正在测试这个,但是05 00 00 71 FF不知到如何发送,直接发送是没有反应的,请赐教,谢谢!

zstein 发表于 2017-1-6 23:40:05

有些身份证可以读,有些读不了。试了几个,也没有搞清楚差别在哪里。

cqsrmxxzyx 发表于 2017-1-7 10:24:03

zstein 发表于 2017-1-6 23:40
有些身份证可以读,有些读不了。试了几个,也没有搞清楚差别在哪里。

可能是pn532模块的问题,有些模块读type b的卡信号非常差。

zstein 发表于 2017-1-7 12:14:12

肯定不是天线本身的问题,天线问题只是在不同位置读卡效果差异比较大,稳定性差。
不会出现一直读不到。数据都可以监听到,主要是芯片无法解码。

chauncey 发表于 2017-4-7 09:34:15

你好,我想问一下,关于你发的PN532读身份证id的程序。有两个地方,第一,是PN53X_REG_CIU_RxThreshold的值,你写了77,读回来是69,我查了数据手册,有一位是只读的。第二,是ATQB指令,你用InCommunicateThru通讯,我用串口调试模块直接发送,但卡返回的数据不对,我可能用错指令了,你能举个例子吗?

cardtech 发表于 2017-4-12 17:08:57

请问大哥,这是直接操作PN532?

cardtech 发表于 2017-4-13 10:12:03

可以直接发一下你的可执行文件吗?

cardtech 发表于 2017-4-13 10:17:36

可以帮忙编译一下直接在WINdows下运行的吗?谢谢了

cqsrmxxzyx 发表于 2017-4-14 17:34:41

chauncey 发表于 2017-4-7 09:34
你好,我想问一下,关于你发的PN532读身份证id的程序。有两个地方,第一,是PN53X_REG_CIU_RxThreshold的值 ...

寄存器配置都是从原来的帖子(文章开头的链接)里面来的,我也不是很懂

cqsrmxxzyx 发表于 2017-4-14 17:35:05

cardtech 发表于 2017-4-13 10:17
可以帮忙编译一下直接在WINdows下运行的吗?谢谢了

windows需要移植libnfc,我没有试过

chauncey 发表于 2017-4-14 22:10:54

好吧。
那我想问一下,你给的C程序里的nfc_initiator_transceive_bytes(pnd, cmd_atqb, sizeof(cmd_atqb), recv, sizeof(recv), -1);这个函数是对应InCommunicateThru还是InDataExchange指令?这两指令唯一的区别是InCommunicateThru会自动加上两字节CRC检验(就是你程序中的cmd_atqb[]中的0x71, 0xff;cmd_attrib[]中对的0xf3, 0x10;cmd_uid[]中的0x57 , 0x44)。所以,我想请教一下,nfc_initiator_transceive_bytes这个函数实现的功能,是不是实质上你调用的是InDataExchange指令控制PN532发送数据?对应成串口发送的完整数据是不是(00 00 FF 07 F9 D4 40 00 05 00 00 71 FF 77 00)以ATQB指令为例子。谢谢

cqsrmxxzyx 发表于 2017-4-15 23:07:01

chauncey 发表于 2017-4-14 22:10
好吧。
那我想问一下,你给的C程序里的nfc_initiator_transceive_bytes(pnd, cmd_atqb, sizeof(cmd_atqb),...

我的程序里面把libnfc的easy_frame功能关掉了,所以CRC都是在程序里面自己算的,底层对应的是不自动添加CRC的指令。

chauncey 发表于 2017-4-16 17:53:44

好的,我再调试一下吧。
我现在没有用你的程序在linux上跑,我现在是根据你的方法用串口模块发相应的指令,没成功。
你说你把libnfc的easy_frame关了,那是不是我也要再做相应的处理?还是你上面给出的编译命令就已经做处理了,我想先在linux上跑成功,再看看串口发的是什么数据

cqsrmxxzyx 发表于 2017-4-16 23:16:20

关掉easy_frame就是不自动计算的CRC的意思,你可以跟一下libnfc的代码就知道了。

chauncey 发表于 2017-4-19 09:09:51

好的,非常感谢

chauncey 发表于 2017-6-4 09:48:44

楼主,你用的PN532是那种红色正方形的还是那种长方形的。不知道是不是板子的缘故,没弄出来。

cqsrmxxzyx 发表于 2017-6-4 11:22:44

chauncey 发表于 2017-6-4 09:48
楼主,你用的PN532是那种红色正方形的还是那种长方形的。不知道是不是板子的缘故,没弄出来。
...

一般来说天线面积大的信号会好一些,但也要看匹配调得好不好。
之前在某宝买过几次模块,各家的即使看起来差不多的模块,信号也有很大差别,有些信号差可能是抄板的,反正比较碰运气了。

dengfeng5357 发表于 2017-7-15 12:15:38

非常感谢分享,学习了。

34480016 发表于 2017-7-18 13:43:48

chauncey 发表于 2017-6-4 09:48
楼主,你用的PN532是那种红色正方形的还是那种长方形的。不知道是不是板子的缘故,没弄出来。
...

红色的一般情况是不行,偶尔可以。白色的没问题。同时谢谢楼主。

chauncey 发表于 2017-8-3 07:25:50

34480016 发表于 2017-7-18 13:43
红色的一般情况是不行,偶尔可以。白色的没问题。同时谢谢楼主。

感谢,我也试了白色的了,好用。同时,我也分享一个别人软件吧,不用自己配置。
好像串口模块要用cp2102的才行。

bg8eqb 发表于 2018-4-25 08:10:48

这个帖子很强。值得参考!

QianSong 发表于 2018-6-11 18:57:07


谢谢分享,值得参考!

luybpotter 发表于 2018-6-27 21:31:54

chauncey 发表于 2017-8-3 07:25
感谢,我也试了白色的了,好用。同时,我也分享一个别人软件吧,不用自己配置。
好像串口模块要用cp2102 ...

感谢分享!!!好的上位机{:lol:}

chauncey 发表于 2018-8-8 11:56:11

luybpotter 发表于 2018-6-27 21:31
感谢分享!!!好的上位机

资源共享嘛

Thisis小杰 发表于 2018-8-16 18:15:03

请教下大神,读取到ID后,能不能做到得知身份证相关信息呢?
页: [1]
查看完整版本: 贴一个PN532 读取二代证 UID 的完整C程序