Kort introduktion
Smart home bliver mere og mere almindeligt med udviklingen af teknologi, denne artikel vil fokusere på sikkerhedsaspekterne af det intelligente adgangskontrolprojekt.
Denne artikel bruger STONEs touchskærm at sende kommandoer til MCU'en for at styre relæet og MFRC522-modulet.
Princippet om kortlæsning: ved at køre RFID-RC522-modulet, identificere ID-kort-id'et tæt på ID-kortet og derefter afgøre, om ID'et findes i databasen for ordet typisk, ID er den typiske værdi af ordet, hvis eksistensen af verifikationen gennem , og udskriv derefter det tilsvarende navn, og kør derefter den elektromagnetiske lås på samme måde.
Nødvendige materialer
- ESP32
- KOB elektronisk lås
- Relæ
- STONE STWI070WT-01 touch panel display
- MFRC522 modul
Realiseret funktion
- kortregistrering.
- brugernavn og adgangskode registrering.
- stryg kort for at låse den elektroniske lås op.
- Brugernavn og adgangskode til at låse den elektroniske lås op.
Den vigtigste hardwarebeskrivelse
RFID-modul
Dette modul kan indlæses direkte i forskellige læsermoduler. Den bruger en spænding på 3.3V gennem SPI-grænsefladen med blot et par ledninger. Direkte forbundet med et CPU-bundkort kan modulet fungere på en stabil og pålidelig måde som en afstandskortlæser.
STWI070WT-01 er blevet udtænkt som TFT-skærm & Touch-controller. Det inkluderer processor, kontrolprogram, driver, flashhukommelse, RS232/RS422/RS485/TTL/LAN-port, Wi-Fi/Bluetooth, touchskærm, strømforsyning etc., så det er et helt displaysystem baseret på det kraftfulde og nemme operativsystem, som kan styres af enhver MCU.
GUI design
Kodedeling
importer mfrc522
importtid
importer _tråd
fra os importer uname
fra maskinimport Pin, UART
#fra pyb import UART
#import maskine
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 = Falsk
password_flag = Falsk
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)
hvis stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
hvis stat == rdr.OK:
print ("Nyt kort fundet")
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("")
hvis rdr.select_tag(raw_uid) == rdr.OK:
tast = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
hvis rdr.auth(rdr.AUTHENT1A, 8, nøgle, 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()
hvis stat == rdr.OK:
print(“Data skrevet til kortet”)
andet:
print ("Kunnede ikke skrive data til kortet")
andet:
print ("godkendelsesfejl")
andet:
print ("Kunne ikke vælge tag")
undtagen KeyboardInterrupt:
print(“skrivefejl”)
def do_read():
mens det er sandt:
prøve:
(stat, tag_type) = rdr.request(rdr.REQIDL)
hvis stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
hvis stat == rdr.OK:
print ("Nyt kort fundet")
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])
Print("")
hvis rdr.select_tag(raw_uid) == rdr.OK:
tast = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
hvis rdr.auth(rdr.AUTHENT1A, 8, nøgle, raw_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()
bryde
rdr.stop_crypto1()
time.sleep (3)
suos.value(0)
andet:
print ("godkendelsesfejl")
andet:
print ("Kunne ikke vælge tag")
if uart2.any()>1:
rx2 = []
data_navn2 = ”
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_navn2)
if data_name2 == 'back3':
afkast
undtagen KeyboardInterrupt:
print ("læsefejl")
def do_read2 (idd):
print(idd)
mens det er sandt:
prøve:
(stat, tag_type) = rdr.request(rdr.REQIDL)
hvis stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
hvis stat == rdr.OK:
print ("Nyt kort fundet")
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])
Print("")
hvis rdr.select_tag(raw_uid) == rdr.OK:
tast = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
hvis rdr.auth(rdr.AUTHENT1A, 8, nøgle, raw_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()
andet:
print ("godkendelsesfejl")
andet:
print ("Kunne ikke vælge tag")
if uart2.any()>1:
rx2 = []
data_navn2 = ”
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_navn2)
if data_name2 == 'back1':
afkast
undtagen KeyboardInterrupt:
print ("læsefejl")
def uart_write(tekst, *ids):
# print(tekst, *id'er)
uart2.write('ST<{“cmd_code”:”set_text”,,”type”:”label”,,”widget”:”cardname1″,”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”:”cardname1″,”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')
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(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():
mens det er sandt:
if uart2.any():
bruger_id = ”
adgangskode = ”
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 = Sandt
elif data_id_st2 == 'edit2':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
hvis data_id_st6 == admin_adgangskode:
admin = Sandt
uart_write2('Bekræftelse bestået!','Placer venligst kortet!')
do_read2(data_id_st4)
afkast
def mima_zuce():
temp_id3 = ”
temp_mima3 = ”
mens det er sandt:
if uart2.any():
bruger_id = ”
adgangskode = ”
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] == 'E') og (rx2[rx_num-2] == '>'):
# pause
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_navn2)
if data_name2 == 'back2':
afkast
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 = Sand
temp_id3 = data_id_st4
# personnel_ps[temp_id] = rå_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 = Sand
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 = Sandt
personnel_ps[temp_id3] = temp_mima3
password_flag = Falsk
user_id_flag = Falsk
uart_write4('Bekræftelse bestået!','login lykkedes!')
def password_loin():
temp_id2 = ”
temp_mima = ”
mens det er sandt:
if uart2.any():
bruger_id = ”
adgangskode = ”
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] == 'E') og (rx2[rx_num-2] == '>'):
# pause
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_navn2)
if data_name2 == 'back4':
afkast
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 = Sand
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)
hvis personnel_ps.get(temp_id2) == data_id_st6:
password_flag = Sand
# print(rx2,user_id_flag,password_flag)
print (bruger_id_flag, adgangskode_flag)
if (password_flag == True) og (user_id_flag == True):
uart_write(temp_id2,temp_id2)
password_flag = Falsk
user_id_flag = Falsk
suos.value(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.value(0)
uart2.write('ST<{“cmd_code”:”set_visible”,,”type”:”widget”,,”widget”:”lock2″,”visible”:false}>ET')
uart2.sendbreak()
mens det er sandt:
if uart2.any()>1:
rx2 = []
data_navn2 = ”
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_navn2)
hvis data_name2 == 'kort1':
card_zhuce()
elif data_name2 == 'adgangskode1':
mima_zuce()
elif data_name2 == 'kort2':
do_read()
elif data_name2 == 'adgangskode2':
password_loin()
MFRC522.py
fra maskinimport Pin, SPI
fra os importer 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(første, Pin.OUT)
self.cs = Pin(cs, Pin.OUT)
self.rst.value(0)
self.cs.value(1)
board = unavn()[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()
andet:
raise RuntimeError(“Ikke-understøttet platform”)
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)
returværdi[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.FEJL
hvis cmd == 0x0E:
irq_da = 0x12
wait_irq = 0x10
elif cmd == 0x0C:
irq_da = 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 det er sandt:
n = self._rreg(0x04)
i -= 1
hvis ~((i != 0) og ~(n & 0x01) og ~(n & wait_irq)):
bryde
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:
bit = (n – 1) * 8 + lbs
andet:
bit = n * 8
hvis n == 0:
n = 1
elif n > 16:
n = 16
for _ i område(n):
recv.append(self._rreg(0x09))
andet:
stat = selv.FEJL
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 det er sandt:
n = self._rreg(0x05)
i -= 1
hvis ikke ((i != 0) og ikke (n & 0x04)):
bryde
returner [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 til og ~(self._rreg(0x14) & 0x03):
self._sflags(0x14, 0x03)
andet:
self._cflags(0x14, 0x03)
def request (selv, tilstand):
self._wreg(0x0D, 0x07)
(stat, recv, bits) = self._tocard(0x0C, [mode])
if (stat != self.OK) | (bits != 0x10):
stat = selv.FEJL
returstat, bits
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 i området(4):
ser_chk = ser_chk ^ recv[i]
if ser_chk != recv[4]:
stat = selv.FEJL
andet:
stat = selv.FEJL
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, tilstand, addr, sekt, ser):
return self._tocard(0x0E, [mode, 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 ej (bits == 4) eller ej ((recv[0] & 0x0F) == 0x0A):
stat = selv.FEJL
andet:
buf = []
for i i området(16):
buf.append(data[i])
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
hvis ikke (stat == self.OK) eller ej (bits == 4) eller ej ((recv[0] & 0x0F) == 0x0A):
stat = selv.FEJL
returstat
Kilde: Platon Data Intelligence