利用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.31.1 java内存的主要划分
java内存的主要划分:class文件加载到方法区,方法区还存放静态变量和常量,方法区开始执行程序,当调用方法时,会将该方法的栈帧压到栈区,该栈帧中存放局部变量,当方法中new出一个对象,则会在堆中开 ...
- Android 文字绘制(DrawText)技术总结
这里的绘制文字不是直接调用TextView.setText(String content)去展示文字内容.而是在View上面通过 canvas.drawText(text, x, y,textPain ...
- Centos7.2部署.Net Core2.0 WebApi
部署前准备 1.VisualStudio2017+.netcore2.0SDK 2.Centos7.2 3.SecureCRT,Xftp(根据自己喜好) 创建WebApi项目 修改Program.cs ...
- C# 匿名对象(匿名类型)、var、动态类型 dynamic
本文是要写的下篇<C#反射及优化用法>的前奏,不能算是下一篇文章的基础的基础吧,有兴趣的朋友可以关注一下. 随着C#的发展,该语音内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑. ...
- 【RN6752】模拟高清AHD芯片或成为车机新标配
由于目前车机方案倒车后视目前大多为480P标配,画面噪点多有锯齿成像效果差,成为行业的难言之痛.2012年底,浙江大华宣布发布一项具备完全自主知识产权的安防行业高清视频传输规范--HDCVI--Hig ...
- JSON取值(key是中文或者数字)方式详解
JSON取值(key是中文或者数字)方式详解 先准备一个json对象用于演示 var json = {'name':'zhangsan', '年龄':23, 404:'你可能迷路了'}; 使用JS中w ...
- 微软微服务eShopOnContainers示例之EventBusRabbitMq解析与实践
eShopOnContainers eShopOnContainers是微软官方的微服务架构示例,GitHub地址https://github.com/dotnet-architecture/eSho ...
- cobbler部署安装CentOS6.8
Linux运维:cobbler : 矮哥linux运维群:93324526 学习cobbler的话,必须先搞懂kickstart,原理不是,不懂如何排错. kickstart部署请点击这里 1. Co ...
- vue中组件的四种方法总结
希望对大家有用 全局组件的第一种写法 html: <div id = "app"> <show></show></div> js: ...
- 转: 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)
转载请注明出处: volatile用处说明 在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程 ...