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 โมดูลสามารถทำงานในลักษณะที่มั่นคงและเชื่อถือได้ในฐานะเครื่องอ่านการ์ดระยะไกล

การควบคุมการเข้าถึงอัจฉริยะที่ใช้ STONE TFT LCD และ ESP32 IOT PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.
ระบบควบคุมการเข้าออกอัจฉริยะตาม STONE TFT LCD และ ESP32

STWI070WT-01 ได้รับการออกแบบให้เป็นจอภาพ TFT และตัวควบคุมแบบสัมผัส ประกอบด้วยโปรเซสเซอร์, โปรแกรมควบคุม, ไดรเวอร์, หน่วยความจำแฟลช, พอร์ต RS232/RS422/RS485/TTL/LAN, Wi-Fi/Bluetooth, หน้าจอสัมผัส, พาวเวอร์ซัพพลาย ฯลฯ ดังนั้นจึงเป็นทั้งระบบแสดงผลที่มีประสิทธิภาพและใช้งานง่าย ระบบปฏิบัติการซึ่งสามารถควบคุมโดย MCU ใดก็ได้

การควบคุมการเข้าถึงอัจฉริยะที่ใช้ STONE TFT LCD และ ESP32 IOT PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.
ระบบควบคุมการเข้าออกอัจฉริยะตาม STONE TFT LCD และ ESP32

การออกแบบ GUI

การควบคุมการเข้าถึงอัจฉริยะที่ใช้ STONE TFT LCD และ ESP32 IOT PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.
ระบบควบคุมการเข้าออกอัจฉริยะตาม STONE TFT LCD และ ESP32

การแชร์รหัส

การควบคุมการเข้าถึงอัจฉริยะที่ใช้ STONE TFT LCD และ ESP32 IOT PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.
ระบบควบคุมการเข้าออกอัจฉริยะตาม STONE TFT LCD และ ESP32

นำเข้า 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