IOT

Controllo accessi intelligente basato su STONE TFT LCD ed ESP32

Breve introduzione

La casa intelligente sta diventando sempre più comune con lo sviluppo della tecnologia, questo articolo si concentrerà sugli aspetti di sicurezza del progetto di controllo degli accessi intelligente.

Questo articolo usa Il touch screen di STONE per inviare comandi all'MCU per controllare il relè e il modulo MFRC522.

Il principio della lettura delle carte: guidando il modulo RFID-RC522, identificare l'ID della carta d'identità vicino alla carta d'identità, quindi determinare se l'ID esiste nel database della parola tipica, ID è il valore tipico della parola, se l'esistenza della verifica tramite , quindi stampare il nome corrispondente, quindi azionare la serratura elettromagnetica allo stesso modo.

Materiali richiesti

Funzione realizzata

  1. registrazione della carta.
  2. registrazione nome utente e password.
  3. scorrere la carta per sbloccare la serratura elettronica.
  4. Nome utente e password per sbloccare la serratura elettronica.

La descrizione dell'hardware principale

Modulo RFID

Questo modulo può essere caricato direttamente in vari moduli lettore. Utilizza una tensione di 3.3 V, tramite l'interfaccia SPI con pochi fili. Collegato direttamente a una scheda madre CPU, il modulo può funzionare in modo stabile e affidabile come lettore di schede a distanza.

Intelligent access control based on STONE TFT LCD and ESP32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Controllo accessi intelligente basato su STONE TFT LCD ed ESP32

Lo STWI070WT-01 è stato concepito come monitor TFT e controller Touch. Include processore, programma di controllo, driver, memoria flash, porta RS232/RS422/RS485/TTL/LAN, Wi-Fi/Bluetooth, touch screen, alimentatore ecc., quindi è un intero sistema di visualizzazione basato sul potente e facile sistema operativo, che può essere controllato da qualsiasi MCU.

Intelligent access control based on STONE TFT LCD and ESP32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Controllo accessi intelligente basato su STONE TFT LCD ed ESP32

Progettazione dell'interfaccia grafica

Intelligent access control based on STONE TFT LCD and ESP32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Controllo accessi intelligente basato su STONE TFT LCD ed ESP32

Condivisione codice

Intelligent access control based on STONE TFT LCD and ESP32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Controllo accessi intelligente basato su STONE TFT LCD ed ESP32

importa mfrc522

tempo di importazione

import_thread

da os import uname

da importazione macchina Pin, UART

#da pyb import UART

#import macchina

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 = []

nome_rx = []

user_id_flag = Falso

password_flag = Falso

temp_id = "

temp_mima = "

id_personale = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}

personal_ps = {'zbw':'zbw3366′,'lbw':'lbwnb'}

admin_password = ('yyds')

pulsante_cmd = [16,1]

modifica1_cmd = [16,112]

modifica2_cmd = [16,113]

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

provare:

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

se stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

se stat == rdr.OK:

print(“Rilevata nuova carta”)

print(” – tipo di tag: 0x%02x” % tag_type)

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

Stampa("")

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

chiave = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

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

se stat == rdr.OK:

print(“Dati scritti sulla carta”)

altro:

print(“Impossibile scrivere i dati sulla scheda”)

altro:

print(“Errore di autenticazione”)

altro:

print(“Impossibile selezionare il tag”)

tranne KeyboardInterrupt:

print("errore di scrittura")

def do_read():

mentre vero:

provare:

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

se stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

se stat == rdr.OK:

print(“Rilevata nuova carta”)

print(” – tipo di tag: 0x%02x” % tag_type)

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

stampa (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])

Stampa("")

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

chiave = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

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

print(“Dati indirizzo 8: %s” % rdr.read(8))

per ps in id_personale:

if raw_uid[0:4:1] == personal_id.get(ps):

suos.valore(1)

stampa (ps)

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

time.sleep (3)

uart2.sendbreak()

rompere

rdr.stop_crypto1()

time.sleep (3)

suos.valore(0)

altro:

print(“Errore di autenticazione”)

altro:

print(“Impossibile selezionare il tag”)

if uart2.any()>1:

rx2 = []

data_name2 = "

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = lista (bin_data)

per l'articolo in rx1:

rx2.append(chr(elemento))

stampa(rx2)

se rx1[3:5:1] == pulsante_cmd:

nome_dati_len = rx1[6] – 1

nome_dati = rx2[7:nome_dati_len+7:1]

data_name2 = .join(data_name)

stampa(data_name2)

if data_name2 == 'back3':

ritorno

tranne KeyboardInterrupt:

print("errore di lettura")

def do_read2 (idd):

stampa (idd)

mentre vero:

provare:

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

se stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

se stat == rdr.OK:

print(“Rilevata nuova carta”)

print(” – tipo di tag: 0x%02x” % tag_type)

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

stampa (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])

Stampa("")

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

chiave = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

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

print(“Dati indirizzo 8: %s” % rdr.read(8))

personal_id[idd] = raw_uid[0:4:1]

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

rdr.stop_crypto1()

altro:

print(“Errore di autenticazione”)

altro:

print(“Impossibile selezionare il tag”)

if uart2.any()>1:

rx2 = []

data_name2 = "

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = lista (bin_data)

per l'articolo in rx1:

rx2.append(chr(elemento))

se rx1[3:5:1] == pulsante_cmd:

nome_dati_len = rx1[6] – 1

nome_dati = rx2[7:nome_dati_len+7:1]

data_name2 = .join(data_name)

stampa(data_name2)

if data_name2 == 'back1':

ritorno

tranne KeyboardInterrupt:

print("errore di lettura")

def uart_write(testo, *id):

# print(testo, *id)

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(testo,testo2):

uart2.write('ST<{“codice_cmd”:”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(testo,testo2):

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

mentre vero:

se uart2.any():

id_utente = "

password = "

rx2 = []

numero_rx = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = lista (bin_data)

per l'articolo in rx1:

rx2.append(chr(elemento))

num_rx += 1

fine_dati = rx_num-5

id_dati_st = rx2[8:13:1]

data_id_st2 = .join(data_id_st)

stampa(data_id_st2)

if data_id_st2 == 'edit1':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = .join(data_id_st3)

stampa(data_id_st4)

se data_id_st4 != ”:

nome = Vero

elif data_id_st2 == 'modifica2':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = .join(data_id_st5)

se data_id_st6 == admin_password:

admin = Vero

uart_write2('Verifica superata!','Si prega di inserire la carta!')

do_read2(data_id_st4)

ritorno

def mima_zuce():

temp_id3 = "

temp_mima3 = ”

mentre vero:

se uart2.any():

id_utente = "

password = "

rx2 = []

numero_rx = 0

# data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = lista (bin_data)

per l'articolo in rx1:

rx2.append(chr(elemento))

num_rx += 1

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

# rottura

fine_dati = rx_num-5

id_dati_st = rx2[8:13:1]

data_id_st2 = .join(data_id_st)

stampa(data_id_st2)

se rx1[3:5:1] == pulsante_cmd:

nome_dati_len = rx1[6] – 1

nome_dati = rx2[7:nome_dati_len+7:1]

data_name2 = .join(data_name)

stampa(data_name2)

if data_name2 == 'back2':

ritorno

if data_id_st2 == 'edit3':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = .join(data_id_st3)

stampa(data_id_st4)

user_id_flag = Vero

temp_id3 = dati_id_st4

# personal_ps[temp_id] = raw_uid[0:4:1]

elif data_id_st2 == 'modifica4':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = .join(data_id_st5)

stampa(data_id_st6)

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

password_flag = Vero

temp_mima3 = data_id_st6

# personal_ps[temp_id] = password_flag

# print(rx2,user_id_flag,password_flag)

elif data_id_st2 == 'modifica7':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = .join(data_id_st5)

if (data_id_st6 == admin_password) e (password_flag == True) e (user_id_flag == True):

admin = Vero

personal_ps[temp_id3] = temp_mima3

password_flag = Falso

user_id_flag = Falso

uart_write4('Verifica superata!','accesso riuscito!')

def password_loin():

temp_id2 = "

temp_mima = "

mentre vero:

se uart2.any():

id_utente = "

password = "

rx2 = []

numero_rx = 0

# data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = lista (bin_data)

per l'articolo in rx1:

rx2.append(chr(elemento))

num_rx += 1

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

# rottura

fine_dati = rx_num-5

id_dati_st = rx2[8:13:1]

data_id_st2 = .join(data_id_st)

stampa(data_id_st2)

se rx1[3:5:1] == pulsante_cmd:

nome_dati_len = rx1[6] – 1

nome_dati = rx2[7:nome_dati_len+7:1]

data_name2 = .join(data_name)

stampa(data_name2)

if data_name2 == 'back4':

ritorno

if data_id_st2 == 'edit5':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = .join(data_id_st3)

stampa(data_id_st4)

se data_id_st4 in personal_ps:

user_id_flag = Vero

temp_id2 = dati_id_st4

elif data_id_st2 == 'modifica6':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = .join(data_id_st5)

stampa(data_id_st6)

stampa(temp_id2)

print(personal_ps)

if personal_ps.get(temp_id2) == data_id_st6:

password_flag = Vero

# print(rx2,user_id_flag,password_flag)

print(flag_id_utente,flag_password)

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

uart_write(id_temp2,id2_temp)

password_flag = Falso

user_id_flag = Falso

suos.valore(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('studente',”)

suos.valore(0)

uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock2″”,visible”:false}>ET')

uart2.sendbreak()

mentre vero:

if uart2.any()>1:

rx2 = []

data_name2 = "

bin_data = uart2.read(40)

# tempo.sonno(1)

uart2.sendbreak()

# tempo.sonno(1)

rx1 = lista (bin_data)

per l'articolo in rx1:

rx2.append(chr(elemento))

stampa(rx2)

se rx1[3:5:1] == pulsante_cmd:

nome_dati_len = rx1[6] – 1

nome_dati = rx2[7:nome_dati_len+7:1]

data_name2 = .join(data_name)

stampa(data_name2)

if data_name2 == 'carta1':

card_zuce()

elif data_name2 == 'password1':

mima_zuce()

elif data_name2 == 'carta2':

fai_leggere()

elif data_name2 == 'password2':

password_lombo()

MFRC522.py

dall'importazione della macchina Pin, SPI

da os import uname

classe MFRC522:

OK = 0

NOTAGER = 1

ERR = 2

REQIDL = 0x26

REQALL = 0x52

AUT.1A = 0x60

AUT.1B = 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(primo, Pin.OUT)

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

self.primo.valore(0)

self.cs.valore(1)

tavola = uname()[0]

if board == 'WiPy' o board == 'LoPy' o 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, polarità=0, fase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)

self.spi.init()

altro:

sollevare RuntimeError ("Piattaforma non supportata")

self.primo.valore(1)

self.init()

def _wreg(self, reg, val):

self.cs.valore(0)

self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e)))

self.spi.write(b'%c' % int(0xff & val))

self.cs.valore(1)

def _rreg(sé, reg):

self.cs.valore(0)

self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))

val = self.spi.read(1)

self.cs.valore(1)

ritorno val[0]

def _sflags(self, reg, maschera):

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

def _cflags(self, reg, maschera):

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

def _tocard(self, cmd, invia):

rev = []

bit = irq_en = wait_irq = n = 0

stat = self.ERR

se cmd == 0x0E:

irq_it = 0x12

wait_irq = 0x10

elif cmd == 0x0C:

irq_it = 0x77

wait_irq = 0x30

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

self._cflags(0x04, 0x80)

self._sflags(0x0A, 0x80)

self._wreg(0x01, 0x00)

per c in invio:

self._wreg(0x09, c)

self._wreg(0x01,cmd)

se cmd == 0x0C:

self._sflags(0x0D, 0x80)

i = 2000

mentre vero:

n = self._rreg(0x04)

io -= 1

if ~((i != 0) e ~(n & 0x01) e ~(n & wait_irq)):

rompere

self._cflags(0x0D, 0x80)

se io:

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

stat = auto.OK

se n & irq_en & 0x01:

stat = self.NOTAGERR

elif cmd == 0x0C:

n = self._rreg(0x0A)

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

se lbit != 0:

bit = (n – 1) * 8 + lbit

altro:

bit = n * 8

se n == 0:

n = 1

elif n > 16:

n = 16

per _ nell'intervallo (n):

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

altro:

stat = self.ERR

restituisce stat, recv, bit

def _crc(auto, dati):

self._cflags(0x05, 0x04)

self._sflags(0x0A, 0x80)

per c nei dati:

self._wreg(0x09, c)

self._wreg(0x01, 0x03)

io = 0xFF

mentre vero:

n = self._rreg(0x05)

io -= 1

if not ((i != 0) and not (n & 0x04)):

rompere

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

def init(self):

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

self._wreg(0x01, 0x0F)

def antenna_on(self, on=Vero):

se attivo e ~(self._rreg(0x14) & 0x03):

self._sflags(0x14, 0x03)

altro:

self._cflags(0x14, 0x03)

def richiesta (auto, modalità):

self._wreg(0x0D, 0x07)

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

if (stat != self.OK) | (bit != 0x10):

stat = self.ERR

statistica di ritorno, bit

def anticoll(self):

ser_chk = 0

ser = [0x93, 0x20]

self._wreg(0x0D, 0x00)

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

se stat == self.OK:

se len(recv) == 5:

per i nell'intervallo (4):

ser_chk = ser_chk ^ recv[i]

se ser_chk != recv[4]:

stat = self.ERR

altro:

stat = self.ERR

stat di ritorno, recv

def select_tag(self, ser):

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

buf += self._crc(buf)

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

restituisce self.OK if (stat == self.OK) e (bit == 0x18) else self.ERR

def auth(self, modalità, addr, sect, ser):

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

def stop_cripto1(self):

self._cflags(0x08, 0x08)

def leggi(self, indirizzo):

dati = [0x30, indirizzo]

dati += self._crc(dati)

(stat, recv, _) = self._tocard(0x0C, dati)

return recv if stat == self.OK else Nessuno

def write(self, addr, dati):

buf = [0xA0, indir]

buf += self._crc(buf)

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

se no (stat == self.OK) o no (bit == 4) o no ((recv[0] & 0x0F) == 0x0A):

stat = self.ERR

altro:

bu = []

per i nell'intervallo (16):

buf.append(dati[i])

buf += self._crc(buf)

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

se no (stat == self.OK) o no (bit == 4) o no ((recv[0] & 0x0F) == 0x0A):

stat = self.ERR

stato di ritorno

Fonte: Plato Data Intelligence