Kort introduktion
Smarta hem blir mer och mer vanligt med utvecklingen av teknik, den här artikeln kommer att fokusera på säkerhetsaspekterna av det intelligenta passerkontrollprojektet.
Denna artikel använder STONEs pekskärm för att skicka kommandon till MCU:n för att styra reläet och MFRC522-modulen.
Principen för kortläsning: genom att köra RFID-RC522-modulen, identifiera ID-korts-ID nära ID-kortet och sedan avgöra om ID:t finns i databasen för ordet typisk, ID är det typiska värdet av ordet, om förekomsten av verifiering genom , och skriv sedan ut motsvarande namn och kör sedan det elektromagnetiska låset på samma sätt.
Nödvändigt material
- ESP32
- KOB elektroniskt lås
- Relä
- STONE STWI070WT-01 pekskärmsdisplay
- MFRC522-modul
Realiserad funktion
- kortregistrering.
- användarnamn och lösenordsregistrering.
- dra kort för att låsa upp det elektroniska låset.
- Användarnamn och lösenord för att låsa upp det elektroniska låset.
Den huvudsakliga hårdvarubeskrivningen
RFID-modul
Denna modul kan laddas direkt i olika läsarmoduler. Den använder en spänning på 3.3V, genom SPI-gränssnittet med bara några ledningar. Direkt ansluten till ett CPU-moderkort kan modulen fungera på ett stabilt och tillförlitligt sätt som en distanskortläsare.
STWI070WT-01 har utformats som TFT-monitor och pekkontroll. Den innehåller processor, kontrollprogram, drivrutin, flashminne, RS232/RS422/RS485/TTL/LAN-port, Wi-Fi/Bluetooth, pekskärm, strömförsörjning etc., så det är ett helt displaysystem baserat på det kraftfulla och enkla operativsystem, som kan styras av valfri MCU.
GUI design
Koddelning
importera mfrc522
importtid
importera _tråd
från os import uname
från maskinimport Pin, UART
#från pyb import UART
#importmaskin
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 = Falskt
password_flag = Falskt
temp_id = ”
temp_mima = ”
personal_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():
prova:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
print(”Nytt kort upptäckt”)
print(” – taggtyp: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
skriva ut("")
om rdr.select_tag(raw_uid) == rdr.OK:
nyckel = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
om rdr.auth(rdr.AUTHENT1A, 8, nyckel, 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(“Data skrivna till kort”)
annan:
print(”Det gick inte att skriva data till kortet”)
annan:
print ("Autentiseringsfel")
annan:
print(”Det gick inte att välja tagg”)
utom KeyboardInterrupt:
print(“skrivfel”)
def do_read():
medan sant:
prova:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
print(”Nytt kort upptäckt”)
print(” – taggtyp: 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])
skriva ut("")
om rdr.select_tag(raw_uid) == rdr.OK:
nyckel = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
om rdr.auth(rdr.AUTHENT1A, 8, nyckel, raw_uid) == rdr.OK:
print(“Adress 8 data: %s” % rdr.read(8))
för ps i personal_id:
if raw_uid[0:4:1] == personal_id.get(ps):
suos.value(1)
print (ps)
uart_write(ps, *raw_uid[0:4:1])
time.sleep (3)
uart2.sendbreak()
bryta
rdr.stop_crypto1()
time.sleep (3)
suos.value(0)
annan:
print ("Autentiseringsfel")
annan:
print(”Det gick inte att välja tagg”)
if uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = list(bin_data)
för objekt i rx1:
rx2.append(chr(artikel))
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':
avkastning
utom KeyboardInterrupt:
print ("läsfel")
def do_read2 (idd):
print(idd)
medan sant:
prova:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
print(”Nytt kort upptäckt”)
print(” – taggtyp: 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])
skriva ut("")
om rdr.select_tag(raw_uid) == rdr.OK:
nyckel = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
om rdr.auth(rdr.AUTHENT1A, 8, nyckel, raw_uid) == rdr.OK:
print(“Adress 8 data: %s” % rdr.read(8))
personal_id[idd] = rå_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
annan:
print ("Autentiseringsfel")
annan:
print(”Det gick inte att välja tagg”)
if uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = list(bin_data)
för objekt i rx1:
rx2.append(chr(artikel))
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':
avkastning
utom KeyboardInterrupt:
print ("läsfel")
def uart_write(text, *ids):
# print(text, *ids)
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”:”etikett”,,”widget”:”kortnamn1″,”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(text,text2):
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(text,text2):
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():
medan sant:
if uart2.any():
user_id = ”
lösenord = ”
rx2 = []
rx_num = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = list(bin_data)
för objekt i rx1:
rx2.append(chr(artikel))
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 != ”:
namn = Sant
elif data_id_st2 == 'edit2':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
om data_id_st6 == admin_lösenord:
admin = Sant
uart_write2('Verifiering godkänd!','Placera kortet!')
do_read2(data_id_st4)
avkastning
def mima_zuce():
temp_id3 = ”
temp_mima3 = ”
medan sant:
if uart2.any():
user_id = ”
lösenord = ”
rx2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = list(bin_data)
för objekt i rx1:
rx2.append(chr(artikel))
rx_num += 1
# if (rx2[rx_num] == 'T') och (rx2[rx_num-1] == 'E') och (rx2[rx_num-2] == '>'):
# ha sönder
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':
avkastning
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
# personal_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 = Sant
temp_mima3 = data_id_st6
# personal_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) och (password_flag == True) och (user_id_flag == True):
admin = Sant
personal_ps[temp_id3] = temp_mima3
password_flag = Falskt
user_id_flag = Falskt
uart_write4('Verifiering klar!','inloggningen lyckades!')
def password_loin():
temp_id2 = ”
temp_mima = ”
medan sant:
if uart2.any():
user_id = ”
lösenord = ”
rx2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = list(bin_data)
för objekt i rx1:
rx2.append(chr(artikel))
rx_num += 1
# if (rx2[rx_num] == 'T') och (rx2[rx_num-1] == 'E') och (rx2[rx_num-2] == '>'):
# ha sönder
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':
avkastning
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 personal_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(personal_ps)
om 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 (lösenordsflagga == True) och (user_id_flag == True):
uart_write(temp_id2,temp_id2)
password_flag = Falskt
user_id_flag = Falskt
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()
medan sant:
if uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
# tid.sömn(1)
uart2.sendbreak()
# tid.sömn(1)
rx1 = list(bin_data)
för objekt i rx1:
rx2.append(chr(artikel))
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)
om data_name2 == 'kort1':
card_zhuce()
elif data_name2 == 'lösenord1':
mima_zuce()
elif data_name2 == 'kort2':
do_read()
elif data_name2 == 'lösenord2':
password_loin()
MFRC522.py
från maskinimport Pin, SPI
från os import uname
klass MFRC522:
OK = 0
NOTAGERR = 1
ERR = 2
REQIDL = 0x26
REKALL = 0x52
AUTHENT1A = 0x60
AUTHENT1B = 0x61
def __init__(själv, sck, mosi, miso, rst, cs):
self.sck = Pin(sck, Pin.OUT)
self.mosi = Pin(mosi, Pin.OUT)
self.miso = Pin(miso)
self.rst = Pin(första, Pin.OUT)
self.cs = Pin(cs, Pin.OUT)
self.rst.value(0)
self.cs.value(1)
board = uname()[0]
om 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, phase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
self.spi.init()
annan:
raise RuntimeError ("plattform som inte stöds")
self.rst.value(1)
self.init()
def _wreg(själv, 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(själv, 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ärde[0]
def _sflags(själv, reg, mask):
self._wreg(reg, self._rreg(reg) | mask)
def _cflags(själv, reg, mask):
self._wreg(reg, self._rreg(reg) & (~mask))
def _tocard(själv, cmd, skicka):
recv = []
bitar = irq_en = wait_irq = n = 0
stat = själv.FEL
om 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)
för c i skicka:
self._wreg(0x09, c)
self._wreg(0x01, cmd)
om cmd == 0x0C:
self._sflags(0x0D, 0x80)
i = 2000
medan sant:
n = self._rreg(0x04)
i -= 1
om ~((i != 0) och ~(n & 0x01) och ~(n & wait_irq)):
bryta
self._cflags(0x0D, 0x80)
om jag:
if (self._rreg(0x06) & 0x1B) == 0x00:
stat = själv.OK
if n & irq_en & 0x01:
stat = själv.NOTAGERR
elif cmd == 0x0C:
n = self._rreg(0x0A)
lbs = self._rreg(0x0C) & 0x07
om lbs != 0:
bitar = (n – 1) * 8 + lbs
annan:
bitar = n * 8
om n == 0:
n = 1
elif n > 16:
n = 16
för _ inom intervall(n):
recv.append(self._rreg(0x09))
annan:
stat = själv.FEL
returstat, recv, bitar
def _crc(själv, data):
self._cflags(0x05, 0x04)
self._sflags(0x0A, 0x80)
för c i data:
self._wreg(0x09, c)
self._wreg(0x01, 0x03)
i = 0xFF
medan sant:
n = self._rreg(0x05)
i -= 1
om inte ((i != 0) och inte (n & 0x04)):
bryta
returnera [self._rreg(0x22), self._rreg(0x21)]
def init(själv):
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):
om på och ~(self._rreg(0x14) & 0x03):
self._sflags(0x14, 0x03)
annan:
self._cflags(0x14, 0x03)
def request (själv, läge):
self._wreg(0x0D, 0x07)
(stat, recv, bitar) = self._tocard(0x0C, [mode])
if (stat != själv.OK) | (bitar != 0x10):
stat = själv.FEL
returstat, bitar
def anticoll(själv):
ser_chk = 0
ser = [0x93, 0x20]
self._wreg(0x0D, 0x00)
(stat, recv, bitar) = self._tocard(0x0C, ser)
if stat == self.OK:
om len(recv) == 5:
för i inom intervallet (4):
ser_chk = ser_chk ^ recv[i]
if ser_chk != recv[4]:
stat = själv.FEL
annan:
stat = själv.FEL
returstat, recv
def select_tag(self, ser):
buf = [0x93, 0x70] + ser[:5]
buf += self._crc(buf)
(stat, recv, bitar) = self._tocard(0x0C, buf)
returnera self.OK if (stat == self.OK) och (bitar == 0x18) else self.ERR
def auth(self, mode, addr, sect, ser):
return self._tocard(0x0E, [mode, addr] + sekt + ser[:4])[0]
def stop_crypto1(self):
self._cflags(0x08, 0x08)
def read(self, addr):
data = [0x30, adress]
data += self._crc(data)
(stat, recv, _) = self._tocard(0x0C, data)
return recv if stat == self.OK annars Ingen
def write(self, addr, data):
buf = [0xA0, addr]
buf += self._crc(buf)
(stat, recv, bitar) = self._tocard(0x0C, buf)
om inte (stat == själv.OK) eller inte (bitar == 4) eller inte ((recv[0] & 0x0F) == 0x0A):
stat = själv.FEL
annan:
buff = []
för i inom intervallet (16):
buf.append(data[i])
buf += self._crc(buf)
(stat, recv, bitar) = self._tocard(0x0C, buf)
om inte (stat == själv.OK) eller inte (bitar == 4) eller inte ((recv[0] & 0x0F) == 0x0A):
stat = själv.FEL
returstat
Källa: Plato Data Intelligence