准备工作

芯片选择

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. java 基础三

    1 运算符 1.1  比较运算符 比较运算符的结果都是boolean类型,也即是要么是true,要么是false. 比较运算符"=="不能写成"=". > ...

  2. python进阶学习(二)

    本节学习图形用户界面 ------------------------ 本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口.这里介绍wxPython : 下载地 ...

  3. JAVA基础-集合(一)

    一.结构 Collection接口为一些单列集合的根接口,其常用子接口为List接口.Set接口.List接口常用实现子类为ArrayList(数组)LinkedList(链表).Set接口常用实现子 ...

  4. ionic项目ios真机部署(不需开发者账号)

    ionic项目ios真机部署(不需开发者账号) 安装ionic和cordova npm install -g ionic npm install -g cordova 创建一个新项目 ionic st ...

  5. 201521123071 《JAVA程序设计》第七周学习总结

    第7周-集合 1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 1.1 Iterator<E> iterator(); //iterator()返回一个实现了It ...

  6. 201521123113《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. 使用NetB ...

  7. 201521123054《Java程序设计》第4周总结

    1. 本周学习总结 2. 书面作业 注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 面向对象设计(大作业1,非常重要) **2.1 将在网上商城购 ...

  8. 201521123110 《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. private不对用户公开进行修改,public用户可以进行修改.代码可以进行继承,即子类继 ...

  9. 201521123100 《Java程序设计》第3周学习总结

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面作 ...

  10. 201521123073 《Java程序设计》第1周学习总结

    1.本章学习总结 你对于本章知识的学习总结 1.Java中使用Scanner处理输入,需要注意如下几个地方 程序开头必须import java.util.Scanner导入Scanner类. 使用Sc ...