Jump to content
    

Используйте ESP32 и электромагнитный замок KOB для создания системы контроля доступа

Используя электромагнитные замки, RFID-считыватели, микроконтроллеры ESP32 и сенсорные экраны, мы разработали систему контроля доступа, которую можно разблокировать, проведя по карте и введя пароль.

Тогда мне нужно многое узнать о радиочастотах.

Если все пойдет хорошо, возможно, он сможет добиться большего.

 

1.png

Share this post


Link to post
Share on other sites

Я уже закончил его. Я обновлю его.

Краткое введение

Умный дом становится все более распространенным с развитием технологий, эта статья будет посвящена аспектам безопасности проекта интеллектуального контроля доступа.
В этой статье используется сенсорный экран STONE для отправки команд на MCU для управления реле и модулем MFRC522.
Принцип считывания карт: путем управления RFID-RC522 модуль, определить ID карты ID близко к ID карты, а затем определить, существует ли ID в базе данных слово типичный, ID является типичным значением слова, если существование проверки через, а затем распечатать соответствующее имя, а затем привести в действие электромагнитный замок таким же образом.

Необходимые материалы

  • ESP32
  • Электронный замок KOB
  • Реле
  • Сенсорный дисплей STONE STWI070WT-01
  • Модуль MFRC522

Реализованная функция

1. регистрация карты.
2. регистрация имени пользователя и пароля.
3. проведение картой для разблокировки электронного замка.
4. Имя пользователя и пароль для разблокировки электронного замка.

Схема подключения

connection.thumb.jpg.31a6802f416ebe4635aa88ddb3e313ab.jpg

 

Разработка графического интерфейса пользователя

954459843_GUIdesign.thumb.png.b052dc04ff6d43a5941b89bc4c6f97a0.png

 

Совместное использование кода

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

 

Share this post


Link to post
Share on other sites

06.08.2021 в 06:17, Aaronli сказал:

мы разработали систему контроля доступа, которую можно разблокировать, проведя по карте и введя пароль.

То, что я увидел нифига не удобно, больше похоже на демку от СТМ или подобное, но только не для устройств в продажу.

ЗЫ. Замков с RFID картами более, чем дофига и они гораздо проще в работе, ИМХО...

Share this post


Link to post
Share on other sites

01.09.2021 в 12:49, Aaronli сказал:

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')

Жуть какая! Ну и "протокол"...

11.09.2021 в 08:50, rkit сказал:

Это китайцы рекламируют свой дисплей

Ясненько))

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...