利用PN532读取二代证UID
准备工作
芯片选择
NFC芯片,需要支持ISO14443 Type B协议,比如PN532
阅读ISO 14443
重点阅读如下内容:
- 7.3.4.1 状态转换图
- 7.3.5 ~ 7.3.7 REQB相关
- 7.3.9 REQB的响应ATQB
- 7.3.10 ATTRIB命令
- 7.3.11 ATTRIB响应
libnfc
部署
参考官方:http://nfc-tools.org/index.php?title=Libnfc
Tips: 编译时请使用./configure --with-drivers=all --prefix=/usr --sysconfdir=/etc
含义如下:
--with-drivers=all 意思编译所有驱动
--prefix=/usr 安装目录
--sysconfdir=/etc 配置文件目录
使用USB-TTL方式连接
GND <------> GND
5V <------> VCC
TX <------> RX
RX <------> TX
配置Debug日志
有两种方式:
- 在配置文件里设置日志级别
# cat /usr/local/etc/nfc/libnfc.conf
name = “Adafruit PN532 board via UART”
connstring = pn532_uart:/dev/ttyUSB0
allow_intrusive_scan = true
log_level = 3
- 设置环境变量
两种方式设置环境变量:
<1>程序运行前加给变量赋值,比如
LIBNFC_LOG_LEVEL=3 ./examples/nfc-anticol -g
<2>程序内部利用setenv函数设置环境变量,比如
if (debug)
{
setenv("LIBNFC_LOG_LEVEL", "3", 1);
}
添加读取UID逻辑
流程简述
根据网上查阅资料,读取步骤如下:
- 发送REQB
- 接受REQB的响应ATQB
- 发送ATTRIB
- 接受ATTRIB响应
- 发送读取Type B的UID命令
- 接受UID
PN532寄存器设置
网上查阅资料,自己试验,需要在libnfc/chips/pn53x.c文件的pn53x_reset_settings函数中加入:
pn53x_write_register(pnd, PN53X_REG_CIU_Mode, 0xff, 0xff);
pn53x_write_register(pnd, PN53X_REG_CIU_TxAuto, 0xff, 0x00);
pn53x_write_register(pnd, PN53X_REG_CIU_TxMode, 0xff, 0x03);
pn53x_write_register(pnd, PN53X_REG_CIU_RxMode, 0xff, 0x03);
pn53x_write_register(pnd, PN53X_REG_CIU_TypeB, 0xff, 0x03);
pn53x_write_register(pnd, PN53X_REG_CIU_Demod, 0xff, 0x4d);
pn53x_write_register(pnd, PN53X_REG_CIU_GsNOn, 0xff, 0xff);
pn53x_write_register(pnd, PN53X_REG_CIU_CWGsP, 0xff, 0x3f);
pn53x_write_register(pnd, PN53X_REG_CIU_ModGsP, 0xff, 0x18);
pn53x_write_register(pnd, PN53X_REG_CIU_RxThreshold, 0xff, 0x4d);
pn53x_write_register(pnd, PN53X_REG_CIU_ModWidth, 0xff, 0x68);
pn53x_write_register(pnd, PN53X_REG_CIU_ManualRCV, 0xff, 0x10);
读取模块
具体利用libnfc实现相关逻辑,核心代码如下:
uint8_t PUPI[4];
uint8_t REQB[5] = { 0x05, 0x00, 0x00 };
iso14443b_crc_append(REQB, 3);
transmit_bytes(REQB, 5); //发送REQB
memcpy(PUPI, abtRx + 1, 4); //复制ATQB的PUIP
printf("PUPI: ");
print_hex(PUPI, 4);
uint8_t Attrib[11] = { 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01 };
memcpy(Attrib + 1, PUPI, 4);
iso14443b_crc_append(Attrib, 9);
transmit_bytes(Attrib, 11); //发送ATTRIB
uint8_t ReadGUID[7] = {0x00, 0x36, 0x00, 0x00, 0x08};
iso14443b_crc_append(ReadGUID, 5);
transmit_bytes(ReadGUID, 7); //发送读取UID命令
nfc_close(pnd);
nfc_exit(context);
exit(EXIT_SUCCESS);
读取UID
➜ libnfc git:(master) ✗ ./examples/nfc-anticol -g
NFC reader: pn532_uart:/dev/ttyUSB0 opened
Sent bits: 05 00 00 71 ff
Received bits: 50 00 00 00 00 d1 03 00 81 00 70 90 84 10
PUPI: 00 00 00 00
Sent bits: 1d 00 00 00 00 00 08 01 01 32 8d
Received bits: 01 f1 e1
Sent bits: 00 36 00 00 08 57 44
Received bits: 1x xx xx xx xx xx xx xx 90 00 8a 45
参考资料
- 论坛:https://www.amobbs.com/thread-5588921-1-1.html?_dsign=1fd689a6
- PN532官网手册:https://www.nxp.com/docs/en/user-guide/141520.pdf
利用PN532读取二代证UID的更多相关文章
- 用Go语言在Linux下调用新中新DKQ-A16D读卡器,读二代证数据
1.背景 前几天用Python在Linux下成功的获取了二代证数据,最近正在学Go语言,这两天想着用Go语言也实现一下试看看. 2.开搞C++ 这次就比较简单了,直接把CppDemo里面的SynRea ...
- 用Python在Linux下调用新中新DKQ-A16D读卡器,读二代证数据
1.背景 最近在研究二代证读卡器,手头上的设备是新中新DKQ-A16D,在官网(https://www.onecardok.com.cn/download)逛了一圈,发现Win下的示例,浏览器插件很多 ...
- ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK
看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...
- ASP.NET程序读取二代身份证(附源码)
原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ...
- ASP.NET MVC + EF 利用存储过程读取大数据
ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK 看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, ...
- 利用PHPExcel读取Excel的数据和导出数据到Excel
PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel.也是我们日常开发中,经常会遇到的使用场景.比如有个客户信息表,要批量导出发给同事,我 ...
- .net上传文件,利用npoi读取文件信息到datatable里
整理代码,.net上传文件,利用npoi读取文件到datatable里,使用了FileUpload控件,代码如下: protected void Button1_Click(object sender ...
- 利用Python读取外部数据文件
不论是数据分析,数据可视化,还是数据挖掘,一切的一切全都是以数据作为最基础的元素.利用Python进行数据分析,同样最重要的一步就是如何将数据导入到Python中,然后才可以实现后面的数据分析.数 ...
- Ubuntu10.04中利用V4L2读取摄像头数据并保存成文件【转】
转自:http://blog.chinaunix.net/uid-29339876-id-4042245.html 利用V4L2读取UVC摄像头数据并保存成视频文件,主要参考http://linuxt ...
随机推荐
- 7.21.02 switch语句
switch语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法 switch语法格式如下: switch(expression) { case value : //语句 break ...
- BestCoder Round #34_1002 以及 hdu 5191
枚举最终的W堆积木在哪,确定了区间,那么就需要把高于H的拿走,低于H的补上,高处的积木放到矮的上面,这样最优. 注意多出来的积木可以放在已有积木的前面或者后面,独立成一堆积木,所以需要在n堆积木的前后 ...
- 一只菜鸟的瞎J8封装系列的目录
因为这是一个系列...也就是我们所说的依赖关系.后面很多方法都是基于我前面封装的工具来进行的,所以我列一个目录供大家参考... 一只菜鸟的瞎J8封装系列 一.手把手封装数据层之DButil数据库连接 ...
- 好用的sql
@ 复制表结构 ; --复制表结构和数据 create table table_name_new as select * from <table_name> @ 查看表信息 select ...
- 在JS事件封装时,addEventListener()方法的this问题
最近在写js的类库,模仿的是jquery的编程风格,当封装到事件监听的时候发现遇到了一个问题,代码是这样的: 上面是封装的一个事件委托的代码,我以为上面的封装跟普通的事件监听一样简单,结果我在调用时发 ...
- Windows下mysql忘记root密码
1. 首先检查mysql服务是否启动,若已启动则先将其停止服务,可在开始菜单的运行,使用命令: net stop mysql 打开第一个cmd窗口,切换到mysql的bin目录,运行命令: mysql ...
- Porita详解----Items
Items(项目) 一个item是指从目标网站上爬取的一条单独的数据.例如从京东网站上爬取的一款小米6手机的信息.大家应该对 item (项目)和 item definition(项目定义)做一个区分 ...
- LVS之DR模式实战及高可用性
author:JevonWei 版权声明:原创作品 LVS-DR实现同网段调度web模式 拓扑环境 网络环境 RS1 RIP 192.168.198.138/24 VIP 192.168.198.10 ...
- Linux安装解压缩版jdk
#解压到指定目录 tar zxvf ./jdk-7-Linux-i586.tar.gz -C /usr/lib/jvm 配置环境变量 #vi /etc/profile 编辑文件,在最后添加: ex ...
- 八大排序算法---基于python
本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...