معرفی مختصر
خانه های هوشمند با توسعه فناوری روز به روز رایج تر می شوند، این مقاله بر جنبه های امنیتی پروژه کنترل دسترسی هوشمند تمرکز می کند.
این مقاله استفاده می کند صفحه لمسی STONE برای ارسال دستورات به MCU برای کنترل رله و ماژول MFRC522.
اصل کارت خوانی: با رانندگی ماژول RFID-RC522، شناسه کارت شناسایی نزدیک به کارت شناسایی را شناسایی کنید، و سپس تعیین کنید که آیا شناسه در پایگاه داده کلمه معمولی وجود دارد یا خیر، ID مقدار معمول کلمه است، در صورت وجود تأیید از طریق و سپس نام مربوطه را پرینت بگیرید و سپس قفل الکترومغناطیسی را به همین ترتیب برانید.
مواد مورد نیاز
- ESP32
- قفل الکترونیکی KOB
- رله
- صفحه نمایش پنل لمسی STONE STWI070WT-01
- ماژول MFRC522
عملکرد تحقق یافته است
- ثبت نام کارت
- ثبت نام کاربری و رمز عبور
- برای باز کردن قفل الکترونیکی، کارت را بکشید.
- نام کاربری و رمز عبور برای باز کردن قفل الکترونیکی.
توضیحات سخت افزار اصلی
ماژول RFID
این ماژول می تواند به طور مستقیم در ماژول های خواننده مختلف بارگذاری شود. از ولتاژ 3.3 ولت، از طریق رابط SPI فقط با چند سیم استفاده می کند. این ماژول که مستقیماً به یک مادربرد CPU متصل می شود، می تواند به صورت پایدار و قابل اعتماد به عنوان یک کارت خوان از راه دور کار کند.
STWI070WT-01 به عنوان مانیتور TFT و کنترلر لمسی در نظر گرفته شده است. این شامل پردازنده، برنامه کنترل، درایور، فلش مموری، پورت RS232/RS422/RS485/TTL/LAN، Wi-Fi/Bluetooth، صفحه نمایش لمسی، منبع تغذیه و غیره است، بنابراین یک سیستم نمایش کامل بر اساس قدرتمند و آسان است. سیستم عامل، که می تواند توسط هر MCU کنترل شود.
طراحی رابط کاربری گرافیکی
به اشتراک گذاری کد
واردات mfrc522
زمان واردات
import _thread
از os import unname
از پین واردات ماشین، UART
#from pyb import UART
#ماشین واردات
suos = پین (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 = نادرست
password_flag = نادرست
temp_id = ”
temp_mima = ”
personel_id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}
personel_ps = {'zbw':'zbw3366','lbw':'lbwnb'}
admin_password = ("Yds")
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():
تلاش كردن:
(state, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
چاپ ("کارت جدید شناسایی شد")
print(” – نوع برچسب: 0x%02x”% tag_type)
print(" – uid: 0x%02x%02x%02x%02x" % (raw_uid[0]، raw_uid[1]، raw_uid[2]، raw_uid[3]))
چاپ("")
اگر rdr.select_tag(raw_uid) == rdr.OK:
کلید = [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:
چاپ ("داده های نوشته شده روی کارت")
دیگری:
چاپ ("نوشتن داده ها روی کارت ناموفق بود")
دیگری:
چاپ ("خطای احراز هویت")
دیگری:
چاپ ("انتخاب برچسب ناموفق")
به جز KeyboardInterrupt:
چاپ ("اشتباه نوشتن")
def do_read():
در حالی که درست است:
تلاش كردن:
(state, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
چاپ ("کارت جدید شناسایی شد")
print(” – نوع برچسب: 0x%02x”% tag_type)
print(" – uid : 0x%02x%02x%02x%02x" % (raw_uid[0]، raw_uid[1]، raw_uid[2]، raw_uid[3]))
چاپ (raw_uid[0]، raw_uid[1]، raw_uid[2]، raw_uid[3])
چاپ("")
اگر rdr.select_tag(raw_uid) == rdr.OK:
کلید = [0xFF، 0xFF، 0xFF، 0xFF، 0xFF، 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
print("آدرس 8 داده: %s" % rdr.read(8))
برای ps در personel_id:
if raw_uid[0:4:1] == personnel_id.get(ps):
suos.value(1)
چاپ (ps)
uart_write (ps، *raw_uid[0:4:1])
زمان. خواب (3)
uart2.sendbreak()
شکستن
rdr.stop_crypto1()
زمان. خواب (3)
suos.value(0)
دیگری:
چاپ ("خطای احراز هویت")
دیگری:
چاپ ("انتخاب برچسب ناموفق")
if uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = لیست (bin_data)
برای آیتم در rx1:
rx2.append(chr(مورد))
چاپ (rx2)
اگر 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)
چاپ (نام_داده2)
if data_name2 == 'back3':
برگشت
به جز KeyboardInterrupt:
چاپ ("خطای خواندن")
def do_read2 (idd):
چاپ (idd)
در حالی که درست است:
تلاش كردن:
(state, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
چاپ ("کارت جدید شناسایی شد")
print(” – نوع برچسب: 0x%02x”% tag_type)
print(" – uid : 0x%02x%02x%02x%02x" % (raw_uid[0]، raw_uid[1]، raw_uid[2]، raw_uid[3]))
چاپ (raw_uid[0]، raw_uid[1]، raw_uid[2]، raw_uid[3])
چاپ("")
اگر rdr.select_tag(raw_uid) == rdr.OK:
کلید = [0xFF، 0xFF، 0xFF، 0xFF، 0xFF، 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
print("آدرس 8 داده: %s" % rdr.read(8))
personel_id[idd] = raw_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
دیگری:
چاپ ("خطای احراز هویت")
دیگری:
چاپ ("انتخاب برچسب ناموفق")
if uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = لیست (bin_data)
برای آیتم در rx1:
rx2.append(chr(مورد))
اگر 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)
چاپ (نام_داده2)
if data_name2 == 'back1':
برگشت
به جز KeyboardInterrupt:
چاپ ("خطای خواندن")
def uart_write(text، *ids):
# چاپ (متن، *شناسه)
uart2.write('STET' )
uart2.write('STET' )
uart2.write('STET')
زمان. خواب (3)
uart2.write("STET")
uart2.write("STET")
uart2.write('STET')
def uart_write2(text,text2):
uart2.write('STET')
زمان. خواب (3)
uart2.write('STET')
uart2.write("STET")
def uart_write3(*id2):
uart2.write('STET' )
زمان. خواب (3)
uart2.write('STET")
def uart_write4(text,text2):
uart2.write('STET')
زمان. خواب (1)
uart2.write('STET')
زمان. خواب (1)
uart2.write("STET")
uart2.write("STET")
uart2.write("STET")
def uart_write5():
uart2.write('STET' )
زمان. خواب (3)
uart2.write('STET")
def card_zhuce():
در حالی که درست است:
if uart2.any():
user_id = ”
رمز عبور = ”
rx2 = []
rx_num = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = لیست (bin_data)
برای آیتم در rx1:
rx2.append(chr(مورد))
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 != ”:
نام = درست
elif data_id_st2 == 'edit2':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = "join(data_id_st5)
اگر data_id_st6 == admin_password:
مدیر = درست است
uart_write2 («تأیید تأیید شد!»، «لطفاً کارت را قرار دهید!»)
do_read2 (data_id_st4)
برگشت
def mima_zuce():
temp_id3 = ”
temp_mima3 = ”
در حالی که درست است:
if uart2.any():
user_id = ”
رمز عبور = ”
rx2 = []
rx_num = 0
# پایان_داده = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = لیست (bin_data)
برای آیتم در rx1:
rx2.append(chr(مورد))
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)
اگر 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)
چاپ (نام_داده2)
if data_name2 == 'back2':
برگشت
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 = درست است
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)
# اگر personnel_ps.get(temp_id) == data_id_st6:
password_flag = درست است
temp_mima3 = data_id_st6
# personnel_ps[temp_id] = رمز
# چاپ (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)
اگر (data_id_st6 == admin_password) و (password_flag == True) و (user_id_flag == True):
مدیر = درست است
personel_ps[temp_id3] = temp_mima3
password_flag = نادرست
user_id_flag = نادرست
uart_write4 («تأیید تأیید شد!»، «ورود با موفقیت انجام شد!»)
Def password_loin():
temp_id2 = ”
temp_mima = ”
در حالی که درست است:
if uart2.any():
user_id = ”
رمز عبور = ”
rx2 = []
rx_num = 0
# پایان_داده = 0
bin_data = uart2.read(40)
uart2.sendbreak()
rx1 = لیست (bin_data)
برای آیتم در rx1:
rx2.append(chr(مورد))
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)
اگر 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)
چاپ (نام_داده2)
if data_name2 == 'back4':
برگشت
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 در personel_ps:
user_id_flag = درست است
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)
چاپ (temp_id2)
چاپ (Personnel_ps)
اگر personnel_ps.get(temp_id2) == data_id_st6:
password_flag = درست است
# چاپ (rx2,user_id_flag,password_flag)
print(user_id_flag,password_flag)
اگر (password_flag == True) و (user_id_flag == True):
uart_write(temp_id2,temp_id2)
password_flag = نادرست
user_id_flag = نادرست
suos.value(1)
uart2.write('STET')
uart2.write("STET")
uart2.write("STET")
زمان. خواب (3)
#
suos.value(0)
uart2.write('STET')
uart2.sendbreak()
در حالی که درست است:
if uart2.any()>1:
rx2 = []
data_name2 = ”
bin_data = uart2.read(40)
# time.sleep (1)
uart2.sendbreak()
# time.sleep (1)
rx1 = لیست (bin_data)
برای آیتم در rx1:
rx2.append(chr(مورد))
چاپ (rx2)
اگر 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)
چاپ (نام_داده2)
if data_name2 == 'card1':
card_zhuce()
elif data_name2 == 'password1':
mima_zuce()
elif data_name2 == 'card2':
do_read()
elif data_name2 == 'password2':
password_loin()
MFRC522.py
از پین واردات ماشین، SPI
از os import unname
کلاس MFRC522:
خوب = 0
NOTAGERR = 1
ERR = 2
REQIDL = 0x26
REQALL = 0x52
AUTHENT1A = 0x60
AUTHENT1B = 0x61
def __init__(self، sck، mosi، miso، rst، cs):
self.sck = پین (sck, Pin.OUT)
self.mosi = پین (mosi، Pin.OUT)
self.miso = پین (miso)
self.rst = پین (rst، Pin.OUT)
self.cs = پین (cs، Pin.OUT)
self.rst.value(0)
self.cs.value(1)
تابلو = uname()[0]
if board == 'WiPy' or board == 'LoPy' or board == 'FiPy':
self.spi = SPI(0)
self.spi.init(SPI.MASTER، baudrate=1000000، پین=(self.sck، self.mosi، self.miso))
elif board == 'esp32':
self.spi = SPI(baudrate=100000، قطبیت=0، فاز=0، sck=self.sck، mosi=self.mosi، miso=self.miso)
self.spi.init()
دیگری:
افزایش RuntimeError ("پلتفرم پشتیبانی نشده")
self.rst.value(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(self,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)
بازگشت val[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(self, cmd, send):
recv = []
بیت = irq_en = انتظار_irq = n = 0
stat = self.ERR
اگر 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)
برای c در ارسال:
self._wreg(0x09, c)
self._wreg (0x01، cmd)
اگر cmd == 0x0C:
self._sflags(0x0D، 0x80)
من = 2000
در حالی که درست است:
n = self._rreg(0x04)
i - = 1
اگر ~((i != 0) و ~(n & 0x01) و ~(n & wait_irq)):
شکستن
self._cflags(0x0D، 0x80)
اگر من:
if (self._rreg(0x06) & 0x1B) == 0x00:
آمار = خود. خوب
اگر n & irq_en و 0x01:
stat = خود.NOTAGERR
elif cmd == 0x0C:
n = self._rreg(0x0A)
بیت = self._rreg(0x0C) و 0x07
اگر بیت != 0:
بیت = (n – 1) * 8 + بیت
دیگری:
بیت = n * 8
اگر n == 0:
1 نفر
elif n > 16:
16 نفر
برای _ در محدوده(n):
recv.append(self._rreg(0x09))
دیگری:
stat = self.ERR
بازگشت آمار، recv، بیت ها
def _crc (خود، داده):
self._cflags(0x05، 0x04)
self._sflags(0x0A، 0x80)
برای c در داده:
self._wreg(0x09, c)
self._wreg (0x01، 0x03)
i = 0xFF
در حالی که درست است:
n = self._rreg(0x05)
i - = 1
اگر نه ((i != 0) و نه (n & 0x04)):
شکستن
بازگشت [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()
تنظیم مجدد (خود):
self._wreg (0x01، 0x0F)
def antenna_on(self, on=True):
if on و ~(self._rreg(0x14) & 0x03):
self._sflags(0x14، 0x03)
دیگری:
self._cflags(0x14، 0x03)
درخواست def (خود، حالت):
self._wreg(0x0D، 0x07)
(stat، recv، بیت ها) = self._tocard(0x0C، [حالت])
if (stat != self.OK) | (بیت != 0x10):
stat = self.ERR
بازگشت آمار، بیت
def anticoll(self):
ser_chk = 0
ser = [0x93، 0x20]
self._wreg(0x0D، 0x00)
(stat, recv, bits) = self._tocard(0x0C, ser)
if stat == self.OK:
اگر len(recv) == 5:
برای i در محدوده (4):
ser_chk = ser_chk ^ recv[i]
if ser_chk != recv[4]:
stat = self.ERR
دیگری:
stat = self.ERR
بازگشت آمار، recv
def select_tag(self, ser):
buf = [0x93، 0x70] + ser[:5]
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
بازگشت self.OK اگر (stat == self.OK) و (bits == 0x18) else self.ERR
def auth(self، mode، adr، sect، ser):
بازگشت self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]
def stop_crypto1(self):
self._cflags(0x08، 0x08)
def read(self, adr):
داده = [0x30، addr]
داده += self._crc(داده)
(stat, recv, _) = self._tocard(0x0C, data)
بازگشت recv اگر stat == self. Ok other هیچ
def write (self, addr, data):
buf = [0xA0، addr]
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
اگر نه (stat == self.OK) یا نه (bit == 4) یا نه ((recv[0] & 0x0F) == 0x0A):
stat = self.ERR
دیگری:
بوف = []
برای i در محدوده (16):
buf.append(داده[i])
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
اگر نه (stat == self.OK) یا نه (bit == 4) یا نه ((recv[0] & 0x0F) == 0x0A):
stat = self.ERR
بازگشت آمار
منبع: اطلاعات داده های افلاطون