准备工作

芯片选择

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逻辑

流程简述

根据网上查阅资料,读取步骤如下:

  1. 发送REQB
  2. 接受REQB的响应ATQB
  3. 发送ATTRIB
  4. 接受ATTRIB响应
  5. 发送读取Type B的UID命令
  6. 接受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

参考资料

利用PN532读取二代证UID的更多相关文章

  1. 用Go语言在Linux下调用新中新DKQ-A16D读卡器,读二代证数据

    1.背景 前几天用Python在Linux下成功的获取了二代证数据,最近正在学Go语言,这两天想着用Go语言也实现一下试看看. 2.开搞C++ 这次就比较简单了,直接把CppDemo里面的SynRea ...

  2. 用Python在Linux下调用新中新DKQ-A16D读卡器,读二代证数据

    1.背景 最近在研究二代证读卡器,手头上的设备是新中新DKQ-A16D,在官网(https://www.onecardok.com.cn/download)逛了一圈,发现Win下的示例,浏览器插件很多 ...

  3. ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK

    看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...

  4. ASP.NET程序读取二代身份证(附源码)

    原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ...

  5. ASP.NET MVC + EF 利用存储过程读取大数据

    ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK 看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, ...

  6. 利用PHPExcel读取Excel的数据和导出数据到Excel

    PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel.也是我们日常开发中,经常会遇到的使用场景.比如有个客户信息表,要批量导出发给同事,我 ...

  7. .net上传文件,利用npoi读取文件信息到datatable里

    整理代码,.net上传文件,利用npoi读取文件到datatable里,使用了FileUpload控件,代码如下: protected void Button1_Click(object sender ...

  8. 利用Python读取外部数据文件

      不论是数据分析,数据可视化,还是数据挖掘,一切的一切全都是以数据作为最基础的元素.利用Python进行数据分析,同样最重要的一步就是如何将数据导入到Python中,然后才可以实现后面的数据分析.数 ...

  9. Ubuntu10.04中利用V4L2读取摄像头数据并保存成文件【转】

    转自:http://blog.chinaunix.net/uid-29339876-id-4042245.html 利用V4L2读取UVC摄像头数据并保存成视频文件,主要参考http://linuxt ...

随机推荐

  1. 7.21.02 switch语句

    switch语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法 switch语法格式如下: switch(expression) { case value : //语句 break ...

  2. BestCoder Round #34_1002 以及 hdu 5191

    枚举最终的W堆积木在哪,确定了区间,那么就需要把高于H的拿走,低于H的补上,高处的积木放到矮的上面,这样最优. 注意多出来的积木可以放在已有积木的前面或者后面,独立成一堆积木,所以需要在n堆积木的前后 ...

  3. 一只菜鸟的瞎J8封装系列的目录

    因为这是一个系列...也就是我们所说的依赖关系.后面很多方法都是基于我前面封装的工具来进行的,所以我列一个目录供大家参考... 一只菜鸟的瞎J8封装系列  一.手把手封装数据层之DButil数据库连接 ...

  4. 好用的sql

    @ 复制表结构 ; --复制表结构和数据 create table table_name_new as select * from <table_name> @ 查看表信息 select ...

  5. 在JS事件封装时,addEventListener()方法的this问题

    最近在写js的类库,模仿的是jquery的编程风格,当封装到事件监听的时候发现遇到了一个问题,代码是这样的: 上面是封装的一个事件委托的代码,我以为上面的封装跟普通的事件监听一样简单,结果我在调用时发 ...

  6. Windows下mysql忘记root密码

    1. 首先检查mysql服务是否启动,若已启动则先将其停止服务,可在开始菜单的运行,使用命令: net stop mysql 打开第一个cmd窗口,切换到mysql的bin目录,运行命令: mysql ...

  7. Porita详解----Items

    Items(项目) 一个item是指从目标网站上爬取的一条单独的数据.例如从京东网站上爬取的一款小米6手机的信息.大家应该对 item (项目)和 item definition(项目定义)做一个区分 ...

  8. LVS之DR模式实战及高可用性

    author:JevonWei 版权声明:原创作品 LVS-DR实现同网段调度web模式 拓扑环境 网络环境 RS1 RIP 192.168.198.138/24 VIP 192.168.198.10 ...

  9. Linux安装解压缩版jdk

    #解压到指定目录 tar zxvf ./jdk-7-Linux-i586.tar.gz  -C /usr/lib/jvm 配置环境变量 #vi  /etc/profile 编辑文件,在最后添加: ex ...

  10. 八大排序算法---基于python

    本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...