IOT

Intelligent passerkontroll baserad på STONE TFT LCD och ESP32

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

Realiserad funktion

  1. kortregistrering.
  2. användarnamn och lösenordsregistrering.
  3. dra kort för att låsa upp det elektroniska låset.
  4. 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.

Intelligent åtkomstkontroll baserad på STONE TFT LCD och ESP32 IOT PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.
Intelligent passerkontroll baserad på STONE TFT LCD och ESP32

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.

Intelligent åtkomstkontroll baserad på STONE TFT LCD och ESP32 IOT PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.
Intelligent passerkontroll baserad på STONE TFT LCD och ESP32

GUI design

Intelligent åtkomstkontroll baserad på STONE TFT LCD och ESP32 IOT PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.
Intelligent passerkontroll baserad på STONE TFT LCD och ESP32

Koddelning

Intelligent åtkomstkontroll baserad på STONE TFT LCD och ESP32 IOT PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.
Intelligent passerkontroll baserad på STONE TFT LCD och ESP32

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