Kort introduksjon
Smarte hjem blir mer og mer vanlig med utviklingen av teknologi, denne artikkelen vil fokusere på sikkerhetsaspektene ved det intelligente tilgangskontrollprosjektet.
Denne artikkelen bruker STONE sin berøringsskjerm å sende kommandoer til MCU for å kontrollere reléet og MFRC522-modulen.
Prinsippet for kortlesing: ved å kjøre RFID-RC522-modulen, identifisere ID-kort-ID-en nær ID-kortet, og deretter finne ut om ID-en finnes i databasen for ordet typisk, ID er den typiske verdien av ordet, hvis eksistensen av verifiseringen gjennom , og skriv deretter ut det tilsvarende navnet, og kjør deretter den elektromagnetiske låsen på samme måte.
Nødvendige materialer
- ESP32
- KOB elektronisk lås
- Relay
- STONE STWI070WT-01 berøringspanelskjerm
- MFRC522-modul
Realisert funksjon
- kortregistrering.
- brukernavn og passord registrering.
- kortsveip for å låse opp den elektroniske låsen.
- Brukernavn og passord for å låse opp den elektroniske låsen.
Hovedmaskinvarebeskrivelsen
RFID-modul
Denne modulen kan lastes direkte inn i ulike lesermoduler. Den bruker en spenning på 3.3V, gjennom SPI-grensesnittet med bare noen få ledninger. Direkte koblet til et CPU-hovedkort, kan modulen fungere på en stabil og pålitelig måte som en avstandskortleser.
STWI070WT-01 er utviklet som TFT-skjerm og berøringskontroller. Den inkluderer prosessor, kontrollprogram, driver, flashminne, RS232/RS422/RS485/TTL/LAN-port, Wi-Fi/Bluetooth, berøringsskjerm, strømforsyning etc., så det er et helt skjermsystem basert på det kraftige og enkle operativsystem, som kan kontrolleres av en hvilken som helst MCU.
GUI-design
Kodedeling
importer mfrc522
importtid
importer _tråd
fra os import uname
fra maskinimport Pin, UART
#fra pyb import UART
#import maskin
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 = False
password_flag = False
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]
edit2_cmd = [16,113]
edit3_cmd = [16,114]
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øve:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, rå_uid) = rdr.anticoll()
if stat == rdr.OK:
print ("Nytt kort oppdaget")
print(” – tagtype: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
skrive ut("")
hvis rdr.select_tag(raw_uid) == rdr.OK:
nøkkel = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
hvis rdr.auth(rdr.AUTHENT1A, 8, nøkkel, rå_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:
print(“Data skrevet til kort”)
ellers:
print ("Kunne ikke skrive data til kortet")
ellers:
print(“Autentiseringsfeil”)
ellers:
print ("Kunne ikke velge tag")
unntatt KeyboardInterrupt:
print(“skrivefeil”)
def do_read():
mens sant:
prøve:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, rå_uid) = rdr.anticoll()
if stat == rdr.OK:
print ("Nytt kort oppdaget")
print(” – tagtype: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
print (rå_uid[0], rå_uid[1], rå_uid[2], rå_uid[3])
skrive ut("")
hvis rdr.select_tag(raw_uid) == rdr.OK:
nøkkel = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
hvis rdr.auth(rdr.AUTHENT1A, 8, nøkkel, rå_uid) == rdr.OK:
print(“Adresse 8 data: %s” % rdr.read(8))
for ps i personnel_id:
if raw_uid[0:4:1] == personnel_id.get(ps):
suos.value(1)
print(ps)
uart_write(ps, *raw_uid[0:4:1])
time.sleep (3)
uart2.sendbreak()
bryte
rdr.stop_crypto1()
time.sleep (3)
suos.value(0)
ellers:
print(“Autentiseringsfeil”)
ellers:
print ("Kunne ikke velge tag")
if uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = liste(bin_data)
for element i rx1:
rx2.append(chr(item))
print (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(data_name)
print(data_name2)
if data_name2 == 'back3':
retur
unntatt KeyboardInterrupt:
print(“lesefeil”)
def do_read2 (idd):
print(idd)
mens sant:
prøve:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, rå_uid) = rdr.anticoll()
if stat == rdr.OK:
print ("Nytt kort oppdaget")
print(” – tagtype: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
print (rå_uid[0], rå_uid[1], rå_uid[2], rå_uid[3])
skrive ut("")
hvis rdr.select_tag(raw_uid) == rdr.OK:
nøkkel = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
hvis rdr.auth(rdr.AUTHENT1A, 8, nøkkel, rå_uid) == rdr.OK:
print(“Adresse 8 data: %s” % rdr.read(8))
personnel_id[idd] = rå_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
ellers:
print(“Autentiseringsfeil”)
ellers:
print ("Kunne ikke velge tag")
if uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = liste(bin_data)
for element i rx1:
rx2.append(chr(item))
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(data_name)
print(data_name2)
if data_name2 == 'back1':
retur
unntatt KeyboardInterrupt:
print(“lesefeil”)
def uart_write(tekst, *ids):
# print(tekst, *ID)
uart2.write('STET' )
uart2.write('STET' )
uart2.write(‘STET’)
time.sleep (3)
uart2.write(‘STET’)
uart2.write(‘STET’)
uart2.write(‘STET’)
def uart_write2(tekst,tekst2):
uart2.write(‘STET’)
time.sleep (3)
uart2.write(‘STET’)
uart2.write(‘STET’)
def uart_write3(*id2):
uart2.write('STET' )
time.sleep (3)
uart2.write(‘STET’)
def uart_write4(tekst,tekst2):
uart2.write(‘STET’)
time.sleep (1)
uart2.write(‘STET’)
time.sleep (1)
uart2.write(‘STET’)
uart2.write(‘STET’)
uart2.write(‘STET’)
def uart_write5():
uart2.write('STET' )
time.sleep (3)
uart2.write(‘STET’)
def card_zhuce():
mens sant:
if uart2.any():
user_id = ”
passord = ”
rx2 = []
rx_num = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = liste(bin_data)
for element i rx1:
rx2.append(chr(item))
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 == 'edit1':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
print(data_id_st4)
if data_id_st4 != ”:
navn = sant
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 = Sant
uart_write2(‘Bekreftelse bestått!’,‘Plasser kortet!’)
do_read2(data_id_st4)
retur
def mima_zuce():
temp_id3 = ”
temp_mima3 = ”
mens sant:
if uart2.any():
user_id = ”
passord = ”
rx2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = liste(bin_data)
for element i rx1:
rx2.append(chr(item))
rx_num += 1
# if (rx2[rx_num] == ‘T’) og (rx2[rx_num-1] =[rx_num-2] =[ rx_num-2] =[ rx_num-XNUMX] =[ rx_num-XNUMX] =[ rx_nummer-XNUMX] =[ rx_nummer-XNUMX]
# gå i stykker
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(data_name)
print(data_name2)
if data_name2 == 'back2':
retur
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 = Sant
temp_id3 = data_id_st4
# personnel_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)
# hvis personnel_ps.get(temp_id) == data_id_st6:
password_flag = Sant
temp_mima3 = data_id_st6
# personnel_ps[temp_id] = password_flag
# 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) og (password_flag == True) og (user_id_flag == True):
admin = Sant
personnel_ps[temp_id3] = temp_mima3
password_flag = False
user_id_flag = False
uart_write4(‘Bekreftelse bestått!’,’pålogging var vellykket!’)
def password_loin():
temp_id2 = ”
temp_mima = ”
mens sant:
if uart2.any():
user_id = ”
passord = ”
rx2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = liste(bin_data)
for element i rx1:
rx2.append(chr(item))
rx_num += 1
# if (rx2[rx_num] == ‘T’) og (rx2[rx_num-1] =[rx_num-2] =[ rx_num-2] =[ rx_num-XNUMX] =[ rx_num-XNUMX] =[ rx_nummer-XNUMX] =[ rx_nummer-XNUMX]
# gå i stykker
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(data_name)
print(data_name2)
if data_name2 == 'back4':
retur
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 i personnel_ps:
user_id_flag = Sant
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(personell_ps)
hvis personnel_ps.get(temp_id2) == data_id_st6:
password_flag = Sant
# print(rx2,user_id_flag,password_flag)
print(user_id_flag,password_flag)
if (password_flag == True) og (user_id_flag == True):
uart_write(temp_id2,temp_id2)
password_flag = False
user_id_flag = False
suos.value(1)
uart2.write(‘STET’)
uart2.write(‘STET’)
uart2.write(‘STET’)
time.sleep (3)
nr
suos.value(0)
uart2.write(‘STET’)
uart2.sendbreak()
mens sant:
if uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
# time.sleep(1)
uart2.sendbreak()
# time.sleep(1)
rx1 = liste(bin_data)
for element i rx1:
rx2.append(chr(item))
print (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(data_name)
print(data_name2)
hvis data_name2 == 'kort1':
card_zhuce()
elif data_name2 == ‘passord1’:
mima_zuce()
elif data_name2 == 'kort2':
do_read()
elif data_name2 == ‘passord2’:
password_loin()
MFRC522.py
fra maskinimport Pin, SPI
fra os import uname
klasse MFRC522:
OK = 0
NOTAGERR = 1
ERR = 2
REQIDL = 0x26
REQALL = 0x52
AUTHENT1A = 0x60
AUTHENT1B = 0x61
def __init__(selv, sck, mosi, miso, fø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]
hvis board == ‘WiPy’ eller board == ‘LoPy’ eller 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, polaritet=0, fase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
self.spi.init()
ellers:
raise RuntimeError(“Ustøttet plattform”)
self.rst.value(1)
self.init()
def _wreg(selv, 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(selv, 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)
returverdi[0]
def _sflags(selv, reg, maske):
self._wreg(reg, self._rreg(reg) | maske)
def _cflags(selv, reg, maske):
self._wreg(reg, self._rreg(reg) & (~maske))
def _tocard(selv, cmd, send):
recv = []
bits = irq_en = wait_irq = n = 0
stat = selv.FEIL
hvis cmd == 0x0E:
irq_en = 0x12
wait_irq = 0x10
elif cmd == 0x0C:
irq_en = 0x77
wait_irq = 0x30
self._wreg(0x02, irq_en | 0x80)
self._cflags(0x04, 0x80)
self._sflags(0x0A, 0x80)
self._wreg(0x01, 0x00)
for c i send:
self._wreg(0x09, c)
self._wreg(0x01, cmd)
hvis cmd == 0x0C:
self._sflags(0x0D, 0x80)
i = 2000
mens sant:
n = self._rreg(0x04)
jeg -= 1
hvis ~((i != 0) og ~(n & 0x01) og ~(n & wait_irq)):
bryte
self._cflags(0x0D, 0x80)
hvis jeg:
if (self._rreg(0x06) & 0x1B) == 0x00:
stat = selv.OK
if n & irq_en & 0x01:
stat = selv.NOTAGERR
elif cmd == 0x0C:
n = self._rreg(0x0A)
lbs = self._rreg(0x0C) & 0x07
hvis lbs != 0:
bits = (n – 1) * 8 + lbs
ellers:
biter = n * 8
hvis n == 0:
n = 1
elif n > 16:
n = 16
for _ i område(n):
recv.append(self._rreg(0x09))
ellers:
stat = selv.FEIL
returstat, recv, bits
def _crc(selv, data):
self._cflags(0x05, 0x04)
self._sflags(0x0A, 0x80)
for c i data:
self._wreg(0x09, c)
self._wreg(0x01, 0x03)
i = 0xFF
mens sant:
n = self._rreg(0x05)
jeg -= 1
hvis ikke ((i != 0) og ikke (n & 0x04)):
bryte
return [self._rreg(0x22), self._rreg(0x21)]
def init(selv):
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 (selv):
self._wreg(0x01, 0x0F)
def antenna_on(self, on=True):
hvis på og ~(self._rreg(0x14) & 0x03):
self._sflags(0x14, 0x03)
ellers:
self._cflags(0x14, 0x03)
def request (selv, modus):
self._wreg(0x0D, 0x07)
(stat, recv, bits) = self._tocard(0x0C, [modus])
if (stat != self.OK) | (bits != 0x10):
stat = selv.FEIL
returstat, biter
def anticoll(selv):
ser_chk = 0
ser = [0x93, 0x20]
self._wreg(0x0D, 0x00)
(stat, recv, bits) = self._tocard(0x0C, ser)
if stat == self.OK:
hvis len(recv) == 5:
for i innen rekkevidde (4):
ser_chk = ser_chk ^ recv[i]
if ser_chk != recv[4]:
stat = selv.FEIL
ellers:
stat = selv.FEIL
returstat, recv
def select_tag(selv, ser):
buf = [0x93, 0x70] + ser[:5]
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
returner self.OK if (stat == self.OK) og (bits == 0x18) else self.ERR
def auth(selv, modus, addr, sekt, ser):
return self._tocard(0x0E, [modus, addr] + sekt + ser[:4])[0]
def stop_crypto1(selv):
self._cflags(0x08, 0x08)
def read (selv, addr):
data = [0x30, adr]
data += self._crc(data)
(stat, recv, _) = self._tocard(0x0C, data)
return recv if stat == self.OK else Ingen
def write(selv, addr, data):
buf = [0xA0, addr]
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
hvis ikke (stat == self.OK) eller ikke (bits == 4) eller ikke ((recv[0] & 0x0F) == 0x0A):
stat = selv.FEIL
ellers:
buf = []
for i innen rekkevidde (16):
buf.append(data[i])
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
hvis ikke (stat == self.OK) eller ikke (bits == 4) eller ikke ((recv[0] & 0x0F) == 0x0A):
stat = selv.FEIL
returstatistikk
Kilde: Platon Data Intelligence