前言
本文介绍两种区分RFID标签-Mifare1 S50的Python脚本,除了基本的读取该RFID标签的UID外,也可满足系统RFID硬件模块的读写功能的多样性,
一是以操作脚本代码的方式对RFID标签的指定扇区进行数据读写(python2);二是直接读写数据(python3)
,两种操作方式均依赖于《简介、搭建MFRC522-SPI环境》
https://blog.csdn.net/m0_46509211/article/details/123050378
中安装的相关库和拓展提供接口环境。
一、指定读写
读操作的脚本代码及注释如下:
#告知操作系统使用Python执行文件
#!/usr/bin/env python
#设置编码格式
# coding:utf-8
#引入RPi.GPIO,使用GPIO引脚处理的功能
import RPi.GPIO as GPIO
import signal
#引入MFRC522库,使用程序功能
from mfrc522 import MFRC522
continue_reading = True
# 捕获SIGINT,脚本中止时清理GPIO
def end_read(signal, frame):
global continue_reading
#提示输入Ctrl+C来结束读取
print"Ctrl+C captured, ending read."
continue_reading = False
GPIO.cleanup()
# 连接信号
signal.signal(signal.SIGINT, end_read)
# 创建MFRC522类的对象
MIFAREReader = MFRC522()
# 循环检查靠近的RFID标签,获得UID并进行身份验证
while continue_reading:
# 扫描卡片
(status, TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
# 提示找到RFID标签
if status == MIFAREReader.MI_OK:
print "Card detected"
# 获取UID
(status, uid) = MIFAREReader.MFRC522_Anticoll()
flag = 1
# 如果获取成功
if status == MIFAREReader.MI_OK:
# 将UID打印出来
print "Card read UID: %s,%s,%s,%s %s" % (uid[0], uid[1], uid[2], uid[3], uid[4])
# 身份验证的默认密钥
key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
# 选择扫描的标签
MIFAREReader.MFRC522_SelectTag(uid)
# 认证
status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)
# 检查身份验证是否正确
if status == MIFAREReader.MI_OK:
MIFAREReader.MFRC522_Read(8)
MIFAREReader.MFRC522_StopCrypto1()
flag = 0
# 提示身份验证错误
else:
print "Authentication error"
前面已经在MFRC522-python2中创建了MFRC522-python文件夹用于存储脚本,在其中运行“sudo python Read.py”执行Read脚本,读取RFID标签的UID和扇区数据,如下图。
写操作的脚本代码及注释如下(声明、库引用,重复代码的注释同上):
#!/usr/bin/env python
# coding:utf-8
import RPi.GPIO as GPIO
from mfrc522 import MFRC522
import signal
continue_reading = True
def end_read(signal, frame):
global continue_reading
print "Ctrl+C captured, ending read."
continue_reading = False
GPIO.cleanup()
signal.signal(signal.SIGINT, end_read)
MIFAREReader = MFRC522()
while continue_reading:
(status, TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
if status == MIFAREReader.MI_OK:
print "Card detected"
(status, uid) = MIFAREReader.MFRC522_Anticoll()
if status == MIFAREReader.MI_OK:
print "Card read UID: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], uid[3])
key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
MIFAREReader.MFRC522_SelectTag(uid)
status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)
print "\n"
if status == MIFAREReader.MI_OK:
# 写入数据的变量
data = []
# 用0xFF填充数据,0xFF可自定义或更改为其他数据
for x in range(0, 16):
data.append(0xFF)
# 将更改前的该扇区的数据打印出来(以扇区8为例)
print "Sector 8 looked like this:"
# 读取指定扇区,也可更改为读其他扇区(1-16)
MIFAREReader.MFRC522_Read(8)
print "\n"
# 将填充0xFF到扇区8的操作打印出来
print "Sector 8 will now be filled with 0xFF:"
# 将数据写入指定扇区,或更改为写其他扇区(1-16)
MIFAREReader.MFRC522_Write(8, data)
print "\n"
# 打印现在的扇区数据
print "It now looks like this:"
# 获取该扇区的数据并打印出来
MIFAREReader.MFRC522_Read(8)
print "\n"
"""
示例(操作同上):
data = []
# 用0x00填充数据
for x in range(0, 16):
data.append(0x00)
# 打印及写入指定扇区
print "Now we fill it with 0x00:"
MIFAREReader.MFRC522_Write(8, data)
print "\n"
# 打印:现在是空的:
print "It is now empty:"
# 获取扇区8数据并打印出来
MIFAREReader.MFRC522_Read(8)
print "\n"
"""
# 停止读卡
MIFAREReader.MFRC522_StopCrypto1()
continue_reading = False
else:
# 身份验证错误
print "Authentication error"
运行“sudo python Write.py”执行Write脚本,对RFID标签的扇区数据进行写操作,比如先对指定扇区8进行填充0xFF,再填充0x00(示例)。
执行结果
二、直接读写
此部分的python3代码对扇区数据操作已封装,会比前面python2部分简单些。
读操作的脚本代码及注释如下:
#告知操作系统使用Python执行文件
#!/usr/bin/env python
#引入RPi.GPIO,使用引脚处理功能
import RPi.GPIO as GPIO
#引入Simple MFRC522库
from mfrc522 import SimpleMFRC522
#调用SimpleMFRC522的函数,将其作为对象存储到创建的reader变量中,方便与其进行交互
reader = SimpleMFRC522()
#使用try语句捕获与处理发生的任何情况
try:
#调用读取到的RFID标签数据作为对象
id, text = reader.read()
#打印RFID标签的ID
print(id)
#打印数据
print(text)
#终止
finally:
#清理GPIO
GPIO.cleanup()
在MFRC522-python3中,此处使用nano来编写完成,运行“sudo python3 Read.py”执行Read脚本,读取RFID标签的ID数据,如下图。
写操作的脚本代码及注释如下(声明、库引用,重复代码的注释同上):
#!/usr/bin/env python
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
reader = SimpleMFRC522()
try:
#使用input读取输入的数据并存储在text变量中
text = input('New data:')
#提示放置要写入的RFID标签
print("Now place your tag to write")
#将变量值写入RFID标签的扇区
reader.write(text)
#提示成功写入
print("Written")
finally:
GPIO.cleanup()
nano来编写完后,运行“sudo python Write.py”执行Write脚本,输入数据,写入RFID标签的扇区中,如下图。
运行结果
以上就是两种RFID模块读写脚本的分享,后面将会分享如何结合数据库,以更直观的方式展示系统RFID标签的登记与管理。