IOT

ระบบควบคุมการเข้าออกอัจฉริยะตาม STONE TFT LCD และ ESP32

แนะนำสั้น ๆ

บ้านอัจฉริยะมีมากขึ้นเรื่อย ๆ กับการพัฒนาเทคโนโลยี บทความนี้จะเน้นด้านความปลอดภัยของโครงการควบคุมการเข้าถึงอัจฉริยะ

บทความนี้ใช้ หน้าจอสัมผัสของ STONE เพื่อส่งคำสั่งไปยัง MCU เพื่อควบคุมรีเลย์และโมดูล MFRC522

หลักการอ่านการ์ด: โดยการขับโมดูล RFID-RC522 ระบุ ID card ID ใกล้กับ ID card แล้วตรวจสอบว่า ID มีอยู่ในฐานข้อมูลของคำทั่วๆ แล้วพิมพ์ชื่อที่เกี่ยวข้อง จากนั้นขับเคลื่อนล็อคแม่เหล็กไฟฟ้าในลักษณะเดียวกัน

วัสดุที่จำเป็น

ฟังก์ชั่นที่รับรู้

  1. การลงทะเบียนบัตร
  2. การลงทะเบียนชื่อผู้ใช้และรหัสผ่าน
  3. รูดบัตรเพื่อปลดล็อคล็อคอิเล็กทรอนิกส์
  4. ชื่อผู้ใช้และรหัสผ่านเพื่อปลดล็อคล็อคอิเล็กทรอนิกส์

ฮาร์ดแวร์หลัก 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