IOT

Intelligent tilgangskontroll basert på STONE TFT LCD og ESP32

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

Realisert funksjon

  1. kortregistrering.
  2. brukernavn og passord registrering.
  3. kortsveip for å låse opp den elektroniske låsen.
  4. 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.

Intelligent tilgangskontroll basert på STONE TFT LCD og ESP32 IOT PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.
Intelligent tilgangskontroll basert på STONE TFT LCD og ESP32

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.

Intelligent tilgangskontroll basert på STONE TFT LCD og ESP32 IOT PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.
Intelligent tilgangskontroll basert på STONE TFT LCD og ESP32

GUI-design

Intelligent tilgangskontroll basert på STONE TFT LCD og ESP32 IOT PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.
Intelligent tilgangskontroll basert på STONE TFT LCD og ESP32

Kodedeling

Intelligent tilgangskontroll basert på STONE TFT LCD og ESP32 IOT PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.
Intelligent tilgangskontroll basert på STONE TFT LCD og ESP32

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