Korte introductie
Smart home komt steeds vaker voor met de ontwikkeling van technologie, dit artikel zal zich richten op de beveiligingsaspecten van het intelligente toegangscontroleproject.
Dit artikel gebruikt Het aanraakscherm van STONE om commando's naar de MCU te sturen om het relais en de MFRC522-module te besturen.
Het principe van kaartlezen: door de RFID-RC522-module te besturen, identificeert u de ID-kaart-ID dicht bij de ID-kaart en bepaalt u vervolgens of de ID bestaat in de database van het woord typisch, ID is de typische waarde van het woord, als het bestaan van de verificatie door , en druk vervolgens de bijbehorende naam af en bestuur vervolgens het elektromagnetische slot op dezelfde manier.
Benodigde materialen
- ESP32
- KOB elektronisch slot
- Relais
- STONE STWI070WT-01 aanraakscherm
- MFRC522-module
Gerealiseerde functie
- kaart registratie.
- gebruikersnaam en wachtwoord registratie.
- kaartveeg om het elektronische slot te ontgrendelen.
- Gebruikersnaam en wachtwoord om het elektronische slot te ontgrendelen.
De belangrijkste hardware Beschrijving:
RFID-module
Deze module kan direct in verschillende leesmodules worden geladen. Het maakt gebruik van een spanning van 3.3 V, via de SPI-interface met slechts een paar draden. Direct verbonden met een CPU-moederbord, kan de module op een stabiele en betrouwbare manier werken als kaartlezer op afstand.
De STWI070WT-01 is ontworpen als TFT-monitor & Touch-controller. Het omvat processor, besturingsprogramma, stuurprogramma, flash-geheugen, RS232/RS422/RS485/TTL/LAN-poort, Wi-Fi/Bluetooth, touchscreen, voeding enz., dus het is een heel weergavesysteem gebaseerd op de krachtige en gemakkelijke besturingssysteem, dat kan worden bestuurd door elke MCU.
GUI-ontwerp
Code delen
mfrc522 importeren
import tijd
importeer _thread
van os import uname
van machine-importpin, UART
#van pyb import UART
#importmachine
suos = Pin(32,Pin.UIT)
uart2 = UART(2, baudrate=115200, rx=16,tx=17,time-out=10)
ESP32_HSPI_CLOCK = 14
ESP32_HSPI_SLAVE_SELECT = 15
ESP32_HSPI_MISO = 12
ESP32_HSPI_MOSI = 13
ESP32_MFRC522_RST = 5
rx3 = []
rx_naam = []
user_id_flag = Onwaar
password_flag = Onwaar
tijdelijke_id = ”
temp_mima = ”
personeels-id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}
personeel_ps = {'zbw':'zbw3366′,'lbw':'lbwnb'}
admin_password = ('yyds')
knop_cmd = [16,1]
bewerken1_cmd = [16,112]
bewerken2_cmd = [16,113]
bewerken3_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():
Probeer het volgende:
(stat, tag_type) = rdr.verzoek(rdr.REQIDL)
als stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
als stat == rdr.OK:
print ("Nieuwe kaart gedetecteerd")
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]))
afdrukken("")
als rdr.select_tag(raw_uid) == rdr.OK:
toets = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, sleutel, 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()
als stat == rdr.OK:
print ("Gegevens geschreven naar kaart")
anders:
print ("Kan gegevens niet naar kaart schrijven")
anders:
print ("Verificatiefout")
anders:
print ("Kan tag niet selecteren")
behalve KeyboardInterrupt:
print(“schrijffout”)
def do_read():
terwijl waar:
Probeer het volgende:
(stat, tag_type) = rdr.verzoek(rdr.REQIDL)
als stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
als stat == rdr.OK:
print ("Nieuwe kaart gedetecteerd")
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]))
afdrukken (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
afdrukken("")
als rdr.select_tag(raw_uid) == rdr.OK:
toets = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, sleutel, raw_uid) == rdr.OK:
print(“Adres 8 data: %s” % rdr.read(8))
voor ps in person_id:
if raw_uid[0:4:1] == person_id.get(ps):
suos.waarde(1)
afdrukken (ps)
uart_write(ps, *raw_uid[0:4:1])
time.sleep (3)
uart2.sendbreak()
breken
rdr.stop_crypto1()
time.sleep (3)
suos.waarde(0)
anders:
print ("Verificatiefout")
anders:
print ("Kan tag niet selecteren")
als uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.lezen(40)
uart2.sendbreak()
rx1 = lijst (bin_data)
voor item in rx1:
rx2.append(chr(item))
afdrukken(rx2)
als 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(gegevens_naam2)
if data_name2 == 'back3':
terugkeer
behalve KeyboardInterrupt:
print(“leesfout”)
def do_read2 (idd):
afdrukken (idd)
terwijl waar:
Probeer het volgende:
(stat, tag_type) = rdr.verzoek(rdr.REQIDL)
als stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
als stat == rdr.OK:
print ("Nieuwe kaart gedetecteerd")
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]))
afdrukken (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
afdrukken("")
als rdr.select_tag(raw_uid) == rdr.OK:
toets = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, sleutel, raw_uid) == rdr.OK:
print(“Adres 8 data: %s” % rdr.read(8))
personeel_id[idd] = raw_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
anders:
print ("Verificatiefout")
anders:
print ("Kan tag niet selecteren")
als uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.lezen(40)
uart2.sendbreak()
rx1 = lijst (bin_data)
voor item in rx1:
rx2.append(chr(item))
als 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(gegevens_naam2)
if data_name2 == 'back1':
terugkeer
behalve KeyboardInterrupt:
print(“leesfout”)
def uart_write(tekst, *ids):
# print(tekst, *id's)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”kaartnaam1″,”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')
time.sleep (3)
uart2.write('ST<{“cmd_code”:”set_text”,,”type”:”label”,,”widget”:”kaartnaam1″,”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(tekst,tekst2):
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')
standaard 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(tekst,tekst2):
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”login”,”text”:”'+text+'”}>ET')
time.sleep (1)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”login”,”text”:”'+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():
terwijl waar:
als uart2.any():
gebruiker_id = ”
wachtwoord = ”
rx2 = []
rx_getal = 0
bin_data = uart2.lezen(40)
uart2.sendbreak()
rx1 = lijst (bin_data)
voor item in rx1:
rx2.append(chr(item))
rx_getal += 1
data_end = rx_getal-5
data_id_st = rx2[8:13:1]
data_id_st2 = .join(data_id_st)
print(data_id_st2)
if data_id_st2 == 'bewerken1':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = .join(data_id_st3)
print(data_id_st4)
als data_id_st4 != ”:
naam = True
elif data_id_st2 == 'bewerken2':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = .join(data_id_st5)
if data_id_st6 == admin_wachtwoord:
beheerder = waar
uart_write2('Verificatie geslaagd!','Plaats de kaart alstublieft!')
do_read2(data_id_st4)
terugkeer
def mima_zuce():
tijdelijke_id3 = ”
temp_mima3 = ”
terwijl waar:
als uart2.any():
gebruiker_id = ”
wachtwoord = ”
rx2 = []
rx_getal = 0
# data_end = 0
bin_data = uart2.lezen(40)
uart2.sendbreak()
rx1 = lijst (bin_data)
voor item in rx1:
rx2.append(chr(item))
rx_getal += 1
# if (rx2[rx_num] == 'T') en (rx2[rx_num-1] == 'E') en (rx2[rx_num-2] == '>'):
# pauze
data_end = rx_getal-5
data_id_st = rx2[8:13:1]
data_id_st2 = .join(data_id_st)
print(data_id_st2)
als 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(gegevens_naam2)
if data_name2 == 'back2':
terugkeer
if data_id_st2 == 'bewerken3':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = .join(data_id_st3)
print(data_id_st4)
user_id_flag = Waar
temp_id3 = data_id_st4
# staff_ps[temp_id] = raw_uid[0:4:1]
elif data_id_st2 == 'bewerken4':
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:
wachtwoord_vlag = Waar
temp_mima3 = data_id_st6
#personeel_ps[temp_id] = wachtwoord_vlag
# print(rx2,user_id_flag,password_flag)
elif data_id_st2 == 'bewerken7':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = .join(data_id_st5)
if (data_id_st6 == admin_password) en (password_flag == True) en (user_id_flag == True):
beheerder = waar
personeel_ps[temp_id3] = temp_mima3
password_flag = Onwaar
user_id_flag = Onwaar
uart_write4('Verificatie geslaagd!','aanmelding is gelukt!')
def wachtwoord_loin():
tijdelijke_id2 = ”
temp_mima = ”
terwijl waar:
als uart2.any():
gebruiker_id = ”
wachtwoord = ”
rx2 = []
rx_getal = 0
# data_end = 0
bin_data = uart2.lezen(40)
uart2.sendbreak()
rx1 = lijst (bin_data)
voor item in rx1:
rx2.append(chr(item))
rx_getal += 1
# if (rx2[rx_num] == 'T') en (rx2[rx_num-1] == 'E') en (rx2[rx_num-2] == '>'):
# pauze
data_end = rx_getal-5
data_id_st = rx2[8:13:1]
data_id_st2 = .join(data_id_st)
print(data_id_st2)
als 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(gegevens_naam2)
if data_name2 == 'back4':
terugkeer
if data_id_st2 == 'bewerken5':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = .join(data_id_st3)
print(data_id_st4)
if data_id_st4 in person_ps:
user_id_flag = Waar
temp_id2 = data_id_st4
elif data_id_st2 == 'bewerken6':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = .join(data_id_st5)
print(data_id_st6)
afdrukken(temp_id2)
print(personeel_ps)
if person_ps.get(temp_id2) == data_id_st6:
wachtwoord_vlag = Waar
# print(rx2,user_id_flag,password_flag)
print(gebruikersnaam_vlag,wachtwoord_vlag)
if (password_flag == True) en (user_id_flag == True):
uart_write(temp_id2,temp_id2)
password_flag = Onwaar
user_id_flag = Onwaar
suos.waarde(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')
time.sleep (3)
# uart_write('student','")
suos.waarde(0)
uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock2″,”visible”:false}>ET')
uart2.sendbreak()
terwijl waar:
als uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.lezen(40)
# tijd.slaap(1)
uart2.sendbreak()
# tijd.slaap(1)
rx1 = lijst (bin_data)
voor item in rx1:
rx2.append(chr(item))
afdrukken(rx2)
als 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(gegevens_naam2)
if data_name2 == 'kaart1':
card_zhuce()
elif data_name2 == 'wachtwoord1':
mima_zuce()
elif data_name2 == 'kaart2':
doen_lezen()
elif data_name2 == 'wachtwoord2':
wachtwoord_loin()
MFRC522.py
van machine-import Pin, SPI
van os import uname
klasse MFRC522:
Oké = 0
NOTAGERR = 1
ERR = 2
REQIDL = 0x26
AANVRAAG = 0x52
AUTHENT1A = 0x60
AUTHENT1B = 0x61
def __init__(zelf, sck, mosi, miso, eerste, cs):
zelf.sck = Pin(sck, Pin.OUT)
zelf.mosi = Pin(mosi, Pin.OUT)
zelf.miso = Pin(miso)
zelf.rst = Pin(rst, Pin.OUT)
zelf.cs = Pin(cs, Pin.OUT)
zelf.eerste.waarde(0)
zelf.cs.waarde(1)
bord = uname()[0]
if board == 'WiPy' of board == 'LoPy' of board == 'FiPy':
zelf.spi = SPI(0)
self.spi.init(SPI.MASTER, baudrate=1000000, pins=(self.sck, self.mosi, self.miso))
elif bord == 'esp32':
self.spi = SPI(baudrate=100000, polariteit=0, fase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
zelf.spi.init()
anders:
raise RuntimeError ("Niet-ondersteund platform")
zelf.eerste.waarde(1)
zelf.init()
def _wreg(zelf, reg, val):
zelf.cs.waarde(0)
self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e)))
self.spi.write(b'%c' % int(0xff & val))
zelf.cs.waarde(1)
def _rreg(zelf, reg):
zelf.cs.waarde(0)
self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))
val = zelf.spi.lezen(1)
zelf.cs.waarde(1)
retourwaarde[0]
def _sflags(zelf, reg, masker):
zelf._wreg(reg, zelf._rreg(reg) | masker)
def _cflags(zelf, reg, masker):
zelf._wreg(reg, zelf._rreg(reg) & (~mask))
def _tocard(zelf, cmd, verzenden):
recv = []
bits = irq_en = wacht_irq = n = 0
stat = zelf.ERR
als cmd == 0x0E:
irq_nl = 0x12
wacht_irq = 0x10
elif cmd == 0x0C:
irq_nl = 0x77
wacht_irq = 0x30
zelf._wreg(0x02, irq_nl | 0x80)
zelf._cflags(0x04, 0x80)
zelf._sflags(0x0A, 0x80)
zelf._wreg(0x01, 0x00)
voor c in stuur:
zelf._wreg(0x09, c)
zelf._wreg(0x01, cmd)
als cmd == 0x0C:
zelf._sflags(0x0D, 0x80)
i = 2000
terwijl waar:
n = zelf._rreg(0x04)
ik -= 1
if ~((i != 0) and ~(n & 0x01) and ~(n & wait_irq)):
breken
zelf._cflags(0x0D, 0x80)
als ik:
if (self._rreg(0x06) & 0x1B) == 0x00:
stat = zelf.OK
indien n & irq_en & 0x01:
stat = zelf.NOTAGERR
elif cmd == 0x0C:
n = zelf._rreg(0x0A)
lbits = zelf._rreg(0x0C) & 0x07
als lbits != 0:
bits = (n – 1) * 8 + lbits
anders:
bits = n * 8
als n == 0:
n = 1
elif n > 16:
n = 16
voor _ in bereik (n):
recv.toevoegen(self._rreg(0x09))
anders:
stat = zelf.ERR
retourneer stat, recv, bits
def _crc(zelf, gegevens):
zelf._cflags(0x05, 0x04)
zelf._sflags(0x0A, 0x80)
voor c in gegevens:
zelf._wreg(0x09, c)
zelf._wreg(0x01, 0x03)
ik = 0xFF
terwijl waar:
n = zelf._rreg(0x05)
ik -= 1
zo niet ((i != 0) en niet (n & 0x04)):
breken
return [self._rreg(0x22), zelf._rreg(0x21)]
definieer (zelf):
zelf.reset()
zelf._wreg(0x2A, 0x8D)
zelf._wreg(0x2B, 0x3E)
zelf._wreg(0x2D, 30)
zelf._wreg(0x2C, 0)
zelf._wreg(0x15, 0x40)
zelf._wreg(0x11, 0x3D)
zelf.antenne_on()
def reset(zelf):
zelf._wreg(0x01, 0x0F)
def antenne_on(zelf, aan=True):
indien aan en ~(self._rreg(0x14) & 0x03):
zelf._sflags(0x14, 0x03)
anders:
zelf._cflags(0x14, 0x03)
def verzoek (zelf, modus):
zelf._wreg(0x0D, 0x07)
(stat, recv, bits) = self._tocard(0x0C, [modus])
if (stat != zelf.OK) | (bits != 0x10):
stat = zelf.ERR
retour stat, bits
def anticoll(zelf):
ser_chk = 0
ser = [0x93, 0x20]
zelf._wreg(0x0D, 0x00)
(stat, recv, bits) = self._tocard(0x0C, ser)
if stat == zelf.OK:
als len(recv) == 5:
voor i in bereik (4):
ser_chk = ser_chk ^ recv[i]
als ser_chk != recv[4]:
stat = zelf.ERR
anders:
stat = zelf.ERR
retour stat, recv
def select_tag(zelf, ser):
buf = [0x93, 0x70] + ser[:5]
buf += zelf._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
return self.OK if (stat == self.OK) en (bits == 0x18) else self.ERR
def auth(zelf, modus, addr, sekte, ser):
return self._tocard(0x0E, [mode, addr] + sekte + ser[:4])[0]
def stop_crypto1(zelf):
zelf._cflags(0x08, 0x08)
def lezen(zelf, adres):
gegevens = [0x30, adres]
data += zelf._crc(data)
(stat, recv, _) = zelf._tocard(0x0C, data)
return recv if stat == self.OK else Geen
def schrijven (zelf, adres, gegevens):
buf = [0xA0, adres]
buf += zelf._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
zo niet (stat == self.OK) of niet (bits == 4) of niet ((recv[0] & 0x0F) == 0x0A):
stat = zelf.ERR
anders:
buf = []
voor i in bereik (16):
buf.toevoegen(gegevens[i])
buf += zelf._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
zo niet (stat == self.OK) of niet (bits == 4) of niet ((recv[0] & 0x0F) == 0x0A):
stat = zelf.ERR
retour stat
Bron: Plato Data Intelligence