قام المحفل

تحكم ذكي في الوصول يعتمد على STONE TFT LCD و ESP32

مقدمة مختصرة

أصبح المنزل الذكي أكثر شيوعًا مع تطور التكنولوجيا ، وستركز هذه المقالة على الجوانب الأمنية لمشروع التحكم الذكي في الوصول.

تستخدم هذه المقالة شاشة تعمل باللمس STONE لإرسال أوامر إلى MCU للتحكم في وحدة الترحيل ووحدة MFRC522.

مبدأ قراءة البطاقة: من خلال تشغيل وحدة RFID-RC522 ، حدد معرف بطاقة الهوية بالقرب من بطاقة الهوية ، ثم تحديد ما إذا كان المعرف موجودًا في قاعدة بيانات كلمة نموذجية ، ID هو القيمة النموذجية للكلمة ، إذا كان وجود التحقق من خلال ، ثم اطبع الاسم المقابل ، ثم قم بتشغيل القفل الكهرومغناطيسي بنفس الطريقة.

المواد المطلوبة

الوظيفة المحققة

  1. تسجيل البطاقة.
  2. تسجيل اسم المستخدم وكلمة المرور.
  3. انتقاد البطاقة لفتح القفل الإلكتروني.
  4. اسم المستخدم وكلمة المرور لفتح القفل الإلكتروني.

وصف الجهاز الرئيسي

وحدة ار إف أي دي-RFID

يمكن تحميل هذه الوحدة مباشرة في وحدات قارئ مختلفة. يستخدم جهد 3.3 فولت ، من خلال واجهة SPI ببضعة أسلاك. متصلة مباشرة باللوحة الأم لوحدة المعالجة المركزية ، يمكن للوحدة أن تعمل بطريقة مستقرة وموثوقة كقارئ لبطاقات المسافة.

التحكم في الوصول الذكي على أساس STONE TFT LCD و ESP32 IOT PlatoBlockchain Data Intelligence. البحث العمودي. عاي.
تحكم ذكي في الوصول يعتمد على STONE TFT LCD و ESP32

تم تصميم STWI070WT-01 كشاشة TFT ووحدة تحكم باللمس. يتضمن المعالج ، برنامج التحكم ، برنامج التشغيل ، ذاكرة فلاش ، منفذ RS232 / RS422 / RS485 / TTL / LAN ، Wi-Fi / Bluetooth ، شاشة تعمل باللمس ، مصدر طاقة وما إلى ذلك ، لذلك فهو نظام عرض كامل يعتمد على القوة والسهولة نظام التشغيل ، والذي يمكن التحكم فيه عن طريق Any MCU.

التحكم في الوصول الذكي على أساس STONE TFT LCD و ESP32 IOT PlatoBlockchain Data Intelligence. البحث العمودي. عاي.
تحكم ذكي في الوصول يعتمد على STONE TFT LCD و ESP32

تصميم واجهة المستخدم الرسومية

التحكم في الوصول الذكي على أساس STONE TFT LCD و ESP32 IOT PlatoBlockchain Data Intelligence. البحث العمودي. عاي.
تحكم ذكي في الوصول يعتمد على STONE TFT LCD و ESP32

مشاركه الرمز

التحكم في الوصول الذكي على أساس STONE TFT LCD و ESP32 IOT PlatoBlockchain Data Intelligence. البحث العمودي. عاي.
تحكم ذكي في الوصول يعتمد على STONE TFT LCD و ESP32

استيراد mfrc522

وقت الاستيراد

استيراد _thread

من نظام التشغيل استيراد uname

من دبوس استيراد الجهاز ، UART

#from pyb استيراد UART

# آلة الاستيراد

suos = Pin (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

آر إكس 3 = []

rx_name = []

user_id_flag = خطأ

password_flag = خطأ

temp_id = "

temp_mima = "

staff_id = {'zbw': [236,230,169,47،19,165,93,4،XNUMX،XNUMX]، 'lbw': [XNUMX،XNUMX،XNUMX،XNUMX]}

staff_ps = {'zbw': 'zbw3366 ′،' lbw ':' lbwnb '}

admin_password = ('yyds')

button_cmd = [16,1،XNUMX]

edit1_cmd = [16,112،XNUMX]

edit2_cmd = [16,113،XNUMX]

edit3_cmd = [16,114،XNUMX]

إذا 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 ():

محاولة:

(stat، tag_type) = rdr.request (rdr.REQIDL)

إذا كانت الحالة == rdr.OK:

(stat، raw_uid) = rdr.anticoll ()

إذا كانت الحالة == 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، 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 ()

إذا كانت الحالة == rdr.OK:

طباعة ("البيانات المكتوبة على البطاقة")

آخر:

طباعة ("فشل كتابة البيانات على البطاقة")

آخر:

طباعة ("خطأ في المصادقة")

آخر:

طباعة ("فشل في تحديد العلامة")

باستثناء لوحة المفاتيح:

طباعة ("خطأ كتابة")

def do_read ():

احيانا صحيح:

محاولة:

(stat، tag_type) = rdr.request (rdr.REQIDL)

إذا كانت الحالة == rdr.OK:

(stat، raw_uid) = rdr.anticoll ()

إذا كانت الحالة == 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، key، raw_uid) == rdr.OK:

طباعة ("بيانات العنوان 8:٪ s"٪ rdr.read (8))

من أجل ps في staff_id:

إذا كان raw_uid [0: 4: 1] == members_id.get (ps):

suos.value (1)

طباعة (ملاحظة)

uart_write (ps، * raw_uid [0: 4: 1])

time.sleep (3)

uart2.sendbreak ()

استراحة

rdr.stop_crypto1 ()

time.sleep (3)

suos.value (0)

آخر:

طباعة ("خطأ في المصادقة")

آخر:

طباعة ("فشل في تحديد العلامة")

إذا كان uart2.any ()> 1:

آر إكس 2 = []

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)

طباعة (data_name2)

إذا كانت data_name2 == 'back3':

عائد أعلى

باستثناء لوحة المفاتيح:

طباعة ("قراءة خطأ")

مواطن do_read2 (معرف):

طباعة (idd)

احيانا صحيح:

محاولة:

(stat، tag_type) = rdr.request (rdr.REQIDL)

إذا كانت الحالة == rdr.OK:

(stat، raw_uid) = rdr.anticoll ()

إذا كانت الحالة == 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، key، raw_uid) == rdr.OK:

طباعة ("بيانات العنوان 8:٪ s"٪ rdr.read (8))

staff_id [idd] = raw_uid [0: 4: 1]

uart_write3 (* raw_uid [0: 4: 1])

rdr.stop_crypto1 ()

آخر:

طباعة ("خطأ في المصادقة")

آخر:

طباعة ("فشل في تحديد العلامة")

إذا كان uart2.any ()> 1:

آر إكس 2 = []

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)

طباعة (data_name2)

إذا كانت data_name2 == 'back1':

عائد أعلى

باستثناء لوحة المفاتيح:

طباعة ("قراءة خطأ")

def uart_write (text، * id):

# طباعة (نص ، * معرفات)

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 ″،" visual ": 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 ″،" visual ": false}> ET')

def uart_write2 (نص ، نص 2):

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 (نص ، نص 2):

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 ():

احيانا صحيح:

إذا كان uart2.any ():

user_id = "

كلمة المرور = "

آر إكس 2 = []

ركس_نوم = 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)

طباعة (data_id_st2)

إذا كانت data_id_st2 == 'edit1':

data_id_st3 = rx2 [15: data_end: 1]

data_id_st4 = ”.join (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 = ”.join (data_id_st5)

إذا كانت data_id_st6 == admin_password:

admin = صحيح

uart_write2 ("نجح التحقق!" ، "الرجاء وضع البطاقة!")

do_read2 (data_id_st4)

عائد أعلى

def mima_zuce ():

temp_id3 = "

temp_mima3 = "

احيانا صحيح:

إذا كان uart2.any ():

user_id = "

كلمة المرور = "

آر إكس 2 = []

ركس_نوم = 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 = ”.join (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 = ”.join (data_name)

طباعة (data_name2)

إذا كانت data_name2 == 'back2':

عائد أعلى

إذا كانت data_id_st2 == 'edit3':

data_id_st3 = rx2 [15: data_end: 1]

data_id_st4 = ”.join (data_id_st3)

طباعة (data_id_st4)

user_id_flag = صحيح

temp_id3 = data_id_st4

# members_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)

طباعة (data_id_st6)

# if members_ps.get (temp_id) == data_id_st6:

password_flag = صحيح

temp_mima3 = data_id_st6

# members_ps [temp_id] = password_flag

# طباعة (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):

admin = صحيح

staff_ps [temp_id3] = temp_mima3

password_flag = خطأ

user_id_flag = خطأ

uart_write4 ("نجح التحقق!" ، "تم تسجيل الدخول بنجاح!")

def password_loin ():

temp_id2 = "

temp_mima = "

احيانا صحيح:

إذا كان uart2.any ():

user_id = "

كلمة المرور = "

آر إكس 2 = []

ركس_نوم = 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 = ”.join (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 = ”.join (data_name)

طباعة (data_name2)

إذا كانت data_name2 == 'back4':

عائد أعلى

إذا كانت data_id_st2 == 'edit5':

data_id_st3 = rx2 [15: data_end: 1]

data_id_st4 = ”.join (data_id_st3)

طباعة (data_id_st4)

إذا كانت data_id_st4 في staff_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)

طباعة (data_id_st6)

طباعة (temp_id2)

طباعة (أفراد_بس)

if members_ps.get (temp_id2) == data_id_st6:

password_flag = صحيح

# طباعة (rx2 ، user_id_flag ، password_flag)

طباعة (user_id_flag، password_flag)

إذا (password_flag == صحيح) و (user_id_flag == صحيح):

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 ″،" visual ": 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 ″،" visual ": false}> ET')

uart2.sendbreak ()

احيانا صحيح:

إذا كان uart2.any ()> 1:

آر إكس 2 = []

data_name2 = "

bin_data = uart2.read (40)

# وقت النوم (1)

uart2.sendbreak ()

# وقت النوم (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)

طباعة (data_name2)

إذا كانت 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

من نظام التشغيل استيراد uname

فئة MFRC522:

حسنًا = 0

نوتيجر = 1

خطأ = 2

ريكيدل = 0x26

ريكال = 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 = دبوس (ميسو)

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، pin = (self.sck، self.mosi، self.miso))

لوحة elif == 'esp32':

self.spi = SPI (معدل البث بالباود = 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 (ذاتي ، 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)

قيمة العودة [0]

def _sflags (ذاتي ، reg ، قناع):

self._wreg (reg، self._rreg (reg) | قناع)

def _cflags (self، reg، mask):

self._wreg (reg، self._rreg (reg) & (~ mask))

def _tocard (self، cmd، send):

ريكف = []

بت = irq_en = wait_irq = n = 0

stat = self.ERR. ستات = self.ERR

إذا كان cmd == 0x0E:

irq_en = 0x12

wait_irq = 0x10

إليف كمد == 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)

I = 2000

احيانا صحيح:

n = self._rreg (0x04)

أنا - = 1

إذا كان ~ ((i! = 0) و ~ (n & 0x01) و ~ (n & wait_irq)):

استراحة

self._cflags (0x0D ، 0x80)

اذا انا:

إذا (self._rreg (0x06) & 0x1B) == 0x00:

stat = self. طيب

إذا كان n & irq_en & 0x01:

stat = self.NOTAAGERR

إليف كمد == 0x0C:

n = self._rreg (0x0A)

lbits = self._rreg (0x0C) & 0x07

إذا lbits! = 0:

بت = (ن - 1) * 8 + بت

آخر:

بت = ن * 8

إذا كان n == 0:

ن = 1

أليف ن> 16:

ن = 16

لـ _ في النطاق (n):

recv.append (self._rreg (0x09))

آخر:

stat = self.ERR. ستات = self.ERR

إرجاع stat ، recv ، بت

def _crc (self، data):

self._cflags (0x05 ، 0x04)

self._sflags (0x0A ، 0x80)

لـ c في البيانات:

self._wreg (0x09، c)

self._wreg (0x01، 0x03)

أنا = 0xFF

احيانا صحيح:

n = self._rreg (0x05)

أنا - = 1

إن لم يكن ((i! = 0) وليس (n & 0x04)):

استراحة

إرجاع [self._rreg (0x22) ، self._rreg (0x21)]

الحرف الأول (ذاتي):

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

إعادة تعيين def (ذاتي):

self._wreg (0x01، 0x0F)

def antenna_on (ذاتي ، تشغيل = صحيح):

إذا كان على و ~ (self._rreg (0x14) & 0x03):

self._sflags (0x14 ، 0x03)

آخر:

self._cflags (0x14 ، 0x03)

طلب def (self، mode):

self._wreg (0x0D ، 0x07)

(stat ، recv ، bits) = self._tocard (0x0C ، [الوضع])

إذا (stat! = self.OK) | (بت! = 0x10):

stat = self.ERR. ستات = self.ERR

عودة الإحصائيات بت

def anticoll (النفس):

سر_تشك = 0

ser = [0x93، 0x20]

self._wreg (0x0D ، 0x00)

(stat ، recv ، بت) = self._tocard (0x0C ، ser)

إذا كانت stat == self.OK:

إذا كان len (recv) == 5:

بالنسبة لي في النطاق (4،XNUMX):

ser_chk = ser_chk ^ recv [i]

إذا ser_chk! = recv [4]:

stat = self.ERR. ستات = self.ERR

آخر:

stat = self.ERR. ستات = 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، addr، Section، ser): def auth (self، mode، addr، Section، ser):

إرجاع self._tocard (0x0E ، [الوضع ، العنوان] + المقطع + ser [: 4]) [0]

def stop_crypto1 (ذاتي):

self._cflags (0x08 ، 0x08)

قراءة def (self، addr):

البيانات = [0x30 ، العنوان]

البيانات + = self._crc (بيانات)

(stat ، recv ، _) = self._tocard (0x0C ، بيانات)

عودة recv إذا كانت stat == self.OK else لا شيء

الكتابة def (self، addr، data):

buf = [0xA0 ، العنوان]

buf + = self._crc (buf)

(stat ، recv ، bits) = self._tocard (0x0C ، buf)

إن لم يكن (stat == self.OK) أو لا (bits == 4) أو لا ((recv [0] & 0x0F) == 0x0A):

stat = self.ERR. ستات = self.ERR

آخر:

بوف = []

بالنسبة لي في النطاق (16،XNUMX):

buf.append (البيانات [i])

buf + = self._crc (buf)

(stat ، recv ، bits) = self._tocard (0x0C ، buf)

إن لم يكن (stat == self.OK) أو لا (bits == 4) أو لا ((recv [0] & 0x0F) == 0x0A):

stat = self.ERR. ستات = self.ERR

عودة الإحصاء

المصدر: أفلاطون داتا إنتليجنس