Я недавно купил ACR122U у здесь . Я пытаюсь перевести его в режим эмуляции карты, чтобы он взаимодействовал с системой под управлением PN7150 в режиме инициатора.
Мне удалось связаться с устройством PN532 I C ( руководство пользователя). ); отправка базовых c команд, например, получение статуса, версии FW и т. д. c ...
Я не могу перевести его в режим эмуляции карты. Ниже приведен очень простой скрипт python, который я использую, чтобы попытаться сделать это:
from smartcard.System import *
from smartcard import util
'''
Command Application Protocol Data Units
C-APDU Structure:
[ Class + Instruction + Param_1 + Param_2 + Data Length + Data ]
'''
# ACS Direct Transmit Header - [ Class + Instruction + Param_1 + Param_2 ] #
ACS_DIRECT_TRANSMIT = [ 0xFF, 0x00, 0x00, 0x00 ]
# PN532 COMMANDS - [ Data Length + Data ] #
PN532_CMDS = {
'GET_READER_FW_VERSION' : [ 0x02, 0xD4, 0x02 ],
'GET_READER_STATUS' : [ 0x02, 0xD4, 0x04 ],
# Enable ISO/IEC 14443-4 PICC emulation & automatic RATS #
'SET_PARAMETERS' : [ 0x03, 0xD4, 0x12, 0x30 ],
'CONFIGURE_CE_MODE' : [
0x27, # Data Length
0xD4, 0x8C, # Command header
0x05, # Mode - PICC/Passive
0x04, 0x00, # ATQA
0x12, 0x34, 0x56, # UID: Last 3 bytes
0x20, # SAK
# =====[ Unused ] ===== #
# FeliCa Params #
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
# ATR Bytes #
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
# ===== [ Unused ] ===== #
0x00, # General Bytes Length.
0x00 # Historical Bytes Length.
]
}
def printResponseApdu(data, sw1, sw2):
data = util.toHexString(data)
status = util.toHexString([sw1, sw2])
print(f"R-APDU << Data:{data} Status:{status}")
def main():
scReaders = readers()
print("Available readers:", scReaders)
reader = scReaders[0]
print("Using:", reader)
connection = reader.createConnection()
connection.connect()
print("Connection Established!")
respData, sw1, sw2 = connection.transmit(ACS_DIRECT_TRANSMIT + PN532_CMDS['CONFIGURE_CE_MODE'])
printResponseApdu(respData, sw1, sw2)
if __name__ == "__main__":
main()
Это приводит к ошибке:
...
sw1 = (response[-2] + 256) % 256
IndexError: list index out of range
Я предполагаю, что это означает, что ответ не получен, и я не думаю, что это проблема драйвера, потому что другие команды работают просто отлично.
Любое понимание будет с благодарностью.