步驟1:安裝驅動
1. 下載驅動:
? ?- 訪問ACS官網的驅動下載頁面:[ACR122U驅動下載](https://www.acs.com.hk/en/drivers/6/acr122u-nfc-reader/)。
? ?- 選擇適用于Windows的驅動(如 ACR122U Driver (Windows) V3.05.02.zip)。
2. 安裝驅動:
? ?- 解壓下載的壓縮包,運行 Setup.exe。
? ?- 按照向導完成安裝。
? ?- 插入ACR122U讀卡器,Windows會自動識別并加載驅動。
3. 驗證設備識別:
? ?- 打開 設備管理器,檢查是否有 ACS ACR122U PICC Interface或類似設備,無感嘆號即表示驅動正常。
步驟2:安裝Python庫
使用 pyscard?庫(基于PC/SC標準):
pip install pyscard
步驟3:編寫Python代碼
# 基礎代碼(讀取卡片UID)
from smartcard.System import readers
from smartcard.util import toHexString
# 獲取所有讀卡器列表
reader_list = readers()
if not reader_list:
? ? print("未檢測到讀卡器!請檢查設備連接。")
? ? exit()
# 選擇第一個讀卡器(通常為ACR122U)
reader = reader_list[0]
print("已連接讀卡器:", reader)
# 建立連接
connection = reader.createConnection()
try:
? ? connection.connect()
? ? print("讀卡器連接成功!")
except Exception as e:
? ? print("連接失敗:", e)
? ? exit()
# 定義獲取UID的APDU指令(ACS ACR122U專用)
GET_UID_APDU = [0xFF, 0xCA, 0x00, 0x00, 0x00]
# 發送指令并獲取響應
data, sw1, sw2 = connection.transmit(GET_UID_APDU)
# 檢查響應狀態碼
if sw1 == 0x90 and sw2 == 0x00:
? ? print("卡片UID:", toHexString(data))
else:
? ? print("讀取失敗,狀態碼:", hex(sw1), hex(sw2))
?
步驟4:讀取MIFARE Classic卡片數據
# 定義塊號和密鑰(默認密鑰為6個0xFF)
BLOCK_NUMBER = 4
KEY = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
# 1. 發送認證指令
AUTH_APDU = [
? ? 0xFF, 0x86, 0x00, 0x00,
? ? 0x05, 0x01, 0x00, BLOCK_NUMBER, 0x60, 0x00
] + KEY
# 合并密鑰到指令
auth_data, auth_sw1, auth_sw2 = connection.transmit(AUTH_APDU)
if auth_sw1 != 0x90:
? ? print("認證失敗!請檢查密鑰或塊號。")
? ? exit()
# 2. 讀取塊數據
READ_APDU = [0xFF, 0xB0, 0x00, BLOCK_NUMBER, 0x10]
data, sw1, sw2 = connection.transmit(READ_APDU)
if sw1 == 0x90:
? ? print(f"塊 {BLOCK_NUMBER} 數據:", toHexString(data))
else:
? ? print("讀取失敗,狀態碼:", hex(sw1), hex(sw2))
步驟5:輪詢檢測卡片(持續監控)
import time
while True:
? ? try:
? ? ? ? # 重新連接讀卡器(檢測卡片狀態變化)
? ? ? ? connection.reconnect()
? ? ? ? data, sw1, sw2 = connection.transmit(GET_UID_APDU)
? ? ? ? if sw1 == 0x90:
? ? ? ? ? ? print("檢測到卡片,UID:", toHexString(data))
? ? ? ? else:
? ? ? ? ? ? print("未檢測到卡片")
? ? except Exception as e:
? ? ? ? print("通信錯誤:", e)
? ? time.sleep(1) # 每秒檢測一次
?
完整示例代碼
# 保存為 `acr122u_read.py`
from smartcard.System import readers
from smartcard.util import toHexString
import time
def main():
? ? # 獲取讀卡器
? ? reader_list = readers()
? ? if not reader_list:
? ? ? ? print("未檢測到讀卡器!")
? ? ? ? return
? ? reader = reader_list[0]
? ? print("已連接讀卡器:", reader)
? ? # 連接讀卡器
? ? connection = reader.createConnection()
? ? try:
? ? ? ? connection.connect()
? ? except Exception as e:
? ? ? ? print("連接失敗:", e)
? ? ? ? return
? ? # 持續輪詢檢測卡片
? ? GET_UID_APDU = [0xFF, 0xCA, 0x00, 0x00, 0x00]
? ? while True:
? ? ? ? try:
? ? ? ? ? ? connection.reconnect()
? ? ? ? ? ? data, sw1, sw2 = connection.transmit(GET_UID_APDU)
? ? ? ? ? ? if sw1 == 0x90 and sw2 == 0x00:
? ? ? ? ? ? ? ? print("檢測到卡片,UID:", toHexString(data))
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print("等待卡片靠近...")
? ? ? ? ? ? time.sleep(1)
? ? ? ? except KeyboardInterrupt:
? ? ? ? ? ? print("已退出")
? ? ? ? ? ? break
? ? ? ? except Exception as e:
? ? ? ? ? ? print("錯誤:", e)
if __name__ == "__main__":
? ? main()
運行方法
1. 保存代碼為 .py文件(如 nfc_reader.py)。
2. 打開命令行,運行:
? ?python nfc_reader.py
3. 將NFC卡片靠近讀卡器,觀察輸出結果。
通過以上步驟,你可以在Windows系統下使用Python成功采集ACS ACR122U NFC讀卡器的數據!