แนะนำสั้น ๆ
บ้านอัจฉริยะมีมากขึ้นเรื่อย ๆ กับการพัฒนาเทคโนโลยี บทความนี้จะเน้นด้านความปลอดภัยของโครงการควบคุมการเข้าถึงอัจฉริยะ
บทความนี้ใช้ หน้าจอสัมผัสของ STONE เพื่อส่งคำสั่งไปยัง MCU เพื่อควบคุมรีเลย์และโมดูล MFRC522
หลักการอ่านการ์ด: โดยการขับโมดูล RFID-RC522 ระบุ ID card ID ใกล้กับ ID card แล้วตรวจสอบว่า ID มีอยู่ในฐานข้อมูลของคำทั่วๆ แล้วพิมพ์ชื่อที่เกี่ยวข้อง จากนั้นขับเคลื่อนล็อคแม่เหล็กไฟฟ้าในลักษณะเดียวกัน
วัสดุที่จำเป็น
- ESP32
- KOB ล็อคไฟฟ้า
- ถ่ายทอด
- STONE STWI070WT-01 จอแสดงผลแบบสัมผัส
- โมดูล MFRC522
ฟังก์ชั่นที่รับรู้
- การลงทะเบียนบัตร
- การลงทะเบียนชื่อผู้ใช้และรหัสผ่าน
- รูดบัตรเพื่อปลดล็อคล็อคอิเล็กทรอนิกส์
- ชื่อผู้ใช้และรหัสผ่านเพื่อปลดล็อคล็อคอิเล็กทรอนิกส์
ฮาร์ดแวร์หลัก Description
โมดูล RFID
โมดูลนี้สามารถโหลดลงในโมดูลเครื่องอ่านต่างๆ ได้โดยตรง ใช้แรงดันไฟฟ้า 3.3V ผ่านอินเทอร์เฟซ SPI โดยใช้สายไฟเพียงไม่กี่เส้น เชื่อมต่อโดยตรงกับเมนบอร์ด CPU โมดูลสามารถทำงานในลักษณะที่มั่นคงและเชื่อถือได้ในฐานะเครื่องอ่านการ์ดระยะไกล
STWI070WT-01 ได้รับการออกแบบให้เป็นจอภาพ TFT และตัวควบคุมแบบสัมผัส ประกอบด้วยโปรเซสเซอร์, โปรแกรมควบคุม, ไดรเวอร์, หน่วยความจำแฟลช, พอร์ต RS232/RS422/RS485/TTL/LAN, Wi-Fi/Bluetooth, หน้าจอสัมผัส, พาวเวอร์ซัพพลาย ฯลฯ ดังนั้นจึงเป็นทั้งระบบแสดงผลที่มีประสิทธิภาพและใช้งานง่าย ระบบปฏิบัติการซึ่งสามารถควบคุมโดย MCU ใดก็ได้
การออกแบบ GUI
การแชร์รหัส
นำเข้า mfrc522
เวลานำเข้า
นำเข้า _thread
จากระบบปฏิบัติการนำเข้า uname
จากการนำเข้าเครื่อง พิน UART
#จาก pyb นำเข้า UART
#เครื่องนำเข้า
suos = พิน (32,Pin.OUT)
uart2 = UART (2, บอดเรต = 115200, rx = 16, tx = 17, หมดเวลา = 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 = ”
บุคลากร_id = {'zbw': [236,230,169,47],'lbw':[19,165,93,4]}
บุคลากร_ps = {'zbw':'zbw3366′,'lbw':'lbwnb'}
admin_password = ('ปปปป')
button_cmd = [16,1]
แก้ไข1_cmd = [16,112]
แก้ไข2_cmd = [16,113]
แก้ไข3_cmd = [16,114]
ถ้า 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 ():
ลอง:
(สถิติ tag_type) = rdr.request(rdr.REQIDL)
ถ้า stat == rdr.OK:
(สถิติ raw_uid) = rdr.anticoll()
ถ้า stat == rdr.OK:
พิมพ์("ตรวจพบบัตรใหม่")
พิมพ์ (” – ประเภทแท็ก: 0x%02x” % tag_type)
พิมพ์ (” – 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]
ถ้า rdr.auth(rdr.AUTHENT1A, 8, คีย์, 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()
ถ้า stat == rdr.OK:
พิมพ์ (“ข้อมูลที่เขียนลงในการ์ด”)
อื่น:
พิมพ์("ไม่สามารถเขียนข้อมูลไปยังการ์ด")
อื่น:
พิมพ์ (“ข้อผิดพลาดในการตรวจสอบสิทธิ์”)
อื่น:
พิมพ์("ล้มเหลวในการเลือกแท็ก")
ยกเว้น KeyboardInterrupt:
พิมพ์("เขียนผิดพลาด")
def do_read():
ในขณะที่ True:
ลอง:
(สถิติ tag_type) = rdr.request(rdr.REQIDL)
ถ้า stat == rdr.OK:
(สถิติ raw_uid) = rdr.anticoll()
ถ้า stat == rdr.OK:
พิมพ์("ตรวจพบบัตรใหม่")
พิมพ์ (” – ประเภทแท็ก: 0x%02x” % tag_type)
พิมพ์ (” – 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]
ถ้า rdr.auth(rdr.AUTHENT1A, 8, คีย์, raw_uid) == rdr.OK:
พิมพ์("ที่อยู่ 8 ข้อมูล: %s" % rdr.read(8))
สำหรับ ps ในบุคลากร_id:
ถ้า raw_uid[0:4:1] == president_id.get(ps):
suos.value(1)
พิมพ์ (ป.ล.)
uart_write(ปล. *raw_uid[0:4:1])
เวลานอนหลับ (3)
uart2.sendbreak()
ทำลาย
rdr.stop_crypto1()
เวลานอนหลับ (3)
suos.value(0)
อื่น:
พิมพ์ (“ข้อผิดพลาดในการตรวจสอบสิทธิ์”)
อื่น:
พิมพ์("ล้มเหลวในการเลือกแท็ก")
ถ้า 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 = ” เข้าร่วม (data_name)
พิมพ์ (data_name2)
ถ้า data_name2 == 'back3':
กลับ
ยกเว้น KeyboardInterrupt:
พิมพ์("อ่านผิดพลาด")
def do_read2 (idd):
พิมพ์ (idd)
ในขณะที่ True:
ลอง:
(สถิติ tag_type) = rdr.request(rdr.REQIDL)
ถ้า stat == rdr.OK:
(สถิติ raw_uid) = rdr.anticoll()
ถ้า stat == rdr.OK:
พิมพ์("ตรวจพบบัตรใหม่")
พิมพ์ (” – ประเภทแท็ก: 0x%02x” % tag_type)
พิมพ์ (” – 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]
ถ้า rdr.auth(rdr.AUTHENT1A, 8, คีย์, raw_uid) == rdr.OK:
พิมพ์("ที่อยู่ 8 ข้อมูล: %s" % rdr.read(8))
บุคลากร_id[idd] = raw_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
อื่น:
พิมพ์ (“ข้อผิดพลาดในการตรวจสอบสิทธิ์”)
อื่น:
พิมพ์("ล้มเหลวในการเลือกแท็ก")
ถ้า 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 = ” เข้าร่วม (data_name)
พิมพ์ (data_name2)
ถ้า data_name2 == 'back1':
กลับ
ยกเว้น KeyboardInterrupt:
พิมพ์("อ่านผิดพลาด")
def uart_write (ข้อความ * รหัส):
# พิมพ์ (ข้อความ * รหัส)
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')
เวลานอนหลับ (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(ข้อความ,ข้อความ2):
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”'+text+'”}>ET')
เวลานอนหลับ (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' )
เวลานอนหลับ (3)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”””}>ET')
def uart_write4(ข้อความ,ข้อความ2):
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”login”,”text”:”'+text+'”}>ET')
เวลานอนหลับ (1)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”login”,”text”:”'+text2+'”}>ET')
เวลานอนหลับ (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' )
เวลานอนหลับ (3)
uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”””}>ET')
def card_zhuce ():
ในขณะที่ True:
ถ้า 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 = ”.เข้าร่วม(data_id_st)
พิมพ์ (data_id_st2)
ถ้า data_id_st2 == 'edit1':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ” เข้าร่วม (data_id_st3)
พิมพ์ (data_id_st4)
ถ้า data_id_st4 != ”:
ชื่อ = จริง
elif data_id_st2 == 'edit2':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ” เข้าร่วม (data_id_st5)
ถ้า data_id_st6 == admin_password:
แอดมิน = ทรู
uart_write2('ผ่านการยืนยันแล้ว!','กรุณาวางการ์ด!')
do_read2 (ข้อมูล_id_st4)
กลับ
def mima_zuce():
temp_id3 = ”
temp_mima3 = ”
ในขณะที่ True:
ถ้า uart2.any():
user_id = ”
รหัสผ่าน = ”
RX2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.read (40)
uart2.sendbreak()
rx1 = รายการ (bin_data)
สำหรับรายการใน rx1:
rx2.append(chr(รายการ))
rx_num += 1
# if (rx2[rx_num] == 'T') และ (rx2[rx_num-1] == 'E') และ (rx2[rx_num-2] == '>'):
# หยุดพัก
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.เข้าร่วม(data_id_st)
พิมพ์ (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 = ” เข้าร่วม (data_name)
พิมพ์ (data_name2)
ถ้า data_name2 == 'back2':
กลับ
ถ้า data_id_st2 == 'edit3':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ” เข้าร่วม (data_id_st3)
พิมพ์ (data_id_st4)
user_id_flag = จริง
temp_id3 = data_id_st4
#บุคลากร_ps[temp_id] = raw_uid[0:4:1]
elif data_id_st2 == 'edit4':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ” เข้าร่วม (data_id_st5)
พิมพ์ (data_id_st6)
# ถ้าบุคลากร_ps.get(temp_id) == data_id_st6:
password_flag = จริง
temp_mima3 = data_id_st6
#บุคลากร_ps[temp_id] = password_flag
# พิมพ์ (rx2, user_id_flag, รหัสผ่าน_flag)
elif data_id_st2 == 'edit7':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ” เข้าร่วม (data_id_st5)
ถ้า (data_id_st6 == admin_password) และ (password_flag == True) และ (user_id_flag == True):
แอดมิน = ทรู
บุคลากร_ps[temp_id3] = temp_mima3
password_flag = เท็จ
user_id_flag = เท็จ
uart_write4('ผ่านการตรวจสอบแล้ว!','การเข้าสู่ระบบสำเร็จ!')
def รหัสผ่าน_loin ():
temp_id2 = ”
temp_mima = ”
ในขณะที่ True:
ถ้า uart2.any():
user_id = ”
รหัสผ่าน = ”
RX2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.read (40)
uart2.sendbreak()
rx1 = รายการ (bin_data)
สำหรับรายการใน rx1:
rx2.append(chr(รายการ))
rx_num += 1
# if (rx2[rx_num] == 'T') และ (rx2[rx_num-1] == 'E') และ (rx2[rx_num-2] == '>'):
# หยุดพัก
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.เข้าร่วม(data_id_st)
พิมพ์ (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 = ” เข้าร่วม (data_name)
พิมพ์ (data_name2)
ถ้า data_name2 == 'back4':
กลับ
ถ้า data_id_st2 == 'edit5':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ” เข้าร่วม (data_id_st3)
พิมพ์ (data_id_st4)
ถ้า data_id_st4 ในบุคลากร_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 = ” เข้าร่วม (data_id_st5)
พิมพ์ (data_id_st6)
พิมพ์ (temp_id2)
พิมพ์ (personnel_ps)
ถ้าบุคลากร_ps.get(temp_id2) == data_id_st6:
password_flag = จริง
# พิมพ์ (rx2, user_id_flag, รหัสผ่าน_flag)
พิมพ์ (user_id_flag,รหัสผ่าน_flag)
ถ้า (password_flag == True) และ (user_id_flag == True):
uart_write(temp_id2,temp_id2)
password_flag = เท็จ
user_id_flag = เท็จ
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')
เวลานอนหลับ (3)
# uart_write ('นักเรียน'”)
suos.value(0)
uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock2″,”visible”:false}>ET')
uart2.sendbreak()
ในขณะที่ True:
ถ้า 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 = ” เข้าร่วม (data_name)
พิมพ์ (data_name2)
ถ้า data_name2 == 'card1':
card_zhuce()
elif data_name2 == 'รหัสผ่าน1':
mima_zuce()
elif data_name2 == 'card2':
ทำ_อ่าน()
elif data_name2 == 'รหัสผ่าน2':
รหัสผ่าน_loin()
MFRC522.py
จากการนำเข้าเครื่อง พิน SPI
จากระบบปฏิบัติการนำเข้า uname
คลาส MFRC522:
ตกลง = 0
น็อตทาเจอร์ = 1
ข้อผิดพลาด = 2
REQIDL = 0x26
รีคอล = 0x52
AUTENT1A = 0x60
AUTENT1B = 0x61
def __init__(ตัวเอง, sck, mosi, miso, rst, cs):
self.sck = พิน (sck, Pin.OUT)
self.mosi = พิน (mosi, Pin.OUT)
self.miso = พิน (มิโซะ)
self.rst = พิน (อันดับแรก, Pin.OUT)
self.cs = พิน (cs, Pin.OUT)
self.rst.value(0)
self.cs.value(1)
กระดาน = uname()[0]
ถ้ากระดาน == 'WiPy' หรือกระดาน == 'LoPy' หรือกระดาน == 'FiPy':
self.spi = SPI (0)
self.spi.init (SPI.MASTER, baudrate=1000000, pins=(self.sck, self.mosi, self.miso))
กระดานเอลฟ์ == '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)
ตัวเอง.init()
def _wreg(ตัวเอง, 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(ตัวเอง, reg):
self.cs.value(0)
self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))
วาล = self.spi.read(1)
self.cs.value(1)
ค่ากลับ[0]
def _sflags(ตัวเอง, reg, หน้ากาก):
self._wreg(reg, self._rreg(reg) | หน้ากาก)
def _cflags(ตัวเอง, reg, หน้ากาก):
self._wreg(reg, self._rreg(reg) & (~mask))
def _tocard(ตัวเอง, cmd, ส่ง):
รับ = []
บิต = irq_en = wait_irq = n = 0
สถิติ = self.ERR
ถ้า cmd == 0x0E:
irq_en = 0x12
wait_irq = 0x10
เอลลิฟ cmd == 0x0C:
irq_en = 0x77
wait_irq = 0x30
self._wreg (0x02, irq_en | 0x80)
self._cflags (0x04, 0x80)
self._sflags(0x0A, 0x80)
ตัวเอง._wreg(0x01, 0x00)
สำหรับ c ในการส่ง:
self._wreg(0x09, ค)
self._wreg (0x01, cmd)
ถ้า cmd == 0x0C:
self._sflags(0x0D, 0x80)
i = 2000
ในขณะที่ True:
n = ตัวเอง._rreg(0x04)
ผม -= 1
ถ้า ~((i != 0) และ ~(n & 0x01) และ ~(n & wait_irq)):
ทำลาย
self._cflags (0x0D, 0x80)
ถ้าฉัน:
ถ้า (ตัวเอง._rreg(0x06) & 0x1B) == 0x00:
สถิติ = self.OK
ถ้า n & irq_en & 0x01:
stat = self.NOTAGERR
เอลลิฟ cmd == 0x0C:
n = ตนเอง._rreg(0x0A)
lbits = self._rreg(0x0C) & 0x07
ถ้าปอนด์ != 0:
บิต = (n – 1) * 8 + lbits
อื่น:
บิต = n * 8
ถ้า n == 0:
n = 1
เอลฟ์ n > 16:
n = 16
สำหรับ _ ในช่วง (n):
recv.append(ตัวเอง._rreg(0x09))
อื่น:
สถิติ = self.ERR
คืนค่าสถิติ recv บิต
def _crc(ตัวเอง, ข้อมูล):
self._cflags (0x05, 0x04)
self._sflags(0x0A, 0x80)
สำหรับ c ในข้อมูล:
self._wreg(0x09, ค)
ตัวเอง._wreg(0x01, 0x03)
ผม = 0xFF
ในขณะที่ True:
n = ตัวเอง._rreg(0x05)
ผม -= 1
ถ้าไม่ ((i != 0) และไม่ใช่ (n & 0x04)):
ทำลาย
กลับ [self._rreg(0x22), self._rreg(0x21)]
def init (ตัวเอง):
รีเซ็ตตัวเอง ()
ตัวเอง._wreg(0x2A, 0x8D)
self._wreg(0x2B, 0x3E)
self._wreg(0x2D, 30)
ตัวเอง._wreg(0x2C, 0)
ตัวเอง._wreg(0x15, 0x40)
self._wreg(0x11, 0x3D)
self.antenna_on()
def รีเซ็ต (ตัวเอง):
ตัวเอง._wreg(0x01, 0x0F)
def antenna_on(ตัวเอง, เปิด=จริง):
ถ้าเปิดและ ~(self._rreg(0x14) & 0x03):
self._sflags(0x14, 0x03)
อื่น:
self._cflags (0x14, 0x03)
คำขอ def (ตัวเอง, โหมด):
ตัวเอง._wreg(0x0D, 0x07)
(สถิติ, recv, บิต) = self._tocard(0x0C, [โหมด])
if (stat != self.OK) | (บิต != 0x10):
สถิติ = self.ERR
คืนค่าสถิติ bits
def anticoll (ตัวเอง):
เซอร์_ชเค = 0
เซอร์ = [0x93, 0x20]
ตัวเอง._wreg(0x0D, 0x00)
(สถิติ, recv, บิต) = self._tocard(0x0C, เซิร์ฟเวอร์)
ถ้า stat == self.OK:
ถ้าเลน (recv) == 5:
สำหรับฉันอยู่ในช่วง (4):
ser_chk = ser_chk ^ รับ [i]
ถ้า ser_chk != recv[4]:
สถิติ = self.ERR
อื่น:
สถิติ = self.ERR
ค่าสถานะกลับ, recv
def select_tag(ตัวเอง, เซิร์ฟเวอร์):
บัฟ = [0x93, 0x70] + เซอร์[:5]
buf += ตนเอง._crc(buf)
(สถิติ, recv, บิต) = self._tocard(0x0C, buf)
ส่งคืน self.OK ถ้า (stat == self.OK) และ (บิต == 0x18) อื่น self.ERR
def auth(ตัวเอง, โหมด, addr, นิกาย, ser):
กลับ self._tocard(0x0E, [โหมด, addr] + นิกาย + ser[:4])[0]
def stop_crypto1 (ตัวเอง):
self._cflags (0x08, 0x08)
def อ่าน (ตัวเอง, addr):
ข้อมูล = [0x30, addr]
ข้อมูล += self._crc(ข้อมูล)
(สถิติ, recv, _) = self._tocard(0x0C, ข้อมูล)
คืนค่า recv ถ้า stat == self.OK อื่นไม่มี
def เขียน (ตัวเอง, addr, data):
บัฟ = [0xA0, addr]
buf += ตนเอง._crc(buf)
(สถิติ, recv, บิต) = self._tocard(0x0C, buf)
ถ้าไม่ (stat == self.OK) หรือไม่ (bits == 4) หรือไม่ ((recv[0] & 0x0F) == 0x0A):
สถิติ = self.ERR
อื่น:
บัฟ = []
สำหรับฉันอยู่ในช่วง (16):
buf.append(ข้อมูล[i])
buf += ตนเอง._crc(buf)
(สถิติ, recv, บิต) = self._tocard(0x0C, buf)
ถ้าไม่ (stat == self.OK) หรือไม่ (bits == 4) หรือไม่ ((recv[0] & 0x0F) == 0x0A):
สถิติ = self.ERR
คืนสถานะ
ที่มา: Plato Data Intelligence