贴一个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 解释一下程序,
由于二代证的ATTRIB操作非标,所以不能直接用PN532提供的InListPassiveTarget等上层指令来选卡,
只能靠自己设置寄存器,并通过InCommunicateThru底层通讯,发送ATQB和ATTRIB,完成选卡操作。 学习了,最近可能也要研究这块 读过公交卡号,身份证还没试过。。。 这个帖子很强。值得参考! 非常感谢,最近也要弄PN532了 这个帖子很强。值得参考! 终于有这样的强帖了。之前也做过类似的
多谢楼主分享 谢谢楼主分享 mark!多谢分享! 多谢分享,顶一下 奇怪, 我用楼主的代码失败,返回全部是-20 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 cqsrmxxzyx 发表于 2015-10-31 19:04
根据libnfc的代码来看,-20应该是射频通讯错误。不知你直接用nfc-poll工具能不能寻到卡?
...
可能跟天线有关,需要调整寄存器
http://www.amobbs.com/forum.php?mod=viewthread&tid=5635844&page=1#pid8837627 {:smile:}!!!!!!!!!!!!!! 学习研究 身份证读取ID号,mark 为啥我返回都是-20? PN532读取二代证UID能否实现,现在正在测试这个,但是05 00 00 71 FF不知到如何发送,直接发送是没有反应的,请赐教,谢谢!
有些身份证可以读,有些读不了。试了几个,也没有搞清楚差别在哪里。 zstein 发表于 2017-1-6 23:40
有些身份证可以读,有些读不了。试了几个,也没有搞清楚差别在哪里。
可能是pn532模块的问题,有些模块读type b的卡信号非常差。 肯定不是天线本身的问题,天线问题只是在不同位置读卡效果差异比较大,稳定性差。
不会出现一直读不到。数据都可以监听到,主要是芯片无法解码。 你好,我想问一下,关于你发的PN532读身份证id的程序。有两个地方,第一,是PN53X_REG_CIU_RxThreshold的值,你写了77,读回来是69,我查了数据手册,有一位是只读的。第二,是ATQB指令,你用InCommunicateThru通讯,我用串口调试模块直接发送,但卡返回的数据不对,我可能用错指令了,你能举个例子吗? 请问大哥,这是直接操作PN532? 可以直接发一下你的可执行文件吗? 可以帮忙编译一下直接在WINdows下运行的吗?谢谢了 chauncey 发表于 2017-4-7 09:34
你好,我想问一下,关于你发的PN532读身份证id的程序。有两个地方,第一,是PN53X_REG_CIU_RxThreshold的值 ...
寄存器配置都是从原来的帖子(文章开头的链接)里面来的,我也不是很懂 cardtech 发表于 2017-4-13 10:17
可以帮忙编译一下直接在WINdows下运行的吗?谢谢了
windows需要移植libnfc,我没有试过 好吧。
那我想问一下,你给的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指令为例子。谢谢 chauncey 发表于 2017-4-14 22:10
好吧。
那我想问一下,你给的C程序里的nfc_initiator_transceive_bytes(pnd, cmd_atqb, sizeof(cmd_atqb),...
我的程序里面把libnfc的easy_frame功能关掉了,所以CRC都是在程序里面自己算的,底层对应的是不自动添加CRC的指令。 好的,我再调试一下吧。
我现在没有用你的程序在linux上跑,我现在是根据你的方法用串口模块发相应的指令,没成功。
你说你把libnfc的easy_frame关了,那是不是我也要再做相应的处理?还是你上面给出的编译命令就已经做处理了,我想先在linux上跑成功,再看看串口发的是什么数据 关掉easy_frame就是不自动计算的CRC的意思,你可以跟一下libnfc的代码就知道了。 好的,非常感谢 楼主,你用的PN532是那种红色正方形的还是那种长方形的。不知道是不是板子的缘故,没弄出来。
chauncey 发表于 2017-6-4 09:48
楼主,你用的PN532是那种红色正方形的还是那种长方形的。不知道是不是板子的缘故,没弄出来。
...
一般来说天线面积大的信号会好一些,但也要看匹配调得好不好。
之前在某宝买过几次模块,各家的即使看起来差不多的模块,信号也有很大差别,有些信号差可能是抄板的,反正比较碰运气了。 非常感谢分享,学习了。 chauncey 发表于 2017-6-4 09:48
楼主,你用的PN532是那种红色正方形的还是那种长方形的。不知道是不是板子的缘故,没弄出来。
...
红色的一般情况是不行,偶尔可以。白色的没问题。同时谢谢楼主。
34480016 发表于 2017-7-18 13:43
红色的一般情况是不行,偶尔可以。白色的没问题。同时谢谢楼主。
感谢,我也试了白色的了,好用。同时,我也分享一个别人软件吧,不用自己配置。
好像串口模块要用cp2102的才行。 这个帖子很强。值得参考!
谢谢分享,值得参考! chauncey 发表于 2017-8-3 07:25
感谢,我也试了白色的了,好用。同时,我也分享一个别人软件吧,不用自己配置。
好像串口模块要用cp2102 ...
感谢分享!!!好的上位机{:lol:} luybpotter 发表于 2018-6-27 21:31
感谢分享!!!好的上位机
资源共享嘛 请教下大神,读取到ID后,能不能做到得知身份证相关信息呢?
页:
[1]