树莓派4b入门之开发RFID系统—两种MFRC522读写脚本

  • Post author:
  • Post category:其他


树莓派4b开发RFID系统—两种MFRC522读写脚本




前言

本文介绍两种区分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标签的登记与管理。



版权声明:本文为m0_46509211原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。