Vai al contenuto
PLC Forum


Controllo di accesso intelligente basato su ESP32 e LCD


Anika Laughary

Messaggi consigliati

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 dell'accesso intelligente.
Questo articolo utilizza il touch screen di STONE per inviare comandi alla MCU per controllare il relè e il modulo MFRC522.
Il principio della lettura della carta: guidando il modulo RFID-RC522, identificare l'ID della carta d'identità vicino alla carta d'identità, e quindi determinare se l'ID esiste nel database della parola tipica, ID è il valore tipico della parola, se l'esistenza della verifica attraverso, e quindi stampare il nome corrispondente, e poi guidare la serratura elettromagnetica nello stesso modo.

 

Materiali richiesti

 

 

Funzione realizzata

 

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

 

Schema di connessione

 

connection.thumb.jpg.aa7a1adde6561830ee839ac75855a0c2.jpg

 

Progettazione GUI

 

74278861_GUIdesign.thumb.png.6baa1815ae3cc4541d85fd31c069ef55.png

 

codice

 

import mfrc522
import time
import _thread
from os import uname
from machine import Pin, UART
#from pyb import UART
#import machine

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():
	try:
		(stat, tag_type) = rdr.request(rdr.REQIDL)
		if stat == rdr.OK:
			(stat, raw_uid) = rdr.anticoll()
			if stat == rdr.OK:
				print("New card detected")
				print("  - tag type: 0x%02x" % tag_type)
				print("  - uid : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
				print("")
				if rdr.select_tag(raw_uid) == rdr.OK:
					key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
					if rdr.auth(rdr.AUTHENT1A, 8, key, 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 written to card")
						else:
							print("Failed to write data to card")
					else:
						print("Authentication error")
				else:
					print("Failed to select tag")

	except KeyboardInterrupt:
		print("write error")


def do_read():
	while True:
		try:
			(stat, tag_type) = rdr.request(rdr.REQIDL)

			if stat == rdr.OK:
				(stat, raw_uid) = rdr.anticoll()
				if stat == rdr.OK:
					print("New card detected")
					print("  - tag type: 0x%02x" % tag_type)
					print("  - uid   : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
					print (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
					print("")
					if rdr.select_tag(raw_uid) == rdr.OK: 
						key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
						if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
							print("Address 8 data: %s" % rdr.read(8))
							for ps in 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()
									break
							rdr.stop_crypto1()
							time.sleep(3)
							suos.value(0)
						else:
							print("Authentication error")
					else:
						print("Failed to select tag")
			if uart2.any()>1:
				rx2 = []
				data_name2 = ''
				bin_data = uart2.read(40)
				uart2.sendbreak()
				rx1 = list(bin_data)
				for item in 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':
						return
		except KeyboardInterrupt:
			print("read error")

def do_read2 (idd):
	print(idd)
	while True:
		try:
			(stat, tag_type) = rdr.request(rdr.REQIDL)

			if stat == rdr.OK:
				(stat, raw_uid) = rdr.anticoll()
				if stat == rdr.OK:
					print("New card detected")
					print("  - tag type: 0x%02x" % tag_type)
					print("  - uid   : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
					print (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
					print("")
					if rdr.select_tag(raw_uid) == rdr.OK: 
						key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
						if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
							print("Address 8 data: %s" % rdr.read(8))
							personnel_id[idd] = raw_uid[0:4:1]
							uart_write3(*raw_uid[0:4:1])
							rdr.stop_crypto1()
						else:
							print("Authentication error")
					else:
						print("Failed to select tag")
			if uart2.any()>1:
				rx2 = []
				data_name2 = ''
				bin_data = uart2.read(40)
				uart2.sendbreak()
				rx1 = list(bin_data)
				for item in 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':
					return

		except KeyboardInterrupt:
			print("read error")

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":"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(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():
	while True:
		if uart2.any():
			user_id = ''
			password = ''
			rx2 = []
			rx_num = 0
			bin_data = uart2.read(40)
			uart2.sendbreak()
			rx1 = list(bin_data)
			for item in 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 != '':
					name = True
			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 = True
					uart_write2('Verification passed!','Please place the card!')
					do_read2(data_id_st4)
					return

def mima_zuce():
	temp_id3 = ''
	temp_mima3 = ''
	while True:
		if uart2.any():
			user_id = ''
			password = ''
			rx2 = []
			rx_num = 0
#			data_end = 0
			bin_data = uart2.read(40)
			uart2.sendbreak()
			rx1 = list(bin_data)
			for item in rx1:
				rx2.append(chr(item))
				rx_num += 1
#				if (rx2[rx_num] == 'T') and (rx2[rx_num-1] == 'E') and (rx2[rx_num-2] == '>'):
#					break
			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':
					return
			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 = True
				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)
#				if personnel_ps.get(temp_id) == data_id_st6:
				password_flag = True
				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) and (password_flag == True) and (user_id_flag == True):
					admin = True
					personnel_ps[temp_id3] = temp_mima3
					password_flag = False
					user_id_flag = False
					uart_write4('Verification passed!','login was successful!')


def password_loin():
	temp_id2 = ''
	temp_mima = ''
	while True:
		if uart2.any():
			user_id = ''
			password = ''
			rx2 = []
			rx_num = 0
#			data_end = 0
			bin_data = uart2.read(40)
			uart2.sendbreak()
			rx1 = list(bin_data)
			for item in rx1:
				rx2.append(chr(item))
				rx_num += 1
#				if (rx2[rx_num] == 'T') and (rx2[rx_num-1] == 'E') and (rx2[rx_num-2] == '>'):
#					break
			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':
					return
			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 in personnel_ps:
					user_id_flag = True
					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(personnel_ps)
				if personnel_ps.get(temp_id2) == data_id_st6:
					password_flag = True

#			print(rx2,user_id_flag,password_flag)
					print(user_id_flag,password_flag)
					if (password_flag == True) and (user_id_flag == True):
						uart_write(temp_id2,temp_id2)
						password_flag = False
						user_id_flag = False
						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()

while True:
	if uart2.any()>1:
		rx2 = []
		data_name2 = ''
		bin_data = uart2.read(40)
#		time.sleep(1)
		uart2.sendbreak()
#		time.sleep(1)
		rx1 = list(bin_data)
		for item in 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 == 'card1':
				card_zhuce()
			elif data_name2 == 'password1':
				mima_zuce()
			elif data_name2 == 'card2':
				do_read()
			elif data_name2 == 'password2':
				password_loin()

 

video demo

 

 

 

Link al commento
Condividi su altri siti


Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...