Kratek uvod
Pametni dom z razvojem tehnologije postaja vse pogostejši, ta članek se bo osredotočil na varnostne vidike projekta inteligentnega nadzora dostopa.
Ta članek uporablja STONE zaslon na dotik za pošiljanje ukazov MCU za nadzor releja in modula MFRC522.
Načelo branja kartic: s pogonom modula RFID-RC522 identificirajte ID izkaznice blizu osebne izkaznice in nato ugotovite, ali ID obstaja v bazi podatkov besede tipično, ID je tipična vrednost besede, če obstoj preverjanja prek , nato pa natisnite ustrezno ime in nato na enak način zaženite elektromagnetno ključavnico.
Potrebni materiali
- ESP32
- Elektronska ključavnica KOB
- rele
- STONE STWI070WT-01 zaslon na dotik
- Modul MFRC522
Realizirana funkcija
- registracija kartice.
- registracija z uporabniškim imenom in geslom.
- povlecite kartico, da odklenete elektronsko ključavnico.
- Uporabniško ime in geslo za odklepanje elektronske ključavnice.
Opis glavne strojne opreme
RFID modul
Ta modul je mogoče neposredno naložiti v različne module bralnikov. Uporablja napetost 3.3 V, prek vmesnika SPI z le nekaj žicami. Neposredno povezan z matično ploščo CPU lahko modul deluje stabilno in zanesljivo kot bralnik kartic na daljavo.
STWI070WT-01 je bil zasnovan kot TFT monitor in krmilnik na dotik. Vključuje procesor, krmilni program, gonilnik, bliskovni pomnilnik, vrata RS232/RS422/RS485/TTL/LAN, Wi-Fi/Bluetooth, zaslon na dotik, napajalnik itd., tako da je celoten zaslonski sistem, ki temelji na zmogljivem in enostavnem operacijski sistem, ki ga lahko nadzira kateri koli MCU.
Oblikovanje GUI
Skupna raba kode
uvoz mfrc522
čas uvoza
uvozi _nit
iz OS import uname
iz stroja uvoz Pin, UART
#from pyb uvoz UART
#uvozni stroj
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 = []
ime_rx = []
user_id_flag = False
geslo_zastavica = False
temp_id = ”
temp_mima = ”
personal_id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}
personnel_ps = {‘zbw’:’zbw3366′,’lbw’:’lbwnb’}
skrbniško_geslo = ('yyds')
gumb_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():
poskusi:
(stat, tip_oznake) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
print(“Zaznana nova kartica”)
print(” – vrsta oznake: 0x%02x” % vrsta_oznake)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
natisni(“”)
if rdr.select_tag(raw_uid) == rdr.OK:
ključ = [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()
if stat == rdr.OK:
print(“Podatki, zapisani na kartico”)
drugo:
print(“Zapis podatkov na kartico ni uspel”)
drugo:
print(“Napaka pri preverjanju pristnosti”)
drugo:
natisni (»Izbira oznake ni uspela«)
razen KeyboardInterrupt:
natisni ("napaka pri pisanju")
def do_read():
medtem ko je resnično:
poskusi:
(stat, tip_oznake) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
print(“Zaznana nova kartica”)
print(” – vrsta oznake: 0x%02x” % vrsta_oznake)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
natisni (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
natisni(“”)
if rdr.select_tag(raw_uid) == rdr.OK:
ključ = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
print(“Podatki o naslovu 8: %s” % rdr.read(8))
za ps v personnel_id:
if raw_uid[0:4:1] == personnel_id.get(ps):
suos.value(1)
natisni (ps)
uart_write(ps, *raw_uid[0:4:1])
čas.spi (3)
uart2.sendbreak()
odmor
rdr.stop_crypto1()
čas.spi (3)
suos.value(0)
drugo:
print(“Napaka pri preverjanju pristnosti”)
drugo:
natisni (»Izbira oznake ni uspela«)
če uart2.any()>1:
rx2 = []
ime_podatka2 = ”
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = seznam (bin_podatki)
za element v rx1:
rx2.append(chr(element))
natisni (rx2)
if rx1[3:5:1] == button_cmd:
ime_podatka_len = rx1[6] – 1
ime_podatka = rx2[7:ime_podatka_len+7:1]
ime_podatka2 = ”.pridruži se(ime_podatka)
natisni (ime_podatkov2)
if data_name2 == ‘back3’:
vrnitev
razen KeyboardInterrupt:
natisni (“napaka branja”)
def do_read2 (idd):
natisni (idd)
medtem ko je resnično:
poskusi:
(stat, tip_oznake) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
print(“Zaznana nova kartica”)
print(” – vrsta oznake: 0x%02x” % vrsta_oznake)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
natisni (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
natisni(“”)
if rdr.select_tag(raw_uid) == rdr.OK:
ključ = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
print(“Podatki o naslovu 8: %s” % rdr.read(8))
personal_id[idd] = raw_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
drugo:
print(“Napaka pri preverjanju pristnosti”)
drugo:
natisni (»Izbira oznake ni uspela«)
če uart2.any()>1:
rx2 = []
ime_podatka2 = ”
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = seznam (bin_podatki)
za element v rx1:
rx2.append(chr(element))
if rx1[3:5:1] == button_cmd:
ime_podatka_len = rx1[6] – 1
ime_podatka = rx2[7:ime_podatka_len+7:1]
ime_podatka2 = ”.pridruži se(ime_podatka)
natisni (ime_podatkov2)
if data_name2 == ‘back1’:
vrnitev
razen KeyboardInterrupt:
natisni (“napaka branja”)
def uart_write(besedilo, *ids):
# print(text, *ids)
uart2.write('STET' )
uart2.write('STET' )
uart2.write(‘STET’)
čas.spi (3)
uart2.write(‘STET’)
uart2.write(‘STET’)
uart2.write(‘STET’)
def uart_write2(besedilo,besedilo2):
uart2.write(‘STET’)
čas.spi (3)
uart2.write(‘STET’)
uart2.write(‘STET’)
def uart_write3(*id2):
uart2.write('STET' )
čas.spi (3)
uart2.write(‘STET’)
def uart_write4(besedilo,besedilo2):
uart2.write(‘STET’)
čas.spi (1)
uart2.write(‘STET’)
čas.spi (1)
uart2.write(‘STET’)
uart2.write(‘STET’)
uart2.write(‘STET’)
def uart_write5():
uart2.write('STET' )
čas.spi (3)
uart2.write(‘STET’)
def card_zhuce():
medtem ko je resnično:
če uart2.any():
user_id = ”
geslo = ”
rx2 = []
rx_num = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = seznam (bin_podatki)
za element v rx1:
rx2.append(chr(element))
rx_num += 1
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
natisni (id_podatkov_st2)
if data_id_st2 == 'uredi1':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
natisni (id_podatkov_st4)
if data_id_st4 != ”:
ime = res
elif data_id_st2 == 'uredi2':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
if data_id_st6 == admin_password:
admin = res
uart_write2('Preverjanje opravljeno!','Prosimo, položite kartico!')
do_read2(data_id_st4)
vrnitev
def mima_zuce():
temp_id3 = ”
temp_mima3 = ”
medtem ko je resnično:
če uart2.any():
user_id = ”
geslo = ”
rx2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = seznam (bin_podatki)
za element v rx1:
rx2.append(chr(element))
rx_num += 1
# če (rx2[rx_num] == ‘T’) in (rx2[rx_num-1] == ‘E’) in (rx2[rx_num-2] == ‘>’):
# odmor
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
natisni (id_podatkov_st2)
if rx1[3:5:1] == button_cmd:
ime_podatka_len = rx1[6] – 1
ime_podatka = rx2[7:ime_podatka_len+7:1]
ime_podatka2 = ”.pridruži se(ime_podatka)
natisni (ime_podatkov2)
if data_name2 == ‘back2’:
vrnitev
if data_id_st2 == 'uredi3':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
natisni (id_podatkov_st4)
user_id_flag = True
temp_id3 = data_id_st4
# personnel_ps[temp_id] = raw_uid[0:4:1]
elif data_id_st2 == 'uredi4':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
natisni (id_podatkov_st6)
# če personnel_ps.get(temp_id) == data_id_st6:
password_flag = True
temp_mima3 = data_id_st6
# personal_ps[temp_id] = password_flag
# print(rx2,user_id_flag,password_flag)
elif data_id_st2 == 'uredi7':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
if (data_id_st6 == admin_password) in (password_flag == True) in (user_id_flag == True):
admin = res
personal_ps[temp_id3] = temp_mima3
geslo_zastavica = False
user_id_flag = False
uart_write4('Preverjanje opravljeno!','prijava je bila uspešna!')
def password_loin():
temp_id2 = ”
temp_mima = ”
medtem ko je resnično:
če uart2.any():
user_id = ”
geslo = ”
rx2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = seznam (bin_podatki)
za element v rx1:
rx2.append(chr(element))
rx_num += 1
# če (rx2[rx_num] == ‘T’) in (rx2[rx_num-1] == ‘E’) in (rx2[rx_num-2] == ‘>’):
# odmor
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
natisni (id_podatkov_st2)
if rx1[3:5:1] == button_cmd:
ime_podatka_len = rx1[6] – 1
ime_podatka = rx2[7:ime_podatka_len+7:1]
ime_podatka2 = ”.pridruži se(ime_podatka)
natisni (ime_podatkov2)
if data_name2 == ‘back4’:
vrnitev
if data_id_st2 == 'uredi5':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
natisni (id_podatkov_st4)
če data_id_st4 v personnel_ps:
user_id_flag = True
temp_id2 = data_id_st4
elif data_id_st2 == 'uredi6':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
natisni (id_podatkov_st6)
natisni (temp_id2)
natisni (personnel_ps)
if personnel_ps.get(temp_id2) == data_id_st6:
password_flag = True
# print(rx2,user_id_flag,password_flag)
print(user_id_flag,password_flag)
if (password_flag == True) in (user_id_flag == True):
uart_write(temp_id2,temp_id2)
geslo_zastavica = False
user_id_flag = False
suos.value(1)
uart2.write(‘STET’)
uart2.write(‘STET’)
uart2.write(‘STET’)
čas.spi (3)
# uart_write('študent',”)
suos.value(0)
uart2.write(‘STET’)
uart2.sendbreak()
medtem ko je resnično:
če uart2.any()>1:
rx2 = []
ime_podatka2 = ”
bin_data = uart2.read(40)
# time.sleep(1)
uart2.sendbreak()
# time.sleep(1)
rx1 = seznam (bin_podatki)
za element v rx1:
rx2.append(chr(element))
natisni (rx2)
if rx1[3:5:1] == button_cmd:
ime_podatka_len = rx1[6] – 1
ime_podatka = rx2[7:ime_podatka_len+7:1]
ime_podatka2 = ”.pridruži se(ime_podatka)
natisni (ime_podatkov2)
if data_name2 == 'card1':
card_zhuce()
elif data_name2 == 'geslo1':
mima_zuce()
elif data_name2 == 'card2':
do_read()
elif data_name2 == 'geslo2':
password_loin()
MFRC522.py
iz uvoza stroja Pin, SPI
iz OS import uname
razred MFRC522:
OK = 0
NOTAGERR = 1
ERR = 2
REQIDL = 0x26
REQALL = 0x52
AVTENT1A = 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(prvi, Pin.OUT)
self.cs = Pin(cs, Pin.OUT)
self.prva.vrednost(0)
self.cs.value(1)
tabla = uname()[0]
če je tabla == 'WiPy' ali tabla == 'LoPy' ali tabla == 'FiPy':
self.spi = SPI(0)
self.spi.init(SPI.MASTER, baudrate=1000000, pins=(self.sck, self.mosi, self.miso))
plošča elif == 'esp32':
self.spi = SPI(baudrate=100000, polarity=0,phase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
self.spi.init()
drugo:
dvig RuntimeError(“Nepodprta platforma”)
self.prva.vrednost(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(sam, 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)
povratna vrednost[0]
def _sflags(self, reg, mask):
self._wreg(reg, self._rreg(reg) | maska)
def _cflags(self, reg, mask):
self._wreg(reg, self._rreg(reg) & (~maska))
def _tocard(self, cmd, send):
recv = []
bits = irq_en = čakaj_irq = n = 0
stat = self.ERR
če je cmd == 0x0E:
irq_en = 0x12
čakaj_irq = 0x10
elif cmd == 0x0C:
irq_en = 0x77
čakaj_irq = 0x30
self._wreg(0x02, irq_en | 0x80)
self._cflags(0x04, 0x80)
self._sflags(0x0A, 0x80)
self._wreg(0x01, 0x00)
za c in pošlji:
self._wreg(0x09, c)
self._wreg(0x01, cmd)
če je cmd == 0x0C:
self._sflags(0x0D, 0x80)
i = 2000
medtem ko je resnično:
n = self._rreg(0x04)
i -= 1
if ~((i != 0) and ~(n & 0x01) and ~(n & wait_irq)):
odmor
self._cflags(0x0D, 0x80)
če jaz:
if (self._rreg(0x06) & 0x1B) == 0x00:
stat = jaz.OK
če je n & irq_en & 0x01:
stat = self.NOTAGERR
elif cmd == 0x0C:
n = self._rreg(0x0A)
lbits = self._rreg(0x0C) & 0x07
če je lbits != 0:
bitov = (n – 1) * 8 + lbitov
drugo:
bitov = n * 8
če je n == 0:
n = 1
elif n > 16:
n = 16
za _ v območju (n):
recv.append(self._rreg(0x09))
drugo:
stat = self.ERR
return stat, recv, bits
def _crc(sam, podatki):
self._cflags(0x05, 0x04)
self._sflags(0x0A, 0x80)
za c v podatkih:
self._wreg(0x09, c)
self._wreg(0x01, 0x03)
i = 0xFF
medtem ko je resnično:
n = self._rreg(0x05)
i -= 1
če ne ((i != 0) in ne (n & 0x04)):
odmor
vrni [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(self):
self._wreg(0x01, 0x0F)
def antenna_on(self, on=True):
če je vklopljen in ~(self._rreg(0x14) & 0x03):
self._sflags(0x14, 0x03)
drugo:
self._cflags(0x14, 0x03)
def zahteva (sam, način):
self._wreg(0x0D, 0x07)
(stat, recv, bits) = self._tocard(0x0C, [način])
if (stat != self.OK) | (biti != 0x10):
stat = self.ERR
vrni statistiko, bitov
def anticoll(self):
ser_chk = 0
ser = [0x93, 0x20]
self._wreg(0x0D, 0x00)
(stat, recv, bits) = self._tocard(0x0C, ser)
if stat == self.OK:
če je len(recv) == 5:
za i v območju (4):
ser_chk = ser_chk ^ recv[i]
if ser_chk != recv[4]:
stat = self.ERR
drugo:
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)
vrni self.OK if (stat == self.OK) in (bits == 0x18) else self.ERR
def auth(self, mode, addr, sect, ser):
vrni self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]
def stop_crypto1(self):
self._cflags(0x08, 0x08)
def branje (sam, naslov):
podatki = [0x30, naslov]
podatki += self._crc(podatki)
(stat, recv, _) = self._tocard(0x0C, podatki)
return recv if stat == self.OK else None
def write(self, addr, data):
buf = [0xA0, naslov]
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
če ne (stat == self.OK) ali ne (biti == 4) ali ne ((recv[0] & 0x0F) == 0x0A):
stat = self.ERR
drugo:
buf = []
za i v območju (16):
buf.append(podatki[i])
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
če ne (stat == self.OK) ali ne (biti == 4) ali ne ((recv[0] & 0x0F) == 0x0A):
stat = self.ERR
vrni stat
Vir: Plato Data Intelligence