Не удается прочитать карту с помощью считывателя NFC/RFID через Python

Я купил устройство чтения карт NFC (ACS / ACR122U), которое я подключаю к своей малине 3 через порт USB; Я установил swig, pcsc-tools, pcscd, libpcsclite... Служба pcscd запускается с помощью systemctl и привязана к pcscd.socket. Я вижу считыватель при запуске nfc-scan-device, а также могу прочитать карту, прилагаемую к считывателю, при запуске nfc-list Затем я пытаюсь прочитать идентификатор тега с помощью python3 и pyscard, и это не работает. Я вижу считыватель и запускаю соединение без каких-либо сообщений об ошибках, но не могу прочитать tagID.

sudo nfc-list возвращает:

>nfc-list uses libnfc 1.7.1
>NFC device: ACS / ACR122U PICC Interface opened
>1 ISO14443A passive target(s) found:
>ISO/IEC 14443A (106 kbps) target:
>ATQA (SENS_RES): 00  04  
>UID (NFCID1): d6  71  c5  f0  
>SAK (SEL_RES): 08`  

Таким образом, устройство чтения карт NFC доступно, и я даже могу получить идентификатор карты

Затем я пытаюсь использовать его на python. Я нашел там некоторую информацию: https://pyscard.sourceforge.io/user-guide.html https://pyscard.sourceforge.io/epydoc/smartcard-module.html

Сначала я попробовал это в среде pipenv, но это не сработало. Затем я удалил pipenv, чтобы убедиться, что он не находится на критическом пути...

первый тест

Я пробую базовый скрипт, который можно найти в документации pyscard и в большинстве руководств... назовем его nfcReader-1.py.

from smartcard.System import readers
import sys

getuid=[0xFF, 0xCA, 0x00, 0x00, 0x00]
r = readers()
if len(r) < 1:
  print("error: No readers available!")
  sys.exit()

print("Available readers: ", r)
reader = r[0]
print("Using: ", reader)
conn = reader.createConnection()
conn.connect()
data, sw1, sw2 = conn.transmit(getuid)
if (sw1, sw2) == (0x90, 0x0):
  print("Status: The operation completed successfully.")
elif (sw1, sw2) == (0x63, 0x0):
  print("Status: The operation failed.")

print("uid={}".format(data))
conn=disconnect()
r=None  #to prevent error messages when calling sys.exit() below
sys.exit()

>Available readers:  ['ACS ACR122U PICC Interface 00 00']
>Using:  ACS ACR122U PICC Interface 00 00
>Status: The operation failed.
>uid=[]

считыватель найден, но я не могу прочитать карту. Метод send() возвращает [0x63,x0x00] ([99,00]), что означает, что произошло что-то странное. Он не работает ни при вводе каждой команды в командной строке python

ВТОРОЕ ИСПЫТАНИЕ

Я тоже пробую другой способ. Я нашел этот второй метод в документе pyscard, но результат точно такой же:

from smartcard.CardType import AnyCardType
from smartcard.CardRequest import CardRequest
from smartcard.CardConnection import CardConnection
from smartcard.util import toHexString

import sys
getuid=[0xFF, 0xCA, 0x00, 0x00, 0x00]
act = AnyCardType()
cr = CardRequest( timeout=10, cardType=act )
cs = cr.waitforcard()
cs.connection.connect()

print(toHexString( cs.connection.getATR() ))
print(cs.connection.getReader())
data, sw1, sw2 = cs.connection.transmit( cmdmap['getuid'] )
if (sw1, sw2) == (0x90, 0x0):
  print("Status: The operation completed successfully.")
elif (sw1, sw2) == (0x63, 0x0):
  print("Status: The operation failed.")

print("uid={}".format(data))
cs=None  #to prevent error message when calling sys.exit() below
sys.exit()

ответ не отличался:

>3B 00
>ACS ACR122U PICC Interface 00 00
>Status: The operation failed.
>uid=[]

Я использовал команду [0xFF, 0xCA, 0x00, 0x00, 0x00], которая, кажется, является той, которая получает tagid. Документ для чтения ACS (https://www.acs.com.hk/en/download-manual/419/API-ACR122U-2.04.pdf) подтверждает, что это правильная последовательность. Описание последовательности тегов ACS

По крайней мере, я пытаюсь запустить свой скрипт на Python с помощью sudo на случай, если это поможет. и я меняю права доступа к папке сокета (/var/run/pcscd/pcscd.comm) на 777... на всякий случай

Кто-нибудь знает, как я могу решить эту странную проблему? Спасибо за вашу помощь.


person David    schedule 22.05.2019    source источник
comment
...Я могу заставить ридер пищать, используя следующую последовательность: [0xFF,0x00,0x40,0x00,0x04,0x01,0x00,0x03,0x03]   -  person David    schedule 22.05.2019
comment
Чтобы исключить проблему с pyscard, вы можете использовать scriptor/gscriptor из pscsc-tools для отправки APDU на устройство чтения карт.   -  person arved    schedule 24.05.2019
comment
Это известное ограничение некоторых версий ACR122U. Читатель не обрабатывает/нумерует теги автоматически. Вместо этого вам нужно будет использовать команду DIRECT TRANSMIT (APDU формы FF000000<Lc><PN532-command>) для отправки необработанных команд на встроенный чип PN532 для опроса тегов и доступа к ним. Это также то, что делает libnfc.   -  person Michael Roland    schedule 28.05.2019
comment
@MichaelRoland Я новичок в этом, поэтому не могли бы вы объяснить простыми словами, как это сделать?   -  person Asad Mehasi    schedule 21.02.2021
comment
@David Тебе удалось это решить? Я столкнулся с точно такой же проблемой.   -  person Asad Mehasi    schedule 21.02.2021
comment
Не берите в голову, ребята, мне удалось решить проблему.   -  person Asad Mehasi    schedule 27.02.2021


Ответы (1)


У меня была такая же проблема с устройством чтения карт NFC (ACS / ACR122U), которое я просто хотел подключить к ПК в Windows 10, чтобы прочитать идентификатор, сохраненный на карте клиента. Мне удается решить это, заменив:

  • data, sw1, sw2 = cs.connection.transmit( cmdmap['getuid'] )

с участием

  • data, sw1, sw2 = cs.connection.transmit(getuid)

Причина в том, что вы не определили cmdmap и просто прочитать данные даже не нужно.

После этого я хотел преобразовать данные, решение:

  • data = toHexString(data)

Обратите внимание, что в моем случае эти данные были в обратном порядке, но это легко решить.

person Asad Mehasi    schedule 28.02.2021