IOT

Älykäs kulunvalvonta, joka perustuu STONE TFT LCD:hen ja ESP32:een

Lyhyt johdanto

Älykäs koti on yleistymässä tekniikan kehityksen myötä, tässä artikkelissa keskitytään älykkään kulunvalvontaprojektin turvallisuusnäkökohtiin.

Tämä artikkeli käyttää STONEn kosketusnäyttö lähettää komentoja MCU:lle releen ja MFRC522-moduulin ohjaamiseksi.

Kortin lukemisen periaate: RFID-RC522-moduulia ajamalla tunnistaa henkilökortin ID läheltä henkilökorttia ja sitten selvitä onko tunniste olemassa tietokannassa sanan tyypillinen, ID on sanan tyypillinen arvo, jos varmennus on olemassa , ja tulosta sitten vastaava nimi ja käytä sitten sähkömagneettista lukkoa samalla tavalla.

Vaadittavat materiaalit

Toteutunut toiminto

  1. kortin rekisteröinti.
  2. käyttäjätunnuksen ja salasanan rekisteröinti.
  3. korttia pyyhkäisemällä avataksesi elektronisen lukon.
  4. Käyttäjätunnus ja salasana elektronisen lukon avaamiseen.

Päälaitteiston kuvaus

RFID -moduuli

Tämä moduuli voidaan ladata suoraan useisiin lukijamoduuleihin. Se käyttää 3.3 V:n jännitettä SPI-liitännän kautta muutamalla johdolla. Suoraan CPU-emolevyyn yhdistetty moduuli voi toimia vakaasti ja luotettavasti etäisyyskortinlukijana.

Älykäs kulunvalvonta, joka perustuu STONE TFT LCD:hen ja ESP32 IOT PlatoBlockchain Data Intelligenceen. Pystysuuntainen haku. Ai.
Älykäs kulunvalvonta, joka perustuu STONE TFT LCD:hen ja ESP32:een

STWI070WT-01 on suunniteltu TFT-näytöksi ja kosketusohjaimeksi. Se sisältää prosessorin, ohjausohjelman, ohjaimen, flash-muistin, RS232/RS422/RS485/TTL/LAN-portin, Wi-Fi-/Bluetooth-, kosketusnäytön, virtalähteen jne., joten se on koko näyttöjärjestelmä, joka perustuu tehokkaaseen ja helppoon. käyttöjärjestelmä, jota voi ohjata millä tahansa MCU:lla.

Älykäs kulunvalvonta, joka perustuu STONE TFT LCD:hen ja ESP32 IOT PlatoBlockchain Data Intelligenceen. Pystysuuntainen haku. Ai.
Älykäs kulunvalvonta, joka perustuu STONE TFT LCD:hen ja ESP32:een

GUI-suunnittelu

Älykäs kulunvalvonta, joka perustuu STONE TFT LCD:hen ja ESP32 IOT PlatoBlockchain Data Intelligenceen. Pystysuuntainen haku. Ai.
Älykäs kulunvalvonta, joka perustuu STONE TFT LCD:hen ja ESP32:een

Koodin jakaminen

Älykäs kulunvalvonta, joka perustuu STONE TFT LCD:hen ja ESP32 IOT PlatoBlockchain Data Intelligenceen. Pystysuuntainen haku. Ai.
Älykäs kulunvalvonta, joka perustuu STONE TFT LCD:hen ja ESP32:een

tuonti mfrc522

tuontiaika

tuo _säie

os import unamesta

koneen tuonnista Pin, UART

#pyb-tuonti UART

#tuontikone

suos = Pin(32,Pin.OUT)

uart2 = UART(2, baudinopeus=115200, rx=16,tx=17,aikakatkaisu=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 = Epätosi

password_flag = Väärin

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 XNUMX]

edit2_cmd = [16,113 XNUMX]

edit3_cmd = [16,114 XNUMX]

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():

yrittää:

(stat, tag_type) = rdr.request(rdr.REQIDL)

if stat == rdr.OK:

(tilasto, raaka_uid) = rdr.anticoll()

if stat == rdr.OK:

tulosta ("Uusi kortti havaittu")

print(” – tunnisteen tyyppi: 0x%02x” % tag_type)

print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))

Tulosta("")

if rdr.select_tag(raw_uid) == rdr.OK:

avain = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

if rdr.auth(rdr.AUTHENT1A, 8, avain, 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:

tulosta ("kortille kirjoitetut tiedot")

else:

tulosta ("Tietojen kirjoittaminen kortille epäonnistui")

else:

tulosta ("Todennusvirhe")

else:

tulosta ("Tagin valinta epäonnistui")

paitsi KeyboardInrtrupt:

tulosta ("kirjoitusvirhe")

def do_read():

kun taas totta:

yrittää:

(stat, tag_type) = rdr.request(rdr.REQIDL)

if stat == rdr.OK:

(tilasto, raaka_uid) = rdr.anticoll()

if stat == rdr.OK:

tulosta ("Uusi kortti havaittu")

print(” – tunnisteen tyyppi: 0x%02x” % tag_type)

print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))

tulosta (raaka_uid[0], raaka_uid[1], raaka_uid[2], raaka_uid[3])

Tulosta("")

if rdr.select_tag(raw_uid) == rdr.OK:

avain = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

if rdr.auth(rdr.AUTHENT1A, 8, avain, raw_uid) == rdr.OK:

print("Osoitteen 8 tiedot: %s" % rdr.read(8))

ps:lle henkilöstötunnuksessa:

if raw_uid[0:4:1] == henkilöstötunnus.get(ps):

suos.value(1)

tulosta (ps)

uart_write(ps, *raw_uid[0:4:1])

time.sleep (3)

uart2.sendbreak()

rikkoa

rdr.stop_crypto1()

time.sleep (3)

suos.value(0)

else:

tulosta ("Todennusvirhe")

else:

tulosta ("Tagin valinta epäonnistui")

jos uart2.any()>1:

rx2 = []

data_name2 = "

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = lista(bin_data)

kohteelle rx1:ssä:

rx2.append(chr(tuote))

tulosta (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(datan_name)

tulosta(datan_nimi2)

if data_name2 == 'back3':

palata

paitsi KeyboardInrtrupt:

tulosta ("lukuvirhe")

def do_read2 (idd):

tulosta (idd)

kun taas totta:

yrittää:

(stat, tag_type) = rdr.request(rdr.REQIDL)

if stat == rdr.OK:

(tilasto, raaka_uid) = rdr.anticoll()

if stat == rdr.OK:

tulosta ("Uusi kortti havaittu")

print(” – tunnisteen tyyppi: 0x%02x” % tag_type)

print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))

tulosta (raaka_uid[0], raaka_uid[1], raaka_uid[2], raaka_uid[3])

Tulosta("")

if rdr.select_tag(raw_uid) == rdr.OK:

avain = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

if rdr.auth(rdr.AUTHENT1A, 8, avain, raw_uid) == rdr.OK:

print("Osoitteen 8 tiedot: %s" % rdr.read(8))

henkilöstötunnus[idd] = raw_uid[0:4:1]

uart_write3(*raw_uid[0:4:1])

rdr.stop_crypto1()

else:

tulosta ("Todennusvirhe")

else:

tulosta ("Tagin valinta epäonnistui")

jos uart2.any()>1:

rx2 = []

data_name2 = "

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = lista(bin_data)

kohteelle rx1:ssä:

rx2.append(chr(tuote))

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(datan_name)

tulosta(datan_nimi2)

if data_name2 == 'back1':

palata

paitsi KeyboardInrtrupt:

tulosta ("lukuvirhe")

def uart_write(text, *ids):

# print (teksti, *tunnukset)

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"kortinnimi1",teksti":"'+str(teksti)+'"}>ET' )

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid1",teksti":"'+str(ids)+'"}>ET' )

uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock1","näkyvä":true}>ET')

time.sleep (3)

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardname1",teksti":"""}>ET')

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid1",teksti":"""}>ET')

uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock1","näkyvä":false}>ET')

def uart_write2(teksti,teksti2):

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"'+teksti+'"}>ET')

time.sleep (3)

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"'+teksti2+'"}>ET')

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit2",teksti":"""}>ET')

def uart_write3(*id2):

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"'+str(id2)+'"}>ET' )

time.sleep (3)

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"""}>ET')

def uart_write4(teksti,teksti2):

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"kirjautuminen","teksti":"'+teksti+'"}>ET')

time.sleep (1)

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"kirjautuminen","teksti":"'+teksti2+'"}>ET')

time.sleep (1)

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit3",teksti":"""}>ET')

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit4",teksti":"""}>ET')

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit7",teksti":"""}>ET')

def uart_write5():

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"'+str(id2)+'"}>ET' )

time.sleep (3)

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","teksti":"""}>ET')

def card_zhuce():

kun taas totta:

jos uart2.any():

user_id = "

salasana = "

rx2 = []

rx_num = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = lista(bin_data)

kohteelle rx1:ssä:

rx2.append(chr(tuote))

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 == 'muokkaa1':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = .join(data_id_st3)

print(data_id_st4)

if data_id_st4 != ”:

nimi = Totta

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 = Totta

uart_write2('Vahvistus läpäissyt!','Aseta kortti!')

do_read2(data_id_st4)

palata

def mima_zuce():

temp_id3 = "

temp_mima3 = "

kun taas totta:

jos uart2.any():

user_id = "

salasana = "

rx2 = []

rx_num = 0

# data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = lista(bin_data)

kohteelle rx1:ssä:

rx2.append(chr(tuote))

rx_num += 1

# if (rx2[rx_num] == 'T') ja (rx2[rx_num-1] == 'E') ja (rx2[rx_num-2] == '>'):

# tauko

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(datan_name)

tulosta(datan_nimi2)

if data_name2 == 'back2':

palata

if data_id_st2 == 'muokkaa3':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = .join(data_id_st3)

print(data_id_st4)

user_id_flag = Tosi

temp_id3 = data_id_st4

# personal_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)

# if personnel_ps.get(temp_id) == data_id_st6:

password_flag = Totta

temp_mima3 = data_id_st6

# personnel_ps[temp_id] = salasana_lippu

# 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) ja (password_flag == True) ja (user_id_flag == True):

admin = Totta

henkilöstö_ps[temp_id3] = temp_mima3

password_flag = Väärin

user_id_flag = Epätosi

uart_write4('Vahvistus suoritettu!','kirjautuminen onnistui!')

def password_loin():

temp_id2 = "

temp_mima = "

kun taas totta:

jos uart2.any():

user_id = "

salasana = "

rx2 = []

rx_num = 0

# data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = lista(bin_data)

kohteelle rx1:ssä:

rx2.append(chr(tuote))

rx_num += 1

# if (rx2[rx_num] == 'T') ja (rx2[rx_num-1] == 'E') ja (rx2[rx_num-2] == '>'):

# tauko

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(datan_name)

tulosta(datan_nimi2)

if data_name2 == 'back4':

palata

if data_id_st2 == 'muokkaa5':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = .join(data_id_st3)

print(data_id_st4)

if data_id_st4 in personnel_ps:

user_id_flag = Tosi

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)

tulosta (temp_id2)

tulosta (personnel_ps)

if personnel_ps.get(temp_id2) == data_id_st6:

password_flag = Totta

# print(rx2,user_id_flag,password_flag)

tulosta(käyttäjätunnus_lippu,salasanalippu)

if (password_flag == True) ja (user_id_flag == True):

uart_write(temp_id2,temp_id2)

password_flag = Väärin

user_id_flag = Epätosi

suos.value(1)

uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock2","näkyvä":true}>ET')

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit5",teksti":"""}>ET')

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit6",teksti":"""}>ET')

time.sleep (3)

# uart_write('opiskelija',)

suos.value(0)

uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock2","näkyvä":false}>ET')

uart2.sendbreak()

kun taas totta:

jos uart2.any()>1:

rx2 = []

data_name2 = "

bin_data = uart2.read(40)

# aika.uni(1)

uart2.sendbreak()

# aika.uni(1)

rx1 = lista(bin_data)

kohteelle rx1:ssä:

rx2.append(chr(tuote))

tulosta (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(datan_name)

tulosta(datan_nimi2)

if data_name2 == 'kortti1':

card_zhuce()

elif data_name2 == 'salasana1':

mima_zuce()

elif data_name2 == 'kortti2':

do_read()

elif data_name2 == 'salasana2':

password_loin()

MFRC522.py

koneen tuonnista Pin, SPI

os import unamesta

luokka MFRC522:

OK = 0

NOTAGERR = 1

ERR = 2

REQIDL = 0x26

REQALL = 0x52

AUTHENT1A = 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(rst, Pin.OUT)

self.cs = Pin(cs, Pin.OUT)

itse.ensimmäinen.arvo(0)

self.cs.value(1)

board = uname()[0]

if board == 'WiPy' or board == 'LoPy' or 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, polarity=0, phase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)

self.spi.init()

else:

nosta RuntimeError ("Ei tuettu alusta")

itse.ensimmäinen.arvo(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(itse, 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)

paluuarvo[0]

def _sflags(self, reg, mask):

self._wreg(reg, self._rreg(reg) | mask)

def _cflags(self, reg, mask):

self._wreg(reg, self._rreg(reg) & (~mask))

def _tocard(itse, cmd, lähetä):

recv = []

bittiä = irq_en = odota_irq = n = 0

stat = itse.ERR

jos cmd == 0x0E:

irq_en = 0x12

odota_irq = 0x10

elif cmd == 0x0C:

irq_en = 0x77

odota_irq = 0x30

self._wreg(0x02, irq_en | 0x80)

self._cflags(0x04, 0x80)

self._s flags(0x0A, 0x80)

self._wreg(0x01, 0x00)

c in send:

self._wreg(0x09, c)

self._wreg(0x01, cmd)

jos cmd == 0x0C:

self._slags(0x0D, 0x80)

i = 2000

kun taas totta:

n = itse._rreg(0x04)

i - = 1

jos ~((i != 0) ja ~(n & 0x01) ja ~(n & odota_irq)):

rikkoa

self._cflags(0x0D, 0x80)

jos minä:

if (self._rreg(0x06) & 0x1B) == 0x00:

stat = itse.OK

jos n & irq_en & 0x01:

stat = self.NOTAGERR

elif cmd == 0x0C:

n = itse._rreg(0x0A)

lbits = self._rreg(0x0C) & 0x07

jos lbits != 0:

bittiä = (n – 1) * 8 + lbits

else:

bittiä = n * 8

jos n == 0:

n = 1

elif n > 16:

n = 16

kohteelle _ alueella(n):

recv.append(self._rreg(0x09))

else:

stat = itse.ERR

paluu stat, recv, bitit

def _crc(itse, data):

self._cflags(0x05, 0x04)

self._s flags(0x0A, 0x80)

c:lle tiedoissa:

self._wreg(0x09, c)

self._wreg(0x01, 0x03)

i = 0xFF

kun taas totta:

n = itse._rreg(0x05)

i - = 1

jos ei ((i != 0) ja ei (n & 0x04)):

rikkoa

return [self._rreg(0x22), self._rreg(0x21)]

def init(itse):

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 (itse):

self._wreg(0x01, 0x0F)

def antenna_on(self, on=True):

jos päällä ja ~(self._rreg(0x14) & 0x03):

self._s flags(0x14, 0x03)

else:

self._cflags(0x14, 0x03)

def-pyyntö (itse, tila):

self._wreg(0x0D, 0x07)

(stat, recv, bits) = self._tocard(0x0C, [mode])

if (tila != itse.OK) | (bittiä != 0x10):

stat = itse.ERR

paluutilasto, bittiä

def anticoll(itse):

ser_chk = 0

ser = [0x93, 0x20]

self._wreg(0x0D, 0x00)

(stat, recv, bits) = self._tocard(0x0C, ser)

if stat == self.OK:

jos len(recv) == 5:

i: lle alueella (4):

ser_chk = ser_chk ^ recv[i]

if ser_chk != recv[4]:

stat = itse.ERR

else:

stat = itse.ERR

paluutila, palautus

def select_tag(self, ser):

buf = [0x93, 0x70] + ser[:5]

buf += self._crc(buf)

(stat, recv, bits) = self._tocard(0x0C, buf)

palauta self.OK if (stat == self.OK) ja (bits == 0x18) else self.ERR

def auth(self, mode, addr, sect, ser):

return self._tocard(0x0E, [tila, addr] + sect + ser[:4])[0]

def stop_crypto1(self):

self._cflags(0x08, 0x08)

def read(itse, addr):

data = [0x30, osoite]

data += itse._crc(data)

(tilasto, palautus, _) = self._tocard(0x0C, data)

palauta palautus, jos stat == self.OK else Ei mitään

def write(self, addr, data):

buf = [0xA0, addr]

buf += self._crc(buf)

(stat, recv, bits) = self._tocard(0x0C, buf)

jos ei (stat == self.OK) tai ei (bittiä == 4) vai ei ((recv[0] & 0x0F) == 0x0A):

stat = itse.ERR

else:

buf = []

i: lle alueella (16):

buf.append(data[i])

buf += self._crc(buf)

(stat, recv, bits) = self._tocard(0x0C, buf)

jos ei (stat == self.OK) tai ei (bittiä == 4) vai ei ((recv[0] & 0x0F) == 0x0A):

stat = itse.ERR

palautustila

Lähde: Platon Data Intelligence