Я купил устройство считывания карт NFC (ACS / ACR122U), которое я подключаю к своей Rasberry 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 doc, и большинство учебных пособий ... давайте назовем его 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=[]
читатель найден, но я не могу прочитать карточку. Метод trans () возвращает [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 Reader (https://www.acs.com.hk/en/download-manual/419/API-ACR122U-2.04.pdf) подтверждает, что это правильная последовательность.
![ACS tagid sequence description](https://i.stack.imgur.com/hxEi7.png)
По крайней мере, я пытаюсь запустить свой скрипт на Python, используя sudo на случай, если это может помочь. и я изменяю разрешения для папки сокета (/var/run/pcscd/pcscd.comm) на 777 ... на всякий случай
Кто-нибудь знает, как я могу решить эту странную проблему?
спасибо за вашу помощь.