树莓派4b入门之开发RFID系统—数据库(MariaDB)基础操作、RFID标签管理脚本
概述
本章介绍在树莓派上创建一个简单的数据库MariaDB(MariaDB是MySQL的分支,API和命令行等完全兼容MySQL,具备数据库管理系统的功能,可以代替MySQL进行更轻松的数据管理工作)的一些基础操作,同时通过创建数据库及数据表,编写实现RFID标签登记和进出库功能的脚本,使得系统可以与数据库进行交互实现数据查询。
一、创建数据库
首先准备并设置MYSQL数据库,在Pi上运行“sudo apt-get install mariadb-server”命令,使用apt-get将MYSQL安装到Raspberry Pi上。目的是在数据库中记录每个RFID标签的登记情况。

安装完MySQL服务器软件后,运行MYSQL附带的“secure installation”脚本。该脚本将指导完成MYSQL服务器的安全设置,比如为“root”用户设置密码。通过运行“sudo mysql_secure_installation”命令来运行此脚本,按照提示设置root用户的密码为123456,这个密码将用来访问MySQL服务器。

接下来会出现设置提示,在为根MYSQL服务器设置了新密码后,不需要再改变root密码,对该提示回答“N”。而对大多数提示回答“Y”,比如禁用对MYSQL服务器的root登录访问。

后面的选项中为了确保MySQL安装的安全,当系统提示回答“ Y”或“ N”时,应在所有提示中回答“Y ”,以防止他人轻易地访问服务器。

默认情况下,MariaDB使用UNIX_SOCKET作为身份验证方法,因此需要使用超级用户登录,访问MySQL服务器并开始对数据库进行更改。输入“sudo mysql -u root -p”命令,使用sudo进行登录。系统提示输入先前设置的“root”用户的密码,这里和Linux密码输入一样,输入时不会显示出文本。
接下来创建一个数据库,用于存储RFID标签设备的数据。
使用“CREATE DATABASE managementsystem;”命令创建一个MySQL数据库。在“CREATE DATABASE”命令后输入数据库的名称,此处命名为“managementsystem”意为“管理系统”。
接着运行“CREATE USER ‘registeradmin’@‘localhost’ IDENTIFIED BY ‘123456’;”命令来创建一个名为“registeradmin”的MySQL用户,意为“登记管理者”,密码设置为“123456”。在Python脚本中使用registeradmin从managementsystem中进行读取与分配。
最后通过运行“GRANT ALL PRIVILEGES ON managementsystem.* TO ‘registeradmin’@‘localhost’;”命令为“registeradmin”用户授予访问“managementsystem”数据库中任何表的权限,以便它可以与数据库进行交互。

二、创建表
在创建表之前,通过“use managementsystem;”命令,与“managementsystem”数据库进行交互。
“create table equipment”创建存储RFID标签数据的登记表。
对于登记表,为登记的每个RFID标签储存以下四段数据:
create table equipment(
id INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, --id为整数,用于跟踪当前行并自动增加;
rfid_uid VARCHAR(255) NOT NULL, --rfid_uid变量用于存储RFID标签的UID;
name VARCHAR(255) NOT NULL, --name变量存储RFID标签所属分类(如实验室)的名称;
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, --created变量来记录登记设备的时间。
PRIMARY KEY ( id )
);

同样,先通过运行运行“use managementsystem;”命令,与“managementsystem”数据库进行交互。
“create table management”创建将存储RFID标签进出库数据的进出库表。
对于进出库表,为每个RFID标签保存以下三段数据:
create table management(
id INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, --id为整数,用于跟踪当前行并自动增加;
user_id INT UNSIGNED NOT NULL, --user_id 为整数,用于联系管理与设备表中具有相同id的用户;
clock_in TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, --clock_in –此变量存储时间戳,用于记录RFID标签进出库时间。
PRIMARY KEY ( id )
);

三、查看数据库和表
在创建完数据库和表之后,运行“show satabases;”命令查看”managementsystem”数据库,进入到数据库里运行“show tables;”命令可以查看“equipment”登记表与“management”进出库表。

四、RFID标签管理脚本
首先在Raspberry pi上运行“sudo pip3 install mysql-connector-python”命令来使用pip安装Python“ MYSQL Connector ”工具,用于连接mysql的驱动。

1.登记
在用户主目录下创建名称为“managementsystem”文件夹用于存储RFID标签脚本。登记脚本(此处命名为save_equipment.py)代码及注释如下所示:
#告知操作系统使用Python执行文件
#!/usr/bin/env python
#引入time库;引入RPi.GPIO和Simple MFRC522库以使用GPIO引脚处理的功能和程序功能;使用MySQL驱动连接器与数据库进行通讯
import time
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import mysql.connector
#创建与MYSQL服务器连接的db变量,并存储建立连接所需的所有对象信息,包括主机、用户、数据库名称和密码,以便与数据库进行交互
db = mysql.connector.connect(
host="localhost",
user="registeradmin",
passwd="123456",
database="managementsystem"
)
#实例化连接数据库的cursor对象
cursor = db.cursor()
#实例化SimpleMFRC522库的reader对象
reader = SimpleMFRC522()
#使用try语句捕获与处理发生的任何情况
try:
#在True循环包装下的逻辑代码无限期运行,以便连续登记多个RFID标签
while True:
print('Place Card to\nregister')
#储存读取到的输入的ID和文本信息
id, text = reader.read()
#执行SQL语句,搜索“equipment”登记表,查看表中是否有与读取到的ID相匹配的UID
cursor.execute("SELECT id FROM equipment WHERE rfid_uid="+str(id))
#调用函数检索数据,从返回的结果获取一行
cursor.fetchone()
#检查SQL调用返回了多少行
if cursor.rowcount >= 1:
#打印是否覆盖已经存在的RFID标签
print("Overwrite\nexisting equipment?")
#提示输入
overwrite = input("Overwite (Y/N)? ")
#响应覆盖
if overwrite[0] == 'Y' or overwrite[0] == 'y':
#打印覆盖设备,时长1秒
print("Overwriting equipment.")
time.sleep(1)
#新建SQL查询,更新名称
sql_insert = "UPDATE equipment SET name = %s WHERE rfid_uid=%s"
#跳回循环的开始
else:
continue;
#新建SQL查询,创建名称
else:
sql_insert = "INSERT INTO equipment (name, rfid_uid) VALUES (%s, %s)"
#打印,输入新名称
print('Enter new name')
new_name = input("Name: ")
#创建包含新名称和ID的元组,在执行时自动传递到查询字符串中
cursor.execute(sql_insert, (new_name, id))
#调用db对象,保存更改到数据库
db.commit()
#打印RFID标签新名称(所属分类,如实验室),睡眠两秒
print("User " + new_name + "\nSaved")
time.sleep(2)
#触发finally语句终止脚本
finally:
#清理GPIO
GPIO.cleanup()
运行“python3 save_equipment.py”命令,运行登记脚本。输入登记名称(如实验室),如“Electrical laboratory”,如下图。

执行结果
2.进出库
可以通过运行“nano move_management.py”编写进出库脚本,代码及注释如下所示:
#告知操作系统使用Python执行文件
#!/usr/bin/env python
#引入time库;引入RPi.GPIO和Simple MFRC522库,使用GPIO引脚处理的功能和程序功能;使用MySQL驱动连接器与数据库进行通讯
import time
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import mysql.connector
#创建与MYSQL服务器连接的db变量,并存储建立连接所需的所有对象信息,包括主机、用户、数据库名称和密码,以便与数据库进行交互
db = mysql.connector.connect(
host="localhost",
user="registeradmin",
passwd="123456",
database="managementsystem"
)
#实例化连接数据库的cursor对象
cursor = db.cursor()
#实例化SimpleMFRC522库的reader对象
reader = SimpleMFRC522()
#使用try语句捕获与处理发生的任何情况
try:
#在True循环包装下的逻辑代码无限期运行,以便连续管理多个RFID标签
while True:
print('Place Card to\nrecord attendance')
#储存读取到的输入的ID和文本信息
id, text = reader.read()
#执行SQL语句,搜索登记表,查看表中是否有与读取到的ID相匹配的UID
cursor.execute("Select id, name FROM equipment WHERE rfid_uid="+str(id))
#调用函数检索数据,从返回的结果获取一行储存到result变量中
result = cursor.fetchone()
#检查SQL调用返回了多少行
if cursor.rowcount >= 1:
#打印欢迎,将检索到的名称作为result[1]
print("Welcome " + result[1])
#执行SQL语句,在“management”进出库表中插入一行,将检索到的RFID标签ID存储在result[0]中
cursor.execute("INSERT INTO management (user_id) VALUES (%s)", (result[0],) )
#调用db对象,保存更改到数据库
db.commit()
#打印RFID标签不存在,睡眠两秒
else:
print("User does not exist.")
time.sleep(2)
#触发finally语句终止脚本
finally:
#清理GPIO
GPIO.cleanup()
运行“python3 move_management.py”命令,运行进出库脚本。

执行结果
3.查询
在数据库查询RFID标签登记和进出库信息,首先连接到MYSQL命令行,与“managementsystem”数据库进行交互。
输入“SELECT * FROM equipment;”命令以查询由登记表中登记的RFID标签;同样,继续查看管理表里,输入“SELECT * FROM managementt;”命令查询进出库脚本输入的数据。SELECT SQL调用用于指定表,星号(*)表示获取所有列。
最后输入quit或者exit离开MYSQL工具即可。

查询结果
一些数据库基础操作以及系统RFID标签的脚本设计就分享完了,后面将介绍在树莓派4b上搭建一个web服务器,为更方便快捷地查阅和展示数据库中存储的设备信息做准备。
更多推荐
所有评论(0)