Giới thiệu ngắn gọn
Nhà thông minh ngày càng trở nên phổ biến cùng với sự phát triển của công nghệ, bài viết này sẽ tập trung vào khía cạnh bảo mật của dự án kiểm soát truy cập thông minh.
Bài viết này sử dụng Màn hình cảm ứng của STONE để gửi lệnh đến MCU để điều khiển rơle và mô-đun MFRC522.
Nguyên tắc đọc thẻ: bằng cách điều khiển mô-đun RFID-RC522, xác định ID thẻ ID gần với thẻ ID, sau đó xác định xem ID có tồn tại trong cơ sở dữ liệu của từ điển hình hay không, ID là giá trị điển hình của từ đó, nếu sự tồn tại của xác minh thông qua , sau đó in ra tên tương ứng, sau đó điều khiển khóa điện từ theo cách tương tự.
Vật liệu cần thiết
- Đặc biệt
- khóa điện tử KOB
- Đặt lại
- Màn hình cảm ứng STONE STWI070WT-01
- mô-đun MFRC522
Chức năng thực hiện
- đăng ký thẻ.
- đăng ký tên người dùng và mật khẩu.
- quẹt thẻ để mở khóa điện tử.
- Tên người dùng và mật khẩu để mở khóa khóa điện tử.
Phần cứng chính Mô tả
Mô-đun RFID
Mô-đun này có thể được tải trực tiếp vào các mô-đun đọc khác nhau. Nó sử dụng điện áp 3.3V, thông qua giao diện SPI chỉ với một vài dây. Được kết nối trực tiếp với bo mạch chủ CPU, mô-đun này có thể hoạt động ổn định và đáng tin cậy như một đầu đọc thẻ từ xa.
STWI070WT-01 được hình thành dưới dạng màn hình TFT & bộ điều khiển cảm ứng. Nó bao gồm bộ xử lý, chương trình điều khiển, trình điều khiển, bộ nhớ flash, cổng RS232/RS422/RS485/TTL/LAN, Wi-Fi/Bluetooth, màn hình cảm ứng, nguồn điện, v.v., vì vậy đây là toàn bộ hệ thống hiển thị dựa trên sự mạnh mẽ và dễ dàng hệ điều hành, có thể được điều khiển bởi bất kỳ MCU nào.
Thiết kế GUI
Chia sẽ mã
nhập khẩu mfrc522
thời gian nhập khẩu
nhập _thread
từ uname nhập hệ điều hành
từ máy nhập Pin, UART
#from pyb nhập UART
#máy nhập khẩu
suos = Pin(32,Pin.OUT)
uart2 = UART(2, baudrate=115200, rx=16,tx=17,timeout=10)
ESP32_HSPI_CLOCK = 14
ESP32_HSPI_SLAVE_SELECT = 15
ESP32_HSPI_MISO = 12
ESP32_HSPI_MOSI = 13
ESP32_MFRC522_RST = 5
rx3 = []
rx_name = []
user_id_flag = Sai
mật khẩu_flag = Sai
temp_id = ”
temp_mima = ”
nhân sự_id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}
nhân sự_ps = {'zbw':'zbw3366′,'lbw':'lbwnb'}
admin_password = ('yyds')
nút_cmd = [16,1]
edit1_cmd = [16,112]
edit2_cmd = [16,113]
edit3_cmd = [16,114]
nếu uname()[0] == 'esp32':
rdr = mfrc522.MFRC522(ESP32_HSPI_CLOCK, ESP32_HSPI_MOSI, ESP32_HSPI_MISO, ESP32_MFRC522_RST, ESP32_HSPI_SLAVE_SELECT)
chắc chắn do_write():
thử:
(stat, tag_type) = rdr.request(rdr.REQIDL)
nếu chỉ số == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
nếu chỉ số == rdr.OK:
print(“Đã phát hiện thấy thẻ mới”)
print(” – loại thẻ: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
in("")
nếu rdr.select_tag(raw_uid) == rdr.OK:
khóa = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
stat = rdr.write(8, b”\x00\x53\x00\x54\x00\x4F\x00\x4E\x00\x45\x0a\x0b\x0c\x0d\x0e\x0f”)
rdr.stop_crypto1()
nếu chỉ số == rdr.OK:
print(“Dữ liệu ghi vào thẻ”)
khác:
print(“Ghi dữ liệu vào thẻ không thành công”)
khác:
print(“Lỗi xác thực”)
khác:
print(“Không chọn được thẻ”)
ngoại trừ Bàn phímInterrupt:
print(“lỗi ghi”)
chắc chắn do_read():
trong khi Đúng:
thử:
(stat, tag_type) = rdr.request(rdr.REQIDL)
nếu chỉ số == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
nếu chỉ số == rdr.OK:
print(“Đã phát hiện thấy thẻ mới”)
print(” – loại thẻ: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
in (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
in("")
nếu rdr.select_tag(raw_uid) == rdr.OK:
khóa = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
print(“Dữ liệu địa chỉ 8: %s” % rdr.read(8))
cho ps trong human_id:
nếu raw_uid[0:4:1] == human_id.get(ps):
suos.value(1)
in (ps)
uart_write(ps, *raw_uid[0:4:1])
thời gian ngủ (3)
uart2.sendbreak ()
phá vỡ
rdr.stop_crypto1()
thời gian ngủ (3)
suos.value(0)
khác:
print(“Lỗi xác thực”)
khác:
print(“Không chọn được thẻ”)
nếu uart2.any ()> 1:
rx2 = []
data_name2 =”
bin_data = uart2.read (40)
uart2.sendbreak ()
rx1 = list (bin_data)
cho mục trong rx1:
rx2.append (chr (item))
in (rx2)
nếu rx1 [3: 5: 1] == button_cmd:
data_name_len = rx1 [6] - 1
data_name = rx2 [7: data_name_len + 7: 1]
data_name2 = ”.join (data_name)
print (data_name2)
nếu data_name2 == 'back3':
trở lại
ngoại trừ Bàn phímInterrupt:
print(“lỗi đọc”)
def do_read2 (idd):
in(idd)
trong khi Đúng:
thử:
(stat, tag_type) = rdr.request(rdr.REQIDL)
nếu chỉ số == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
nếu chỉ số == rdr.OK:
print(“Đã phát hiện thấy thẻ mới”)
print(” – loại thẻ: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
in (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
in("")
nếu rdr.select_tag(raw_uid) == rdr.OK:
khóa = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
print(“Dữ liệu địa chỉ 8: %s” % rdr.read(8))
nhân sự_id[idd] = raw_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
khác:
print(“Lỗi xác thực”)
khác:
print(“Không chọn được thẻ”)
nếu uart2.any ()> 1:
rx2 = []
data_name2 =”
bin_data = uart2.read (40)
uart2.sendbreak ()
rx1 = list (bin_data)
cho mục trong rx1:
rx2.append (chr (item))
nếu rx1 [3: 5: 1] == button_cmd:
data_name_len = rx1 [6] - 1
data_name = rx2 [7: data_name_len + 7: 1]
data_name2 = ”.join (data_name)
print (data_name2)
nếu data_name2 == 'back1':
trở lại
ngoại trừ Bàn phímInterrupt:
print(“lỗi đọc”)
def uart_write(văn bản, *id):
# in(văn bản, *id)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardname1″,”text”:”'+str(text)+'”}>ET' )
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid1″,”text”:”'+str(ids)+'”}>ET' )
uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock1″,”visible”:true}>ET')
thời gian ngủ (3)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardname1″,”text”:”””}>ET')
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid1″,”text”:”””}>ET')
uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock1″,”visible”:false}>ET')
def uart_write2(văn bản,văn bản2):
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”'+text+'”}>ET')
thời gian ngủ (3)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”'+text2+'”}>ET')
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit2″,”text”:”””}>ET')
def uart_write3(*id2):
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”'+str(id2)+'”}>ET' )
thời gian ngủ (3)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”””}>ET')
def uart_write4(văn bản,văn bản2):
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”login”,”text”:”'+text+'”}>ET')
thời gian ngủ (1)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”login”,”text”:”'+text2+'”}>ET')
thời gian ngủ (1)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit3″,”text”:”””}>ET')
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit4″,”text”:”””}>ET')
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit7″,”text”:”””}>ET')
chắc chắn uart_write5():
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”'+str(id2)+'”}>ET' )
thời gian ngủ (3)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”””}>ET')
thẻ def_zhuce():
trong khi Đúng:
nếu uart2.any():
user_id = ”
mật khẩu = ”
rx2 = []
rx_num = 0
bin_data = uart2.read (40)
uart2.sendbreak ()
rx1 = list (bin_data)
cho mục trong rx1:
rx2.append (chr (item))
rx_num += 1
dữ liệu_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
in(data_id_st2)
nếu data_id_st2 == 'edit1':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
in(data_id_st4)
nếu data_id_st4 != ”:
tên = Đúng
dữ liệu Elif_id_st2 == 'edit2':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
nếu data_id_st6 == admin_password:
quản trị viên = Đúng
uart_write2('Xác minh đã thành công!','Vui lòng đặt thẻ!')
do_read2(data_id_st4)
trở lại
chắc chắn mima_zuce():
temp_id3 = ”
temp_mima3 = ”
trong khi Đúng:
nếu uart2.any():
user_id = ”
mật khẩu = ”
rx2 = []
rx_num = 0
# dữ liệu_end = 0
bin_data = uart2.read (40)
uart2.sendbreak ()
rx1 = list (bin_data)
cho mục trong rx1:
rx2.append (chr (item))
rx_num += 1
# if (rx2[rx_num] == 'T') và (rx2[rx_num-1] == 'E') và (rx2[rx_num-2] == '>'):
# phá vỡ
dữ liệu_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
in(data_id_st2)
nếu rx1 [3: 5: 1] == button_cmd:
data_name_len = rx1 [6] - 1
data_name = rx2 [7: data_name_len + 7: 1]
data_name2 = ”.join (data_name)
print (data_name2)
nếu data_name2 == 'back2':
trở lại
nếu data_id_st2 == 'edit3':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
in(data_id_st4)
user_id_flag = Đúng
temp_id3 = dữ liệu_id_st4
# nhân_ps[temp_id] = raw_uid[0:4:1]
dữ liệu Elif_id_st2 == 'edit4':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
in(data_id_st6)
# if HR_ps.get(temp_id) == data_id_st6:
mật khẩu_flag = Đúng
temp_mima3 = data_id_st6
# nhân_ps[temp_id] = mật khẩu_flag
# print(rx2,user_id_flag,password_flag)
dữ liệu Elif_id_st2 == 'edit7':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
nếu (data_id_st6 == admin_password) và (password_flag == True) và (user_id_flag == True):
quản trị viên = Đúng
nhân sự_ps[temp_id3] = temp_mima3
mật khẩu_flag = Sai
user_id_flag = Sai
uart_write4('Xác minh đã thành công!','đăng nhập thành công!')
xác định mật khẩu_loin():
temp_id2 = ”
temp_mima = ”
trong khi Đúng:
nếu uart2.any():
user_id = ”
mật khẩu = ”
rx2 = []
rx_num = 0
# dữ liệu_end = 0
bin_data = uart2.read (40)
uart2.sendbreak ()
rx1 = list (bin_data)
cho mục trong rx1:
rx2.append (chr (item))
rx_num += 1
# if (rx2[rx_num] == 'T') và (rx2[rx_num-1] == 'E') và (rx2[rx_num-2] == '>'):
# phá vỡ
dữ liệu_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
in(data_id_st2)
nếu rx1 [3: 5: 1] == button_cmd:
data_name_len = rx1 [6] - 1
data_name = rx2 [7: data_name_len + 7: 1]
data_name2 = ”.join (data_name)
print (data_name2)
nếu data_name2 == 'back4':
trở lại
nếu data_id_st2 == 'edit5':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
in(data_id_st4)
nếu data_id_st4 trong nhân sự_ps:
user_id_flag = Đúng
temp_id2 = dữ liệu_id_st4
dữ liệu Elif_id_st2 == 'edit6':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
in(data_id_st6)
in(temp_id2)
in(nhân sự_ps)
nếu HR_ps.get(temp_id2) == data_id_st6:
mật khẩu_flag = Đúng
# print(rx2,user_id_flag,password_flag)
in(user_id_flag,password_flag)
nếu (password_flag == True) và (user_id_flag == True):
uart_write(temp_id2,temp_id2)
mật khẩu_flag = Sai
user_id_flag = Sai
suos.value(1)
uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock2″,”visible”:true}>ET')
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit5″,”text”:”””}>ET')
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit6″,”text”:”””}>ET')
thời gian ngủ (3)
# uart_write('sinh viên',")
suos.value(0)
uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock2″,”visible”:false}>ET')
uart2.sendbreak ()
trong khi Đúng:
nếu uart2.any ()> 1:
rx2 = []
data_name2 =”
bin_data = uart2.read (40)
# thời gian ngủ(1)
uart2.sendbreak ()
# thời gian ngủ(1)
rx1 = list (bin_data)
cho mục trong rx1:
rx2.append (chr (item))
in (rx2)
nếu rx1 [3: 5: 1] == button_cmd:
data_name_len = rx1 [6] - 1
data_name = rx2 [7: data_name_len + 7: 1]
data_name2 = ”.join (data_name)
print (data_name2)
nếu data_name2 == 'card1':
card_zhuce()
Elif data_name2 == 'password1':
mima_zuce()
dữ liệu Elif_name2 == 'card2':
do_read()
Elif data_name2 == 'password2':
mật khẩu_loin()
MFRC522.py
từ máy nhập Pin, SPI
từ uname nhập hệ điều hành
lớp MFRC522:
được = 0
NOTAGERR = 1
LỖI = 2
REQIDL = 0x26
YÊU CẦU = 0x52
TÁC GIẢ1A = 0x60
TÁC GIẢ1B = 0x61
def __init__(self, sck, mosi, miso, rst, cs):
self.sck = Ghim(sck, Pin.OUT)
self.mosi = Pin(mosi, Pin.OUT)
self.miso = Pin(miso)
self.rst = Pin(đầu tiên, Pin.OUT)
self.cs = Ghim(cs, Pin.OUT)
self.rst.value(0)
self.cs.value(1)
bảng = uname()[0]
nếu bảng == 'WiPy' hoặc bảng == 'LoPy' hoặc bảng == 'FiPy':
self.spi = SPI(0)
self.spi.init(SPI.MASTER, baudrate=1000000, pins=(self.sck, self.mosi, self.miso))
bảng Elif == 'esp32':
self.spi = SPI(tốc độ truyền=100000, phân cực=0, pha=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
self.spi.init()
khác:
raise RuntimeError(“Nền tảng không được hỗ trợ”)
self.rst.value(1)
tự.init()
def _wreg(self, reg, val):
self.cs.value(0)
self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e)))
self.spi.write(b'%c' % int(0xff & val))
self.cs.value(1)
def _rreg(tự, reg):
self.cs.value(0)
self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))
val = self.spi.read(1)
self.cs.value(1)
trả lại giá trị [0]
def _sflags(tự, reg, mặt nạ):
self._wreg(reg, self._rreg(reg) | mặt nạ)
def _cflags(tự, reg, mặt nạ):
self._wreg(reg, self._rreg(reg) & (~mask))
def _tocard(self, cmd, send):
recv = []
bit = irq_en = wait_irq = n = 0
stat = self.ERR
nếu cmd == 0x0E:
irq_en = 0x12
chờ_irq = 0x10
Elif cmd == 0x0C:
irq_en = 0x77
chờ_irq = 0x30
self._wreg(0x02, irq_en | 0x80)
self._cflags(0x04, 0x80)
self._sflags(0x0A, 0x80)
self._wreg(0x01, 0x00)
cho c gửi:
self._wreg(0x09, c)
self._wreg(0x01, cmd)
nếu cmd == 0x0C:
self._sflags(0x0D, 0x80)
i = 2000
trong khi Đúng:
n = self._rreg(0x04)
tôi -= 1
nếu ~((i != 0) và ~(n & 0x01) và ~(n & wait_irq)):
phá vỡ
self._cflags(0x0D, 0x80)
nếu tôi:
nếu (self._rreg(0x06) & 0x1B) == 0x00:
stat = tự.OK
nếu n & irq_en & 0x01:
stat = self.NOTAGERR
Elif cmd == 0x0C:
n = self._rreg(0x0A)
lbits = self._rreg(0x0C) & 0x07
nếu lbits != 0:
bit = (n – 1) * 8 + lbits
khác:
bit = n * 8
nếu n == 0:
n = 1
Elif n > 16:
n = 16
cho _ trong range (n):
recv.append(self._rreg(0x09))
khác:
stat = self.ERR
trả về stat, recv, bit
def _crc(tự, dữ liệu):
self._cflags(0x05, 0x04)
self._sflags(0x0A, 0x80)
cho c trong dữ liệu:
self._wreg(0x09, c)
self._wreg(0x01, 0x03)
tôi = 0xFF
trong khi Đúng:
n = self._rreg(0x05)
tôi -= 1
nếu không ((i != 0) và không (n & 0x04)):
phá vỡ
trả về [self._rreg(0x22), self._rreg(0x21)]
def init(tự):
tự.reset()
self._wreg(0x2A, 0x8D)
self._wreg(0x2B, 0x3E)
self._wreg(0x2D, 30)
self._wreg(0x2C, 0)
self._wreg(0x15, 0x40)
self._wreg(0x11, 0x3D)
self.antenna_on()
thiết lập lại def (tự):
self._wreg(0x01, 0x0F)
def anten_on(self, on=True):
nếu bật và ~(self._rreg(0x14) & 0x03):
self._sflags(0x14, 0x03)
khác:
self._cflags(0x14, 0x03)
yêu cầu def (tự, chế độ):
self._wreg(0x0D, 0x07)
(stat, recv, bit) = self._tocard(0x0C, [chế độ])
if (stat != self.OK) | (bit != 0x10):
stat = self.ERR
trả về chỉ số, bit
def anticoll(tự):
ser_chk = 0
ser = [0x93, 0x20]
self._wreg(0x0D, 0x00)
(stat, recv, bit) = self._tocard(0x0C, ser)
nếu stat == self.OK:
nếu len(recv) == 5:
cho tôi trong phạm vi (4):
ser_chk = ser_chk ^ recv[i]
nếu ser_chk != recv[4]:
stat = self.ERR
khác:
stat = self.ERR
trả về stat, recv
def select_tag(self, ser):
buf = [0x93, 0x70] + ser[:5]
buf += self._crc(buf)
(stat, recv, bit) = self._tocard(0x0C, buf)
trả về self.OK nếu (stat == self.OK) và (bit == 0x18) nếu không thì self.ERR
def auth(self, mode, addr, sect, ser):
trả về self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]
def stop_crypto1(tự):
self._cflags(0x08, 0x08)
def đọc(self, addr):
dữ liệu = [0x30, addr]
dữ liệu += self._crc(dữ liệu)
(stat, recv, _) = self._tocard(0x0C, dữ liệu)
trả về recv nếu stat == self.OK khác Không có
def write(self, addr, data):
buf = [0xA0, addr]
buf += self._crc(buf)
(stat, recv, bit) = self._tocard(0x0C, buf)
nếu không (stat == self.OK) hay không (bit == 4) hay không ((recv[0] & 0x0F) == 0x0A):
stat = self.ERR
khác:
buf = []
cho tôi trong phạm vi (16):
buf.append(dữ liệu[i])
buf += self._crc(buf)
(stat, recv, bit) = self._tocard(0x0C, buf)
nếu không (stat == self.OK) hay không (bit == 4) hay không ((recv[0] & 0x0F) == 0x0A):
stat = self.ERR
chỉ số trở lại
Nguồn: Plato Data Intelligence