全网你能看到最全的 RFID 整体技术介绍!
标签数据格式内部分区
超高频RFID的标签芯片需要符合EPC C1Gen2标准(简称Gen2 协议),也就是说所有的超高频RFID标签芯片内部存储结构大致一样。 如图所示,标签芯片的存储区分为四个区(Bank)分别是 Bank 0保留区(Reserved)、Bank 1电子编码区(EPC)、Bank 2 厂商编码区(TID)、 Bank 3 用户区(User)。
1.Reserved区:(密码区) :存储Kill Password(灭活口令)和Access Password(访问口令)。
2.EPC区: 存储EPC号码等。
3.TID区: 存储标签识别号码,每个TID号码应该是唯一的。
4.User区: 存储用户定义的数据。
此外还有各区块的Lock(锁定)状态位等用到的也是存储性质的单元。
各厂家不同的电子标签,采用的存储介质,各个数据区大小和接口方式均不同。
其中 Bank 0 保留区又称密码区,内部有两组32比特密码,分别是访问密码(Access Password)和灭活密码(Kill Password),灭活密码俗称杀死密码。 当使用锁定命令后,需要通过访问密码才可以对芯片的一些区域进行读写。当需要杀死芯片的时候,通过杀死密码可以将芯片彻底杀死。
Bank 1 为电子编码区,是大家最熟悉的EPC区。根据Gen2协议,最先获得标签的信息是EPC信息,之后才能访问其他存储区进行访问。EPC区分为三个部分:
CRC16校验部分共16比特,通信时负责校验阅读器获得的EPC是否正确。
PC部分(Protocol Control)共16比特,控制EPC的长度,其前5比特的二进制数乘以16为EPC长度,如96比特EPC时的PC=3000,其前5个比特为00110,对应十进制为6,乘以16为96Bit。 根据协议要求,PC可以等于0000到F100,相当于EPC的长度为0、32比特、64比特直到496比特。但是一般情况下超高频RFID应用中EPC的长度在64比特到496比特之间,也就是说PC值在2800到F100之间。在平时的应用中经常有人搞不清楚EPC中PC的作用,会卡在EPC长度的设置上从而带来很多麻烦。
EPC部分,这部分才是最终用户从应用层获得的芯片电子编码。
Bank 2为厂商编码区,每颗芯片都有自己的唯一编码。
CRC 1 单位 PC 1 单位 EPC 6 单位
Bank 3为用户存储区,该存储区根据协议规定最小空间为0,但是多数芯片为了方便客户应用,增加了用户存储空间,最常见的存储空间为128比特或512比特。
在了解了标签的存储区之后,需要进一步了解Gen2的几个操作命令即读(Read)、写(Write)、锁(Lock)、杀(Kill)。Gen2的命令很简单,操作命令只有4个,且标签的存储区状态只有两种:锁定、未锁定。
因为读写命令都与数据区是否锁定相关,我们先从锁命令讲起。锁命令对四个存储区共有4个分解命令分别是锁定(Lock)、解锁(Unlock)、永久锁定(Permanent Lock)、永久解锁(Permanent Unlock),只要访问密码非全0即可进行锁定命令。对应四个区的操作如下表所示。
代码
使用库:micropython-mfrc522
import mfrc522
from os import uname
def do_read():
if uname()[0] == 'WiPy':
rdr = mfrc522.MFRC522("GP14", "GP16", "GP15", "GP22", "GP17")
elif uname()[0] == 'esp8266':
rdr = mfrc522.MFRC522(0, 2, 4, 5, 14)
else:
raise RuntimeError("Unsupported platform")
print("")
print("Place card before reader to read from address 0x08")
print("")
try:
while True:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
print("New card detected")
print(" - tag type: 0x%02x" % tag_type)
print(" - uid : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
print("")
if rdr.select_tag(raw_uid) == rdr.OK:
key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
print("Address 8 data: %s" % rdr.read(8))
rdr.stop_crypto1()
else:
print("Authentication error")
else:
print("Failed to select tag")
except KeyboardInterrupt:
print("Bye")
附录
https://blog.csdn.net/watch361/article/details/136949087
RFID —— 充值消费系统: https://blog.csdn.net/weixin_44935259/article/details/111392684
RFID 卡在学校就餐管理系统中的应用设计: https://www.xatrm.com/cjxxxjsjsfz/113096.jhtml