Lyhyt johdanto
Älykäs koti on yleistymässä tekniikan kehityksen myötä, tässä artikkelissa keskitytään älykkään kulunvalvontaprojektin turvallisuusnäkökohtiin.
Tämä artikkeli käyttää STONEn kosketusnäyttö lähettää komentoja MCU:lle releen ja MFRC522-moduulin ohjaamiseksi.
Kortin lukemisen periaate: RFID-RC522-moduulia ajamalla tunnistaa henkilökortin ID läheltä henkilökorttia ja sitten selvitä onko tunniste olemassa tietokannassa sanan tyypillinen, ID on sanan tyypillinen arvo, jos varmennus on olemassa , ja tulosta sitten vastaava nimi ja käytä sitten sähkömagneettista lukkoa samalla tavalla.
Vaadittavat materiaalit
- ESP32
- KOB elektroninen lukko
- Rele
- STONE STWI070WT-01 kosketuspaneelinäyttö
- MFRC522 moduuli
Toteutunut toiminto
- kortin rekisteröinti.
- käyttäjätunnuksen ja salasanan rekisteröinti.
- korttia pyyhkäisemällä avataksesi elektronisen lukon.
- Käyttäjätunnus ja salasana elektronisen lukon avaamiseen.
Päälaitteiston kuvaus
RFID -moduuli
Tämä moduuli voidaan ladata suoraan useisiin lukijamoduuleihin. Se käyttää 3.3 V:n jännitettä SPI-liitännän kautta muutamalla johdolla. Suoraan CPU-emolevyyn yhdistetty moduuli voi toimia vakaasti ja luotettavasti etäisyyskortinlukijana.
STWI070WT-01 on suunniteltu TFT-näytöksi ja kosketusohjaimeksi. Se sisältää prosessorin, ohjausohjelman, ohjaimen, flash-muistin, RS232/RS422/RS485/TTL/LAN-portin, Wi-Fi-/Bluetooth-, kosketusnäytön, virtalähteen jne., joten se on koko näyttöjärjestelmä, joka perustuu tehokkaaseen ja helppoon. käyttöjärjestelmä, jota voi ohjata millä tahansa MCU:lla.
GUI-suunnittelu
Koodin jakaminen
tuonti mfrc522
tuontiaika
tuo _säie
os import unamesta
koneen tuonnista Pin, UART
#pyb-tuonti UART
#tuontikone
suos = Pin(32,Pin.OUT)
uart2 = UART(2, baudinopeus=115200, rx=16,tx=17,aikakatkaisu=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 = Epätosi
password_flag = Väärin
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():
yrittää:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(tilasto, raaka_uid) = rdr.anticoll()
if stat == rdr.OK:
tulosta ("Uusi kortti havaittu")
print(” – tunnisteen tyyppi: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
Tulosta("")
if rdr.select_tag(raw_uid) == rdr.OK:
avain = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, avain, 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:
tulosta ("kortille kirjoitetut tiedot")
else:
tulosta ("Tietojen kirjoittaminen kortille epäonnistui")
else:
tulosta ("Todennusvirhe")
else:
tulosta ("Tagin valinta epäonnistui")
paitsi KeyboardInrtrupt:
tulosta ("kirjoitusvirhe")
def do_read():
kun taas totta:
yrittää:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(tilasto, raaka_uid) = rdr.anticoll()
if stat == rdr.OK:
tulosta ("Uusi kortti havaittu")
print(” – tunnisteen tyyppi: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
tulosta (raaka_uid[0], raaka_uid[1], raaka_uid[2], raaka_uid[3])
Tulosta("")
if rdr.select_tag(raw_uid) == rdr.OK:
avain = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, avain, raw_uid) == rdr.OK:
print("Osoitteen 8 tiedot: %s" % rdr.read(8))
ps:lle henkilöstötunnuksessa:
if raw_uid[0:4:1] == henkilöstötunnus.get(ps):
suos.value(1)
tulosta (ps)
uart_write(ps, *raw_uid[0:4:1])
time.sleep (3)
uart2.sendbreak()
rikkoa
rdr.stop_crypto1()
time.sleep (3)
suos.value(0)
else:
tulosta ("Todennusvirhe")
else:
tulosta ("Tagin valinta epäonnistui")
jos uart2.any()>1:
rx2 = []
data_name2 = "
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = lista(bin_data)
kohteelle rx1:ssä:
rx2.append(chr(tuote))
tulosta (rx2)
if rx1[3:5:1] == button_cmd:
data_name_len = rx1[6] – 1
data_name = rx2[7:data_name_len+7:1]
data_name2 = .join(datan_name)
tulosta(datan_nimi2)
if data_name2 == 'back3':
palata
paitsi KeyboardInrtrupt:
tulosta ("lukuvirhe")
def do_read2 (idd):
tulosta (idd)
kun taas totta:
yrittää:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(tilasto, raaka_uid) = rdr.anticoll()
if stat == rdr.OK:
tulosta ("Uusi kortti havaittu")
print(” – tunnisteen tyyppi: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
tulosta (raaka_uid[0], raaka_uid[1], raaka_uid[2], raaka_uid[3])
Tulosta("")
if rdr.select_tag(raw_uid) == rdr.OK:
avain = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, avain, raw_uid) == rdr.OK:
print("Osoitteen 8 tiedot: %s" % rdr.read(8))
henkilöstötunnus[idd] = raw_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
else:
tulosta ("Todennusvirhe")
else:
tulosta ("Tagin valinta epäonnistui")
jos uart2.any()>1:
rx2 = []
data_name2 = "
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = lista(bin_data)
kohteelle rx1:ssä:
rx2.append(chr(tuote))
if rx1[3:5:1] == button_cmd:
data_name_len = rx1[6] – 1
data_name = rx2[7:data_name_len+7:1]
data_name2 = .join(datan_name)
tulosta(datan_nimi2)
if data_name2 == 'back1':
palata
paitsi KeyboardInrtrupt:
tulosta ("lukuvirhe")
def uart_write(text, *ids):
# print (teksti, *tunnukset)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"kortinnimi1",teksti":"'+str(teksti)+'"}>ET' )
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid1",teksti":"'+str(ids)+'"}>ET' )
uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock1","näkyvä":true}>ET')
time.sleep (3)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardname1",teksti":"""}>ET')
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid1",teksti":"""}>ET')
uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock1","näkyvä":false}>ET')
def uart_write2(teksti,teksti2):
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"'+teksti+'"}>ET')
time.sleep (3)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"'+teksti2+'"}>ET')
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit2",teksti":"""}>ET')
def uart_write3(*id2):
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"'+str(id2)+'"}>ET' )
time.sleep (3)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"""}>ET')
def uart_write4(teksti,teksti2):
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"kirjautuminen","teksti":"'+teksti+'"}>ET')
time.sleep (1)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"kirjautuminen","teksti":"'+teksti2+'"}>ET')
time.sleep (1)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit3",teksti":"""}>ET')
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit4",teksti":"""}>ET')
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit7",teksti":"""}>ET')
def uart_write5():
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"'+str(id2)+'"}>ET' )
time.sleep (3)
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"""}>ET')
def card_zhuce():
kun taas totta:
jos uart2.any():
user_id = "
salasana = "
rx2 = []
rx_num = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = lista(bin_data)
kohteelle rx1:ssä:
rx2.append(chr(tuote))
rx_num += 1
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = .join(data_id_st)
print(data_id_st2)
if data_id_st2 == 'muokkaa1':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = .join(data_id_st3)
print(data_id_st4)
if data_id_st4 != ”:
nimi = Totta
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 = Totta
uart_write2('Vahvistus läpäissyt!','Aseta kortti!')
do_read2(data_id_st4)
palata
def mima_zuce():
temp_id3 = "
temp_mima3 = "
kun taas totta:
jos uart2.any():
user_id = "
salasana = "
rx2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = lista(bin_data)
kohteelle rx1:ssä:
rx2.append(chr(tuote))
rx_num += 1
# if (rx2[rx_num] == 'T') ja (rx2[rx_num-1] == 'E') ja (rx2[rx_num-2] == '>'):
# tauko
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = .join(data_id_st)
print(data_id_st2)
if rx1[3:5:1] == button_cmd:
data_name_len = rx1[6] – 1
data_name = rx2[7:data_name_len+7:1]
data_name2 = .join(datan_name)
tulosta(datan_nimi2)
if data_name2 == 'back2':
palata
if data_id_st2 == 'muokkaa3':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = .join(data_id_st3)
print(data_id_st4)
user_id_flag = Tosi
temp_id3 = data_id_st4
# personal_ps[temp_id] = raw_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 = Totta
temp_mima3 = data_id_st6
# personnel_ps[temp_id] = salasana_lippu
# print(rx2,user_id_flag,password_flag)
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) ja (password_flag == True) ja (user_id_flag == True):
admin = Totta
henkilöstö_ps[temp_id3] = temp_mima3
password_flag = Väärin
user_id_flag = Epätosi
uart_write4('Vahvistus suoritettu!','kirjautuminen onnistui!')
def password_loin():
temp_id2 = "
temp_mima = "
kun taas totta:
jos uart2.any():
user_id = "
salasana = "
rx2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = lista(bin_data)
kohteelle rx1:ssä:
rx2.append(chr(tuote))
rx_num += 1
# if (rx2[rx_num] == 'T') ja (rx2[rx_num-1] == 'E') ja (rx2[rx_num-2] == '>'):
# tauko
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = .join(data_id_st)
print(data_id_st2)
if rx1[3:5:1] == button_cmd:
data_name_len = rx1[6] – 1
data_name = rx2[7:data_name_len+7:1]
data_name2 = .join(datan_name)
tulosta(datan_nimi2)
if data_name2 == 'back4':
palata
if data_id_st2 == 'muokkaa5':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = .join(data_id_st3)
print(data_id_st4)
if data_id_st4 in personnel_ps:
user_id_flag = Tosi
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)
tulosta (temp_id2)
tulosta (personnel_ps)
if personnel_ps.get(temp_id2) == data_id_st6:
password_flag = Totta
# print(rx2,user_id_flag,password_flag)
tulosta(käyttäjätunnus_lippu,salasanalippu)
if (password_flag == True) ja (user_id_flag == True):
uart_write(temp_id2,temp_id2)
password_flag = Väärin
user_id_flag = Epätosi
suos.value(1)
uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock2","näkyvä":true}>ET')
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit5",teksti":"""}>ET')
uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit6",teksti":"""}>ET')
time.sleep (3)
# uart_write('opiskelija',)
suos.value(0)
uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock2","näkyvä":false}>ET')
uart2.sendbreak()
kun taas totta:
jos uart2.any()>1:
rx2 = []
data_name2 = "
bin_data = uart2.read(40)
# aika.uni(1)
uart2.sendbreak()
# aika.uni(1)
rx1 = lista(bin_data)
kohteelle rx1:ssä:
rx2.append(chr(tuote))
tulosta (rx2)
if rx1[3:5:1] == button_cmd:
data_name_len = rx1[6] – 1
data_name = rx2[7:data_name_len+7:1]
data_name2 = .join(datan_name)
tulosta(datan_nimi2)
if data_name2 == 'kortti1':
card_zhuce()
elif data_name2 == 'salasana1':
mima_zuce()
elif data_name2 == 'kortti2':
do_read()
elif data_name2 == 'salasana2':
password_loin()
MFRC522.py
koneen tuonnista Pin, SPI
os import unamesta
luokka MFRC522:
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)
itse.ensimmäinen.arvo(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(baudrate=100000, polarity=0, phase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
self.spi.init()
else:
nosta RuntimeError ("Ei tuettu alusta")
itse.ensimmäinen.arvo(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(itse, 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)
paluuarvo[0]
def _sflags(self, reg, mask):
self._wreg(reg, self._rreg(reg) | mask)
def _cflags(self, reg, mask):
self._wreg(reg, self._rreg(reg) & (~mask))
def _tocard(itse, cmd, lähetä):
recv = []
bittiä = irq_en = odota_irq = n = 0
stat = itse.ERR
jos cmd == 0x0E:
irq_en = 0x12
odota_irq = 0x10
elif cmd == 0x0C:
irq_en = 0x77
odota_irq = 0x30
self._wreg(0x02, irq_en | 0x80)
self._cflags(0x04, 0x80)
self._s flags(0x0A, 0x80)
self._wreg(0x01, 0x00)
c in send:
self._wreg(0x09, c)
self._wreg(0x01, cmd)
jos cmd == 0x0C:
self._slags(0x0D, 0x80)
i = 2000
kun taas totta:
n = itse._rreg(0x04)
i - = 1
jos ~((i != 0) ja ~(n & 0x01) ja ~(n & odota_irq)):
rikkoa
self._cflags(0x0D, 0x80)
jos minä:
if (self._rreg(0x06) & 0x1B) == 0x00:
stat = itse.OK
jos n & irq_en & 0x01:
stat = self.NOTAGERR
elif cmd == 0x0C:
n = itse._rreg(0x0A)
lbits = self._rreg(0x0C) & 0x07
jos lbits != 0:
bittiä = (n – 1) * 8 + lbits
else:
bittiä = n * 8
jos n == 0:
n = 1
elif n > 16:
n = 16
kohteelle _ alueella(n):
recv.append(self._rreg(0x09))
else:
stat = itse.ERR
paluu stat, recv, bitit
def _crc(itse, data):
self._cflags(0x05, 0x04)
self._s flags(0x0A, 0x80)
c:lle tiedoissa:
self._wreg(0x09, c)
self._wreg(0x01, 0x03)
i = 0xFF
kun taas totta:
n = itse._rreg(0x05)
i - = 1
jos ei ((i != 0) ja ei (n & 0x04)):
rikkoa
return [self._rreg(0x22), self._rreg(0x21)]
def init(itse):
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 (itse):
self._wreg(0x01, 0x0F)
def antenna_on(self, on=True):
jos päällä ja ~(self._rreg(0x14) & 0x03):
self._s flags(0x14, 0x03)
else:
self._cflags(0x14, 0x03)
def-pyyntö (itse, tila):
self._wreg(0x0D, 0x07)
(stat, recv, bits) = self._tocard(0x0C, [mode])
if (tila != itse.OK) | (bittiä != 0x10):
stat = itse.ERR
paluutilasto, bittiä
def anticoll(itse):
ser_chk = 0
ser = [0x93, 0x20]
self._wreg(0x0D, 0x00)
(stat, recv, bits) = self._tocard(0x0C, ser)
if stat == self.OK:
jos len(recv) == 5:
i: lle alueella (4):
ser_chk = ser_chk ^ recv[i]
if ser_chk != recv[4]:
stat = itse.ERR
else:
stat = itse.ERR
paluutila, palautus
def select_tag(self, ser):
buf = [0x93, 0x70] + ser[:5]
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
palauta self.OK if (stat == self.OK) ja (bits == 0x18) else self.ERR
def auth(self, mode, addr, sect, ser):
return self._tocard(0x0E, [tila, addr] + sect + ser[:4])[0]
def stop_crypto1(self):
self._cflags(0x08, 0x08)
def read(itse, addr):
data = [0x30, osoite]
data += itse._crc(data)
(tilasto, palautus, _) = self._tocard(0x0C, data)
palauta palautus, jos stat == self.OK else Ei mitään
def write(self, addr, data):
buf = [0xA0, addr]
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
jos ei (stat == self.OK) tai ei (bittiä == 4) vai ei ((recv[0] & 0x0F) == 0x0A):
stat = itse.ERR
else:
buf = []
i: lle alueella (16):
buf.append(data[i])
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
jos ei (stat == self.OK) tai ei (bittiä == 4) vai ei ((recv[0] & 0x0F) == 0x0A):
stat = itse.ERR
palautustila
Lähde: Platon Data Intelligence