无线通信
前言
我们提到NFC的一些标准,这些标准主要是读卡器和标签卡之间的通信协议。所以我们要对标签卡进行读写就需要了解相关协议。我们先从ISO14443A开始了解,因为目前市面上使用该标准的卡最多。
ISO14443简介
ISO14443分为4个部分协议,这4个部分对应不同的分层。
ISO14443-1: 定义物理特性,可以理解为物理层。
ISO14443-2: 射频电源和信号接口。
ISO14443-3: 初始化和防碰撞。
ISO14443-4: 传输协议。
注意:ISO14443A和ISO14443B都是分成这4个部分,大多数是共用的,只是里面有部分是描述A的,部分是描述B的。
名词解析 PCD: Proximity Coupling Device, 近耦合设备, 简单理解就是读写卡设备。 PICC: Proximity Card, 感应卡,简单理解就是标签卡。 SAK: Select Acknowledge
UID: Unique Identifier, 唯一标识符
命令介绍
对于软件开发者而言,我们主要是研究ISO14443-3和ISO14443-4协议。初始化和防碰撞相关内容在ISO14443-3上。
ISO14443-3协议中定义了相关的时序和命令,我们先不探讨时序,本文主要来了解命令(Command)定义。
REQA/WUPA
读卡器发送REQA或WUPA命令来检查是否有卡存在。命令码如下:
*注意: 只有7个bit
那这两条命令有什么区别呢?
WUPA命令是处于IDLE或HALT状态的卡都会应答,而REQA命令只有处于IDLE状态的卡会应答。标签卡刚上电就处于IDLE状态,当读卡器发送HALT命令之后,标签卡就进入HALT状态(就是休眠状态)。
ANTICOLISION和SELECT
这两条命令是用来进行防碰撞的,所谓的防碰撞就是当有多张卡被检查到时,要如何选择卡。命令格式如下:
Byte1 | Byte2 | Byte3~Byte7 |
SEL | NVB | UID |
(1) SEL:选择码,选择代码分成三个层次,级别一选择代码为0x93,级别二为0x95,级别三为0x97。为什么会有三级呢? 因为一张卡的UID有可能是4Byte,7Byte或10Byte。可能有些人又会有疑问,上面UID字段不是才5Byte吗,如何读出7个和10个字节呢?下面内容会解释。
(2) NVB:有效比特数,指PCD传输了的字节数和比特位数。NVB的高4位表示已经传输的字节数,低4位表示已经传输的bit。比如:00100001, 就是2byte+1bit,总共传输了17bit。当NVB为0x70时,则表示的是SELECT命令。
(3)UID: 唯一ID, 传输的长度根据具体的碰撞情况而定,传输范围在0~40个比特位之间,它会由NVB指出。
防碰撞是用来确定要选择的卡的一个过程,它会循环轮询UID的每个bit,最终确定卡的UID。
HALT
HALT命令用来让卡进入休眠状态。命令格式如下:
CRC_A为两个字节, 这条指令是没有应答的!
ATQA
ATQA命令是REQA或WUPA命令的应答。命令格式如下:
(1)Proprietary coding:这几位留给厂家自定义
(2)UID size bit frame: 指示UID的长度
(3)Bit frame anticollision:防撞比特位,不为0时表示有多张卡响应REQA或WUPA命令。
SAK
SAK是SELECT命令的应答,命令格式如下:
SAK字段定义如下:
通过bit3和bit6来确定UID是否完整,以及PICC是否支持ISO14443-4。
PCD检测PICC流程
PCD检测PICC的主要包含PICC检测、防碰撞和确定PICC类型三个部分。
(1)PCD发出REQA命令,如果有PICC响应ATQA,则表示找到ISO14443A类型的PICC。
(2)进行防碰撞, 防碰撞的过程分成三个级别,第一个级别必须要有,第二和第三级别根据UID的长度而定。
(3)确定PICC类型,该部分主要由PICC发送SAK,然后PCD解析SAK,从而确定PICC是否支持ISO14443-4。
防碰撞流程
(1)上图中的流程1~3设置了SEL和NVB, 然后PCD发送ANTICOLLISION命令。上面解释过NVB的含义,所以0x20表示两个字节,也就对应SEL和NVB这两个字节。
(2)流程4~5会根据收到的数据判断是否有bit冲突。有冲突则要选择该位是0,还是1,然后继续发送ANTICOLLISION命令,直到没有冲突。
(3)没有bit冲突之后,PCD发送SELECT命令,最后收到PICC的SAK。
防碰撞级别
上面说过防碰撞级别,通过下图来更直观地理解。
如果UID为4个字节,则只需发送第一级ANTICOLISION(0x93);如果UID长度为7个字节,则发完第一级ANTICOLISION(0x93), 还要继续发第二级ANTICOLISION(0x95);如果UID长度为10个字节,除了发送第一,二级,还要发送第三级ANTICOLISION(0x97)。
通过多级ANTICOLISION之后才能获取到标签卡(PICC)的完整UID。
总结
单纯看协议可能会比较枯燥,所以建议可以找一份代码,边看代码边阅读协议,比如RC522的参考代码。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !