RFID–射频识别

RFID概述

1、RFID的构成

RFID主要是由读/写器和应答器构成的。读/写器的作用是对应答器进行读和写操作,

例如最常见的交通工具刷卡器。应答器是一个信息存储介质,其中的数据通常可以保存一段较长的时间。这些数据可以被读写器操作。根据不同的属性,应答器有多种不同的分类。

2、RFID的工作原理

RFID的工作原理就是利用电磁波进行通信。在日常生活中多见的是无源应答器。这
种应答器没有内置电源,它是被动式的,需要靠近读/写器,由读/写器发出的电磁波来提
供电量以进行通信。与之对应的是有源应答器。这种应答器自备电源,它不需要借助外部
能量工作,因此可以主动发出通信请求。
RFID正常工作除了需要硬件的支持外,还需要相关的协议支持,例如常见的ISO/EC
14443A协议。在软件协议的约束下,应答器与读/写器直接就可以正确地进行通信。

3、RFID优缺点

RFID的优点如下:
①、RFID设备抗干扰能力强,不易损坏;
②、RFID应答使用寿命长;

③、读取距离大;
④、应答器中的数据可以加密;

⑤、数据存储容量大;
⑥、存储信息可以修改。

RFID的缺点如下:
①、数据泛滥:从RFID应答器中读取到的数据并不是全部有用的,这必然会对控制系统有影响;
②、没有一个全球标准:这将会导致使用不同标准的国家无法操作RFID数据,而对应的二维码则没有这个问题;
③、安全问题:RFID应答器中的私人数据可能会在不知情的情况下被读取;
④、可能会被恶意使用:例如2006年有报道称RFID的缓冲区溢出漏洞可能会导致机场终端泄密;
⑤、高温损坏:因为当前大多数应答器是将集成电路胶合在基料中的,所以在高温下可能导致连接松脱。

RFID硬件

1、RFID的硬件由读/写器和应答器(通常为电子标签)组成。读/写器和应答器之间的通信方式有很多种。通常情况下,这些方式是互不兼容的,主要原因是工作的频带不同。常用的射频识别频带以及其特性如表所示:

我们接下来使用的应答器为MIFARE 1KB无源标签。它工作在13.56MHz,遵循ISO/IEC14443A标准。读/写器为MFRC522,它同样支持ISO/IEC14443A/MIFARE标准。

2、RFID读/写器

3、RFID应答器

4、MIFARE 1KB智能卡数据组织形式

①、随附信息组(Sector Trailer)

随附信息组是由6Byte大小的Key A、Key B和4Byte大小的访问位(Access Bits)组成的。

它们的具体功能如下所述:

Key A:Key A为密钥A,任何时候读取Key A均会返回数据0;

Key B:Key B为密钥B,用于安全验证,可以被用做用户数据,它在一些访问条件下可以被读取;

访问位:用来指定扇区中各个块的访问权限,第9位可以被用来做用户数据

②、制造商数据

0扇区的第0块是一个特殊的块,它存储了制造商数据。该块是只读块,而且具有写保护。访问位的变更不会影响到该块的属性。

③、数据块

所有扇区中3个块(0扇区只有两个块)的16个比特为(bits)都可以用来存储数据。这些数据可以被配置为读/写或者值块。值块可以用来实现电子付费功能(允许执行读、写、增加、减少、恢复和传输命令)。值块是以固定的格式组织的,如表所示

表中值和地址的定义如下所述。

①、值:表示一个4Byte有符号值,负数使用补码的方式表示。为了数据的完整性和安全性,一个值以原码和反码的形式存储了三次;

②、地址:表示1Byte地址,他可以用来保存一个块的存储地址。同样,为了数据的完整性和安全性,地址以原码和反码的形式存储了四次。对值的增加、减少、恢复和传输操作不会影响地址的值,地址值需要通过写命令修改。

电路图连接

MFRC522支持3种形式的接口,第三方RFID使用的是SPI接口,器控制线为4条,如下所述:

①、SCK:串行时钟;

②、MOSI:主机(arduino)输出,从机(MFRC522)输入;

③、MISO:主机输入,从机输出;

④、NSS:从机选择(低电平有效);

收费系统

收费系统的实现非常简单,思路如下

①、使用密钥进行验证;

②、执行扣费操作;

③、输出余额;

以下代码实现收费系统。

/***********************************************************
File name:  Adeept_RFID.ino
Description:  
RFID is a wireless communication technology that is commonly used in 
automatic identification and target tracking. 
It can operate on target data without contact, 
such as the common public transportation payment 
system and access control system.

Website: www.adeept.com
E-mail: support@adeept.com
Author: Felix
Date: 2019/07/01 
***********************************************************/

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 mfrc522(SS_PIN, RST_PIN);        // creat MFRC522 object

void setup() {
  Serial.begin(9600);        //initialize the serial port
  SPI.begin();                //initialize SPI bus
  mfrc522.PCD_Init();        //initialize reader-writer
  Serial.println("Public transport charge system.");		//output the payment system message
}

void loop() {
//  int amount=0;
//  char yon;

  //detect if the chip is detected
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  //select a card to operate on
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

    byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
    if(piccType != MFRC522::PICC_TYPE_MIFARE_MINI
    && piccType != MFRC522::PICC_TYPE_MIFARE_1K
    && piccType != MFRC522::PICC_TYPE_MIFARE_4K){
      Serial.println("Don not works with this cards.");
      return;
    }

  //set the key variable to FFFFFFFFFFFFh
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }

  //use the fifth data block of the card
  byte valueBlockA	= 5;
  byte status;

  //use Key B to verify
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, valueBlockA, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Failed,please try again.");
    return;
  }
//perform fee deduction poeration(the amount here is 1)
  status = mfrc522.MIFARE_Decrement(valueBlockA,1);
  if(status != MFRC522::STATUS_OK){
    Serial.print("Failed,please try again.");
    return;
  }
  status = mfrc522.MIFARE_Transfer(valueBlockA);
  if(status != MFRC522::STATUS_OK){
    Serial.print("Failed,please try again.");
    return;
  }

  byte buffer[18];
  byte size = sizeof(buffer);

  //read and output the balance
  status = mfrc522.MIFARE_Read(valueBlockA, buffer, &size);
  long value = (long(buffer[3])<<24) | (long(buffer[2])<<16) | (long(buffer[1])<<8) | long(buffer[0]);
  Serial.println("Success!");
  Serial.print("Balance:"); 
  Serial.println(value, DEC);
  //change card activation status
  mfrc522.PICC_HaltA();
  //stop encrypted transmission
  mfrc522.PCD_StopCrypto1();
}

通常情况下扣费信息是显示在交通工具读卡器的LED上的,上面的示例代码将其输出到了串口监视器中,将以上代码下载到arduino开发板后打开串口监视器,等待输出Public transport charge system.

提示信息后即可进行刷卡操作。如图所示为刷卡5次后的结果。

可以看到在刷卡5次后余额为95元。以上收缴费系统看起来工作得非常好。

跳至工具栏