Ошибка чтения / изменения двоичного блока RF-TAG с использованием считывателя RF - PullRequest
0 голосов
/ 10 июня 2019

Я разработчик в Корее. Я создал программу, которая использует Python Pyscard и Tkinter для обновления или запроса двоичных блоков в RF-тегах. Эта программа работает хорошо. Однако иногда двоичный блок на карте меняется на 0 или 255. Это происходит, главным образом, когда карта извлекается быстро или когда карта читается нестабильно. RF-считыватель выдаст флаг сбоя обновления, но двоичный блок уже инициализирован равным 0 или 255. Интересно, есть ли способ предотвратить это? У кого-нибудь есть похожие симптомы?

Ресурсы, использованные в проекте

RF считыватель: ACS-1256U

Python: 3,6

ОС: Raspberry Pi 3b + / Raspbian - Stretch

Мы реализовали простую транзакцию для повторного чтения двоичного блока при сбое, но операция чтения двоичного блока завершилась неудачно, и транзакция не может быть реализована.

class transmitobserver(CardObserver):
    UID_BYTE = [0xFF, 0xCA, 0x00, 0x00, 0x04]  # uid byte
    LOAD_KEY_SELECT = [0xFF, 0x82, 0x00, 0x00, 0x06]  # load key select

    AUTH_SELECT = [0xFF, 0x86, 0x00, 0x00, 0x05]  # auth select
    AUTH_DF = [0x01, 0x00, 0x00, 0x60, 0x00]  # auth df

    READ_BINARY_SELECT = [0xFF, 0xB0, 0x00, 0x01, 0x10]  # read binary block select

    UPDATE_BINARY_SELECT = [0xFF, 0xD6, 0x00, 0x01, 0x10]  # update binary block select

    def __init__(self):
        self.cards = []

    def update(self, observable, actions):
        key = "00000000"
        arg1 = int(key[0:2], 16)
        arg2 = int(key[2:4], 16)
        arg3 = int(key[4:6], 16)
        arg4 = int(key[6:8], 16)
        arg5 = int(key[8:10], 16)
        arg6 = int(key[10:12], 16)

        LOAD_KEY_DF = [arg1, arg2, arg3, arg4, arg5, arg6]  #load key set
        (addedcards, removedcards) = actions

        for card in addedcards:
            if card not in self.cards:
                self.cards += [card]
                try:
                    r = readers()
                    if str(card.reader) == str(r[0]):
                        card.connection = card.createConnection()
                        card.connection.connect()
                        serial_number, sw1, sw2 = card.connection.transmit(self.UID_BYTE)

                        if serial_number and len(serial_number) > 2:
                            response, is_load_key, sw2 = card.connection.transmit(self.LOAD_KEY_SELECT + LOAD_KEY_DF)  # LOAD KEY

                            # LOAD KEY success
                            if is_load_key == 144:
                                response, is_authentication, sw2 = card.connection.transmit(self.AUTH_SELECT + self.AUTH_DF)  # AUTHENTICATION

                                # AUTHENTICATION success
                                if is_authentication == 144:
                                    binary_block, sw1, sw2 = card.connection.transmit(self.READ_BINARY_SELECT)  # read Number 1 binary block

                                    if binary_block and len(binary_block) > 2:
                                        set_req_byte = [0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0xAA, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

                                        # update binary block !!!!!@@@@@ prob code @@@@@@!!!!!
                                        response, set1, set2 = card.connection.transmit(self.UPDATE_BINARY_SELECT + set_req_byte)

                                        if set1 == 144:
                                            # success update binary block
                                            # read binary block
                                            response, sw1, sw2 = card.connection.transmit(self.READ_BINARY_SELECT)
                                            card.connection.disconnect()
                                        else:
                                            # failed update binary block
                                            # read binary block
                                            # then binary block has 0 or 255
                                            response, sw1, sw2 = card.connection.transmit(self.READ_BINARY_SELECT)
                                            print(response) # response has [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] or [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ]
                                            card.connection.disconnect()
                                    else:
                                        card.connection.disconnect()
                                else:
                                    card.connection.disconnect()
                            else:
                                card.connection.disconnect()
                        else:
                            pass
                except Exception as e:
                    print(e) #not except


        for card in removedcards:
            if card in self.cards:
                self.cards.remove(card)

При чтении карты двоичный блок становится 0 или 255.

...