Rövid bemutatkozás
Az intelligens otthon a technológia fejlődésével egyre gyakoribb, ez a cikk az intelligens beléptetőprojekt biztonsági szempontjaira összpontosít.
Ez a cikk használja STONE érintőképernyője parancsokat küldeni az MCU-nak a relé és az MFRC522 modul vezérléséhez.
A kártyaolvasás elve: az RFID-RC522 modul vezetésével azonosítsa a személyi igazolvány azonosítóját az igazolványhoz közel, majd határozza meg, hogy az azonosító létezik-e az adatbázisban a tipikus szó adatbázisában, az ID a szó tipikus értéke, ha az ellenőrzés megléte , majd nyomtassa ki a megfelelő nevet, majd ugyanígy hajtsa be az elektromágneses zárat.
Szükséges anyagok
- ESP32
- KOB elektronikus zár
- Relé
- STONE STWI070WT-01 érintőképernyős kijelző
- MFRC522 modul
Megvalósult funkció
- kártya regisztráció.
- felhasználónév és jelszó regisztráció.
- kártyahúzással az elektronikus zár feloldásához.
- Felhasználónév és jelszó az elektronikus zár feloldásához.
A fő hardver leírása
RFID modul
Ez a modul közvetlenül betölthető különböző olvasómodulokba. 3.3 V feszültséget használ az SPI interfészen keresztül, mindössze néhány vezetékkel. A CPU-alaplaphoz közvetlenül csatlakoztatva a modul stabilan és megbízhatóan működhet távolsági kártyaolvasóként.
Az STWI070WT-01 TFT-monitorként és érintőképernyős vezérlőként készült. Tartalmaz processzort, vezérlőprogramot, illesztőprogramot, flash memóriát, RS232/RS422/RS485/TTL/LAN portot, Wi-Fi-t/Bluetooth-ot, érintőképernyőt, tápegységet stb., így ez egy teljes kijelzőrendszer, amely a nagy teljesítményen és az egyszerűségen alapul. operációs rendszer, amely bármely MCU-val vezérelhető.
GUI tervezés
Kód Megosztás
import mfrc522
import idő
import _szál
az os import uname
gépi importból Pin, UART
#a pyb import UART-ból
#import gép
suos = Pin(32,Pin.OUT)
uart2 = UART(2, baudráta=115200, rx=16,tx=17,időtúllépés=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 = Hamis
password_flag = Hamis
temp_id = ”
temp_mima = ”
personnel_id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}
personnel_ps = {'zbw':'zbw3366','lbw':'lbwnb'}
admin_password = ('yyds')
button_cmd = [16,1]
edit1_cmd = [16,112 XNUMX]
edit2_cmd = [16,113 XNUMX]
edit3_cmd = [16,114 XNUMX]
if uname()[0] == 'esp32':
rdr = mfrc522.MFRC522(ESP32_HSPI_CLOCK, ESP32_HSPI_MOSI, ESP32_HSPI_MISO, ESP32_MFRC522_RST, ESP32_HSPI_SLAVE_SELECT)
def do_write():
próbálja ki:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, nyers_uid) = rdr.anticoll()
if stat == rdr.OK:
print ("Új kártya észlelve")
print(” – címke típusa: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (nyers_uid[0], nyers_uid[1], nyers_uid[2], nyers_uid[3]))
nyomtatás("")
if rdr.select_tag(raw_uid) == rdr.OK:
kulcs = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, kulcs, 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()
if stat == rdr.OK:
nyomtatás (“Kártyára írt adatok”)
más:
print ("Nem sikerült az adatokat a kártyára írni")
más:
nyomtatás ("Hitelesítési hiba")
más:
print ("Nem sikerült kiválasztani a címkét")
kivéve a KeyboardInterrupt:
nyomtatás ("írási hiba")
def do_read():
míg True:
próbálja ki:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, nyers_uid) = rdr.anticoll()
if stat == rdr.OK:
print ("Új kártya észlelve")
print(” – címke típusa: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (nyers_uid[0], nyers_uid[1], nyers_uid[2], nyers_uid[3]))
nyomtatás (nyers_uid[0], nyers_uid[1], nyers_uid[2], nyers_uid[3])
nyomtatás("")
if rdr.select_tag(raw_uid) == rdr.OK:
kulcs = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, kulcs, raw_uid) == rdr.OK:
print(“8. cím adata: %s” % rdr.read(8))
ps számára a personal_id-ben:
if raw_uid[0:4:1] == personal_id.get(ps):
suos.value(1)
nyomtatás (ps)
uart_write(ps, *raw_uid[0:4:1])
time.sleep (3)
uart2.sendbreak()
szünet
rdr.stop_crypto1()
time.sleep (3)
suos.value(0)
más:
nyomtatás ("Hitelesítési hiba")
más:
print ("Nem sikerült kiválasztani a címkét")
ha uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = lista(bin_data)
az rx1-ben lévő tételhez:
rx2.append(chr(elem))
nyomtatás (rx2)
if rx1[3:5:1] == gomb_cmd:
adat_név_len = rx1[6] – 1
adat_neve = rx2[7:adat_név_len+7:1]
adat_neve2 = .join(adat_neve)
print(adat_név2)
if data_name2 == 'back3':
visszatérés
kivéve a KeyboardInterrupt:
nyomtatás ("olvasási hiba")
def do_read2 (idd):
nyomtatás (idd)
míg True:
próbálja ki:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, nyers_uid) = rdr.anticoll()
if stat == rdr.OK:
print ("Új kártya észlelve")
print(” – címke típusa: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (nyers_uid[0], nyers_uid[1], nyers_uid[2], nyers_uid[3]))
nyomtatás (nyers_uid[0], nyers_uid[1], nyers_uid[2], nyers_uid[3])
nyomtatás("")
if rdr.select_tag(raw_uid) == rdr.OK:
kulcs = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, kulcs, raw_uid) == rdr.OK:
print(“8. cím adata: %s” % rdr.read(8))
személyzeti_azonosító[idd] = nyers_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
más:
nyomtatás ("Hitelesítési hiba")
más:
print ("Nem sikerült kiválasztani a címkét")
ha uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = lista(bin_data)
az rx1-ben lévő tételhez:
rx2.append(chr(elem))
if rx1[3:5:1] == gomb_cmd:
adat_név_len = rx1[6] – 1
adat_neve = rx2[7:adat_név_len+7:1]
adat_neve2 = .join(adat_neve)
print(adat_név2)
if data_name2 == 'back1':
visszatérés
kivéve a KeyboardInterrupt:
nyomtatás ("olvasási hiba")
def uart_write(text, *ids):
# nyomtatás (szöveg, *azonosítók)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"kártyanév1",szöveg":"'+str(text)+'"}>ET' )
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid1","text":"'+str(ids)+'"}>ET' )
uart2.write('ST<{"cmd_code":"látható_készlet","type":"widget","widget":"lock1","látható":true}>ET')
time.sleep (3)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"kártyanév1",szöveg":"""}>ET')
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid1",text":"""}>ET')
uart2.write('ST<{"cmd_code":"látható_készlet","type":"widget","widget":"lock1","látható":false}>ET')
def uart_write2(text,text2):
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+text+'"}>ET')
time.sleep (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' )
time.sleep (3)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"""}>ET')
def uart_write4(text,text2):
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"bejelentkezés","text":"'+text+'"}>ET')
time.sleep (1)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"bejelentkezés","szöveg":"'+text2+'"}>ET')
time.sleep (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')
def uart_write5():
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+str(id2)+'"}>ET' )
time.sleep (3)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"""}>ET')
def card_zhuce():
míg True:
ha uart2.any():
user_id = ”
jelszó = ”
rx2 = []
rx_szám = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = lista(bin_data)
az rx1-ben lévő tételhez:
rx2.append(chr(elem))
rx_szám += 1
adat_vége = rx_szám-5
data_id_st = rx2[8:13:1]
data_id_st2 = .join(data_id_st)
print(data_id_st2)
if data_id_st2 == 'edit1':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = .join(data_id_st3)
print(data_id_st4)
if data_id_st4 != ”:
név = Igaz
elif data_id_st2 == 'edit2':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = .join(data_id_st5)
if data_id_st6 == admin_password:
admin = Igaz
uart_write2('Az ellenőrzés sikeres!','Kérjük, helyezze be a kártyát!')
do_read2(data_id_st4)
visszatérés
def mima_zuce():
temp_id3 = ”
temp_mima3 = ”
míg True:
ha uart2.any():
user_id = ”
jelszó = ”
rx2 = []
rx_szám = 0
# adat_vége = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = lista(bin_data)
az rx1-ben lévő tételhez:
rx2.append(chr(elem))
rx_szám += 1
# if (rx2[rx_num] == 'T') és (rx2[rx_num-1] == 'E') és (rx2[rx_num-2] == '>'):
# szünet
adat_vége = rx_szám-5
data_id_st = rx2[8:13:1]
data_id_st2 = .join(data_id_st)
print(data_id_st2)
if rx1[3:5:1] == gomb_cmd:
adat_név_len = rx1[6] – 1
adat_neve = rx2[7:adat_név_len+7:1]
adat_neve2 = .join(adat_neve)
print(adat_név2)
if data_name2 == 'back2':
visszatérés
if data_id_st2 == 'edit3':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = .join(data_id_st3)
print(data_id_st4)
user_id_flag = Igaz
temp_id3 = data_id_st4
# személyzeti_psz[temp_id] = nyers_uid[0:4:1]
elif data_id_st2 == 'edit4':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = .join(data_id_st5)
print(data_id_st6)
# if personnel_ps.get(temp_id) == data_id_st6:
password_flag = Igaz
temp_mima3 = data_id_st6
# personnel_ps[temp_id] = jelszó_jelző
# print(rx2,felhasználói_azonosító-zászló,jelszó-zászló)
elif data_id_st2 == 'edit7':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = .join(data_id_st5)
if (data_id_st6 == admin_password) és (password_flag == True) és (user_id_flag == True):
admin = Igaz
személyzeti_ps[temp_id3] = temp_mima3
password_flag = Hamis
user_id_flag = Hamis
uart_write4('Az ellenőrzés sikeres!','A bejelentkezés sikeres volt!')
def password_loin():
temp_id2 = ”
temp_mima = ”
míg True:
ha uart2.any():
user_id = ”
jelszó = ”
rx2 = []
rx_szám = 0
# adat_vége = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = lista(bin_data)
az rx1-ben lévő tételhez:
rx2.append(chr(elem))
rx_szám += 1
# if (rx2[rx_num] == 'T') és (rx2[rx_num-1] == 'E') és (rx2[rx_num-2] == '>'):
# szünet
adat_vége = rx_szám-5
data_id_st = rx2[8:13:1]
data_id_st2 = .join(data_id_st)
print(data_id_st2)
if rx1[3:5:1] == gomb_cmd:
adat_név_len = rx1[6] – 1
adat_neve = rx2[7:adat_név_len+7:1]
adat_neve2 = .join(adat_neve)
print(adat_név2)
if data_name2 == 'back4':
visszatérés
if data_id_st2 == 'edit5':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = .join(data_id_st3)
print(data_id_st4)
if data_id_st4 a personal_ps-ben:
user_id_flag = Igaz
temp_id2 = data_id_st4
elif data_id_st2 == 'edit6':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = .join(data_id_st5)
print(data_id_st6)
print(temp_id2)
print(personnel_ps)
if personnel_ps.get(temp_id2) == data_id_st6:
password_flag = Igaz
# print(rx2,felhasználói_azonosító-zászló,jelszó-zászló)
print(felhasználói_azonosító_zászló,jelszó_zászló)
if (password_flag == True) és (user_id_flag == True):
uart_write(temp_id2,temp_id2)
password_flag = Hamis
user_id_flag = Hamis
suos.value(1)
uart2.write('ST<{"cmd_code":"látható_készlet","type":"widget","widget":"lock2","látható":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')
time.sleep (3)
# uart_write('tanuló',")
suos.value(0)
uart2.write('ST<{"cmd_code":"látható_készlet","type":"widget","widget":"lock2","látható":false}>ET')
uart2.sendbreak()
míg True:
ha uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
# idő.alvás(1)
uart2.sendbreak()
# idő.alvás(1)
rx1 = lista(bin_data)
az rx1-ben lévő tételhez:
rx2.append(chr(elem))
nyomtatás (rx2)
if rx1[3:5:1] == gomb_cmd:
adat_név_len = rx1[6] – 1
adat_neve = rx2[7:adat_név_len+7:1]
adat_neve2 = .join(adat_neve)
print(adat_név2)
if data_name2 == 'kártya1':
card_zhuce()
elif data_name2 == 'password1':
mima_zuce()
elif data_name2 == 'kártya2':
do_read()
elif data_name2 == 'password2':
password_loin()
MFRC522.py
gépi importból Pin, SPI
az os import uname
MFRC522 osztály:
OK = 0
NOTAGERR = 1
ERR = 2
REQIDL = 0x26
REQALL = 0x52
AUTHENT1A = 0x60
AUTHENT1B = 0x61
def __init__(self, sck, mosi, miso, rst, cs):
self.sck = Pin(sck, Pin.OUT)
self.mosi = Pin(mosi, Pin.OUT)
self.miso = Pin(miso)
self.rst = Pin(rst, Pin.OUT)
self.cs = Pin(cs, Pin.OUT)
self.rst.value(0)
self.cs.value(1)
board = uname()[0]
if board == 'WiPy' or board == 'LoPy' or board == 'FiPy':
self.spi = SPI(0)
self.spi.init(SPI.MASTER, baudrate=1000000, pins=(self.sck, self.mosi, self.miso))
elif board == ‘esp32’:
self.spi = SPI(baudráta=100000, polaritás=0, fázis=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
self.spi.init()
más:
RuntimeError ("Nem támogatott platform") emelése
self.rst.value(1)
self.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(self, 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)
return val[0]
def _sflags(self, reg, mask):
self._wreg(reg, self._rreg(reg) | maszk)
def _cflags(self, reg, mask):
self._wreg(reg, self._rreg(reg) & (~maszk))
def _tocard(self, cmd, send):
recv = []
bit = irq_en = vár_irq = n = 0
stat = self.ERR
ha cmd == 0x0E:
irq_en = 0x12
vár_irq = 0x10
elif cmd == 0x0C:
irq_en = 0x77
vár_irq = 0x30
self._wreg(0x02, irq_en | 0x80)
self._cflags(0x04, 0x80)
self._sflags(0x0A, 0x80)
self._wreg(0x01, 0x00)
c in send esetén:
self._wreg(0x09, c)
self._wreg(0x01, cmd)
ha cmd == 0x0C:
self._sflags(0x0D, 0x80)
i = 2000
míg True:
n = self._rreg(0x04)
i -= 1
ha ~((i != 0) és ~(n & 0x01) és ~(n & wait_irq)):
szünet
self._cflags(0x0D, 0x80)
ha én:
if (self._rreg(0x06) & 0x1B) == 0x00:
stat = self.OK
ha n & irq_en & 0x01:
stat = self.NOTAGERR
elif cmd == 0x0C:
n = self._rreg(0x0A)
lbits = self._rreg(0x0C) & 0x07
ha lbit != 0:
bit = (n – 1) * 8 + lbit
más:
bit = n * 8
ha n == 0:
n = 1
elif n > 16:
n = 16
_ esetén az(n) tartományban:
recv.append(self._rreg(0x09))
más:
stat = self.ERR
return stat, recv, bits
def _crc(self, data):
self._cflags(0x05, 0x04)
self._sflags(0x0A, 0x80)
c adatban:
self._wreg(0x09, c)
self._wreg(0x01, 0x03)
i = 0xFF
míg True:
n = self._rreg(0x05)
i -= 1
ha nem ((i != 0) és nem (n & 0x04)):
szünet
return [self._rreg(0x22), self._rreg(0x21)]
def init(self):
self.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()
def reset(ön):
self._wreg(0x01, 0x0F)
def antenna_on(self, on=True):
ha be és ~(self._rreg(0x14) & 0x03):
self._sflags(0x14, 0x03)
más:
self._cflags(0x14, 0x03)
def kérés (ön, mód):
self._wreg(0x0D, 0x07)
(stat, recv, bits) = self._tocard(0x0C, [mode])
if (stat != self.OK) | (bitek != 0x10):
stat = self.ERR
return stat, bits
def anticoll (self):
ser_chk = 0
ser = [0x93, 0x20]
self._wreg(0x0D, 0x00)
(stat, recv, bits) = self._tocard(0x0C, ser)
if stat == self.OK:
ha len(recv) == 5:
i (4) tartományban:
ser_chk = ser_chk ^ recv[i]
if ser_chk != recv[4]:
stat = self.ERR
más:
stat = self.ERR
return stat, recv
def select_tag(self, ser):
buf = [0x93, 0x70] + ser[:5]
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
return self.OK if (stat == self.OK) és (bits == 0x18) else self.ERR
def auth(self, mode, addr, sect, ser):
return self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]
def stop_crypto1(self):
self._cflags(0x08, 0x08)
def read(self, addr):
adatok = [0x30, cím]
adatok += self._crc(data)
(stat, recv, _) = self._tocard(0x0C, data)
return recv if stat == self.OK else None
def write(self, addr, data):
buf = [0xA0, cím]
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
ha nem (stat == self.OK) vagy nem (bit == 4) vagy nem ((recv[0] & 0x0F) == 0x0A):
stat = self.ERR
más:
buf = []
i (16) tartományban:
buf.append(data[i])
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
ha nem (stat == self.OK) vagy nem (bit == 4) vagy nem ((recv[0] & 0x0F) == 0x0A):
stat = self.ERR
vissza stat
Forrás: Plato Data Intelligence