NFC已经遍布了我们生活的方方面面,我们的银行卡,公交卡,门禁卡,乃至电动车钥匙,快递包裹等上面随处可见,甚至在各个便利店的冰柜橱窗里也随处可见。
NFC其实是“Near Field Communication”的缩写,翻译成中文就是近场通信。它由飞利浦半导体(现恩智浦半导体公司)、诺基亚和索尼共同研制开发的以RFID及互连技术为基础的一种短距高频的无线电技术。它可以在移动设备、消费类电子产品、PC和智能控件工具间进行近距离无线通信,有效传输距离为10厘米以内。
NFC的传输速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三种。是在单一芯片上结合感应式读卡器、感应式卡片和点对点的功能,能在短距离内与兼容设备进行识别和数据交换。
这项技术最开始让人着迷的地方在于,它的卡片一端可以无需供电,以前工艺还不够好,还需要把它封在一张厚厚的卡片里面,比如我们的门禁卡。如今加持了更为先进的芯片工艺,这种卡片可以轻松的做到指甲盖大小的波纸片。
NFC通信原理
NFC本身是一种无线通信,只不过在无线调制解调的基础上增加了供电功能,我们知道电能是可以通过线圈的磁场感应进行传播的,最早期的器件就是变压器,只不过这里我们把变压器的磁芯移走,只留下了原边和副边的线圈。
传递能量只需要一个固定频率的载波即可,如果想要在这一对线圈之间增加通信,那么可以借鉴无线通信中的调制解调方法,将数字信号调制到提供电能的载波上面,通信双方就可以进行通信了。当然,从机是不可能主动发起通信的,因为它没有电。
其实,我们生活中还有一种将数字信号调制在载波上面进行通信的有线通信,它叫电力载波,也就是我们消费电子中常说的电力猫,它可以通过220V的插排将以太网布满整个网络。
还有,我们现在手机无线充电,其原理跟NFC是一模一样的,只不过因为选择了不同的频率,不同的线圈而已。有些频率是可以传输电能,有些频率适合传递信号。
NFC的卡片分类
ID卡主要用来给NFC读设备读取数据;IC卡里面有专门处理卡片数据的芯片。
ID 卡:仅仅记录卡号,卡内的卡号读取无任何权限,易于仿制。ID 卡「不可写入」数据,其记录内容(卡号)只可由芯片生产厂一次性写入,开发商只可读出卡号加以利用,无法根据系统的实际需要制订新的号码管理制度。
IC 卡:ID内所记录数据的读取,写入均需相应的密码认证,甚至卡片内每个区均有不同的密码保护,全面保护数据安全,IC 卡写数据的密码与读出数据密码可设为不同,提供了良好分级管理方式,确保系统安全。IC 卡不仅可由授权用户读出大量数据,而且亦可由授权用户写入大量数据(如新的卡号,用户的权限,用户资料等),IC 卡所记录内容可反复擦写,IC 卡的安全性远大于 ID 卡。
「IC卡还可再分类」
「M1卡」:普通IC卡,0扇区不可修改,其他扇区可以反复擦写;通常我们使用的门禁卡、电梯卡都是M1卡。M1卡是NXP公司研发的IC卡,全称为NXP Mifare1系列,目前大多数手机厂商使用的NFC芯片都是NXP。
「UID卡」:普通复制卡,可以反复擦写所有扇区,门禁有防火墙则失效。
「CUID」:升级复制卡,可以反复擦写所有扇区,可以穿透大部分防火墙。
「FUID」:高级复制卡,0扇区只能写入一次,写入后变为M1卡。
「UFUID」:超高级复制卡,0扇区只能写入一次,封卡后变为M1卡,不封卡变为UID卡。
M1卡的介绍
对于M1卡,我们如果把无线通信看为底层,从上层来看,M1卡就是一个eeprom。
M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示:
首先,对于第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。
其次,每个扇区的块0、块1、块2为数据块,可用于存贮数据,块3为控制块。
「数据块」可作两种应用:
•用作一般的数据保存,可以进行读、写操作。•用作数据值,可以进行初始化值、加值、减值、读值操作。
「控制块」,包括了密码A、存取控制、密码B。具体结构如下:
每个扇区的「密码」和「存取控制」都是独立的,可以根据实际需要设定各自的密码及存取控制。
存取控制为4个字节(上图中:FF 07 80 69),共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由「密码和存取控制共同决定的。」
「存取控制」中每个块都有相应的三个控制位,也就是每个块的读写控制由3个bit来控制,具体如下表:
上面列表可以看出,当控制位不同的组合时,对应的数据块就会有不同的操作逻辑,比如,当块0的存取控制位为1 0 0时,验证密码A或密码B正确后可读;验证密码B正确后可写;不能进行加值、减值操作。
既然有这么三个bit可以表示数据块的操作逻辑,必然需要一个地方来存储每个数据块对应的3bit,它们就被存储在存取控制的4个字节中,只不过它们的排列方式有点奇怪。我们这里把块0-块3命名为块a-块d,看起来舒服一些。假设:
块a: C1a C2a C3a
块b: C1b C2b C3b
块c: C1c C2c C3c
块d: C1d C2d C3d
那么,在存储控制区域,定义为如下:
「控制块块3」的存取控制与「数据块」(块0、1、2)不同,它的存取控制如下
例如:当块3的存取控制位C13 C23 C33 = 1 0 0时,表示:
密码A:不可读,验证KEYA或KEYB正确后,可写(更改)。
存取控制:验证KEYA或KEYB正确后,可读、可写。
密码B:验证KEYA或KEYB正确后,可读、可写。
RC522的介绍
RC522 通常带有一个具有1KB内存的RFID卡标签和密钥卡标签。最棒的是,它还可以编写标签,因此我们可以在其中存储某种秘密消息。
RC522 采用的是13.56MHz的电磁场,用于与RFID标签(ISO 14443A标准标签)进行通信。阅读器可以通过4引脚串行外围接口(「SPI」)与微控制器进行通信,SPI的最大数据速率为「10Mbps」。它还支持通过I2C和UART协议进行通信。
RC522带有一个中断引脚。这很方便,当标签进入附近时,芯片会提醒我们。
如何操作一个卡片
「复位应答(Answer to request)」
M1射频卡的通讯协议和通讯波特率是定义好的,当有卡片进入读写器的操作范围时,读写器以特定的协议与它通讯,从而确定该卡是否为M1射频卡,即验证卡片的卡型。
「防冲突机制 (Anticollision Loop)」
当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号。
「选择卡片(Select Tag)」
选择被选中的卡的序列号,并同时返回卡的容量代码。
「三次互相确认(3 Pass Authentication)」
选定要处理的卡片之后,读写器就确定要访问的扇区号,并对该扇区密码进行密码校验,在三次相互认证之后就可以通过加密流进行通讯。(在选择另一扇区时,则必须进行另一扇区密码校验。)
「对数据块的操作」
读 (Read):读一个块;
写 (Write):写一个块;
加(Increment):对数值块进行加值;
减(Decrement):对数值块进行减值;
存储(Restore):将块中的内容存到数据寄存器中;
传输(Transfer):将数据寄存器中的内容写入块中;
中止(Halt):将卡置于暂停工作状态;