مقدمة مختصرة
أصبح المنزل الذكي أكثر شيوعًا مع تطور التكنولوجيا ، وستركز هذه المقالة على الجوانب الأمنية لمشروع التحكم الذكي في الوصول.
تستخدم هذه المقالة شاشة تعمل باللمس STONE لإرسال أوامر إلى MCU للتحكم في وحدة الترحيل ووحدة MFRC522.
مبدأ قراءة البطاقة: من خلال تشغيل وحدة RFID-RC522 ، حدد معرف بطاقة الهوية بالقرب من بطاقة الهوية ، ثم تحديد ما إذا كان المعرف موجودًا في قاعدة بيانات كلمة نموذجية ، ID هو القيمة النموذجية للكلمة ، إذا كان وجود التحقق من خلال ، ثم اطبع الاسم المقابل ، ثم قم بتشغيل القفل الكهرومغناطيسي بنفس الطريقة.
المواد المطلوبة
- ESP32
- قفل إلكتروني KOB
- المرحل
- STONE STWI070WT-01 شاشة تعمل باللمس
- وحدة MFRC522
الوظيفة المحققة
- تسجيل البطاقة.
- تسجيل اسم المستخدم وكلمة المرور.
- انتقاد البطاقة لفتح القفل الإلكتروني.
- اسم المستخدم وكلمة المرور لفتح القفل الإلكتروني.
وصف الجهاز الرئيسي
وحدة ار إف أي دي-RFID
يمكن تحميل هذه الوحدة مباشرة في وحدات قارئ مختلفة. يستخدم جهد 3.3 فولت ، من خلال واجهة SPI ببضعة أسلاك. متصلة مباشرة باللوحة الأم لوحدة المعالجة المركزية ، يمكن للوحدة أن تعمل بطريقة مستقرة وموثوقة كقارئ لبطاقات المسافة.
تم تصميم STWI070WT-01 كشاشة TFT ووحدة تحكم باللمس. يتضمن المعالج ، برنامج التحكم ، برنامج التشغيل ، ذاكرة فلاش ، منفذ RS232 / RS422 / RS485 / TTL / LAN ، Wi-Fi / Bluetooth ، شاشة تعمل باللمس ، مصدر طاقة وما إلى ذلك ، لذلك فهو نظام عرض كامل يعتمد على القوة والسهولة نظام التشغيل ، والذي يمكن التحكم فيه عن طريق Any MCU.
تصميم واجهة المستخدم الرسومية
مشاركه الرمز
استيراد 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
عودة الإحصاء
المصدر: أفلاطون داتا إنتليجنس