Skip to main content

ACR122U — USB NFC Reader 完整說明

一句話定位:ACR122U 是 ACS 最經典、最廣為人知的 PC/SC 感應讀卡機。它把 ISO 14443 Type A/B、MIFARE、FeliCa 與 NFC (ISO 18092) 卡片/標籤變成標準 USB 讀卡機,開源社群(libnfc、pyscard、mfoc...)支援最完整,是大學生專題與 MIFARE 研究的最佳起點。

它是「讀卡機界的 Arduino」——便宜、到處買得到、任何 PC/SC 程式都能用、且是這三顆裡唯一有 libnfc 直連 driver 的型號(這在開發上有巨大優勢,後面「進階應用」會講)。

開箱與外觀

  • 主體:98.0 × 65.0 × 12.8 mm,珍珠白塑膠外殼,70 g。
  • 天線:主體下方內建 50 × 40 mm 天線,卡片直接放上頂面即可(讀距最遠 50 mm)。
  • LED:1 顆雙色 LED(紅/綠),可由軟體控制。
  • 蜂鳴器:單音,可由軟體控制。
  • 連接線:固定式 USB Type-A 線,長 1 m,不可拆。

讀卡成功時 LED 通常會閃綠、並發出一聲嗶——這是「讀到了」最直接的訊號。

規格總覽

項目規格
晶片/核心NXP PN532(13.56 MHz)
支援標準/卡片ISO/IEC 18092 NFC、ISO 14443 Type A & B、MIFARE Classic®、MIFARE Ultralight®、FeliCa
作業頻率13.56 MHz
讀寫速度106 / 212 / 424 kbps(NFC 標籤)
USB 介面USB 2.0 Full Speed(12 Mbps)、CCID compliant
讀距最遠 50 mm(依卡片類型而定)
防碰撞內建(同一時間只存取一張卡)
供電由 USB 供電,典型 100 mA / 最大 200 mA,5 V
尺寸/重量98.0 × 65.0 × 12.8 mm / 70 g
APIPC/SC、CT-API(透過 PC/SC wrapper)
認證ISO 14443、PC/SC、CCID、CE、FCC、KC、VCCI、RoHS、Microsoft WHQL
USB Vendor/Product ID072F:2200
系統支援Windows、Linux、macOS、Solaris、Android 3.1+
官方文件ACR122U 產品頁API 手冊 (PDF)

這顆能做什麼、不能做什麼

能力說明
✅ 讀/寫 MIFARE Classic、Ultralight可搭配 libfreefare / nfc-mfclassic 使用
✅ 讀/寫 ISO 14443-4 卡片走標準 PC/SC APDU
✅ 讀/寫 FeliCa、ISO 18092 NFC 標籤走 pseudo-APDU
✅ 卡號(UID)讀取最常用的操作,幾行程式碼
❌ 卡片模擬(Card Emulation)本顆為 Reader/Writer 用途,非模擬
❌ ISO 15693這顆不支援(需 ACR1552U)
❌ SAM 安全插槽這顆沒有(ACR1252U/1552U 才有)

安裝與驅動

先把安裝流程看成一條管線,跟著做即可:

最重要的第一步:內核模組衝突

Linux 內核的 pn533 / pn533_usb 模組會自動認領 ACR122U(因為它內建 PN532 晶片),導致 libnfc 或 pcsc 拿不到裝置。大多 Linux 上的 ACR122U 問題都源自這裡。先黑名單這幾個模組再繼續。

方法 A(建議先試):標準 PC/SC — pcscd + pcsc_scan

這是最「標準」的路,也是 macOS/Windows 原生走的路,程式相容性最好。

Step 1:安裝 PC/SC 套件(Debian/Ubuntu)

sudo apt update
sudo apt install -y pcscd pcsc-tools libpcsclite-dev

Step 2:確認 pcscd 有在跑

ps aux | grep pcscd

預期你會看到一個 pcscd 行程(/usr/sbin/pcscd)。若沒有,啟動它:

sudo systemctl enable --now pcscd
sudo systemctl status pcscd

Step 3:插入讀卡機並列出來

pcsc_scan

按住不放執行,插入讀卡機(或已插入就重新插一次),預期輸出:

Scanning present readers...
0: ACS ACR122U PICC Interface 00 00
...

現在把一張感應卡放到讀卡機上,pcsc_scan 會即時印出卡片資訊:

Friday, August 21, 2026 10:00:00
Reader 0: ACS ACR122U PICC Interface 00 00
Card state: Card inserted,
ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A

看到 "Card inserted" + ATR 就代表整條 PC/SC 管線通了。按 Ctrl+C 離開。

ATR 是什麼?

ATR(Answer To Reset)是卡片接上後第一個回傳的位元組串,像卡片的「自我介紹」。不同卡片會有不同 ATR,可拿來初判卡片類型。

Step 4(可選):用 opensc-tool 發一道 APDU

sudo apt install -y opensc
opensc-tool -l

預期列出一台讀卡機 ACS ACR122U PICC Interface。放上卡片後抓 UID:

opensc-tool --atr # 印 ATR
opensc-tool --reader 0 -s 00:A4:04:00:07:D2:76:00:00:85:01:00 # 選 AID(MIFARE 常用)

方法 B:libnfc 直連(進階、推薦給開發者)

ACR122U 有專屬的 libnfc 直連 driver acr122_usb,不需 pcscd,速度更直接,且能用大量開源工具(mfocmfcuknfc-mfclassic)。

Step 1:黑名單內核模組(關鍵!)

echo -e 'blacklist pn533\nblacklist pn533_usb\nblacklist nfc' | sudo tee /etc/modprobe.d/blacklist-libnfc.conf
sudo rmmod pn533_usb pn533 nfc 2>/dev/null # 若已載入,卸載
warning

rmmod 只有在模組已載入時才有意義,卸載失敗的錯誤訊息可忽略。重插一次讀卡機讓黑名單生效。若已拔插仍被認領,重開機即可。

Step 2:安裝 libnfc 與工具

sudo apt install -y libnfc-dev libnfc-bin libmfoc libfreefare-bin

Step 3:驗證讀卡機被 libnfc 認得

nfc-list

預期輸出:

nfc-list uses libnfc 1.8.0
NFC device: ACS / ACR122U PICC Interface opened
1 NFC device(s) found:
- ACS / ACR122U PICC Interface:
acr122_usb:001:008

放一張卡上去再跑一次,預期多了卡片資訊(NFC-AUID 等)。看到 NFC device: ... opened 就是成功。

Step 4(可選):確認無 pcsc 佔用

若同時有 pcscd 在跑,兩者會搶裝置。不想用 pcsc 時可停掉:

sudo systemctl stop pcscd

兩條路怎麼選?

情境用哪條
只要標準 PC/SC、跨平台、跟現有軟體相容方法 A(pcscd)
要研究 MIFARE、用 mfoc/mfcuk、開發自己韌體層邏輯方法 B(libnfc)
我想兩者並存可以,但同時只能一個佔用裝置——跑 libnfc 前先停 pcscd

快速開始:3 行 Python 讀卡號

安裝 pyscard(PC/SC 的 Python 綁定):

pip install pyscard

放上卡片,執行:

import smartcard
from smartcard.System import readers

r = readers()
print("Readers:", r)

connection = r[0].createConnection()
connection.connect()
# GET UID (0xFF 0xCA 0x00 0x00 0x04)
try:
data, sw1, sw2 = connection.transmit([0xFF, 0xCA, 0x00, 0x00, 0x04])
print("UID:", data)
print(f"Status words: {sw1:02X} {sw2:02X}")
except Exception as e:
print("Error:", e)

預期輸出(UID 依卡片不同):

Readers: ['ACS ACR122U PICC Interface 00 00']
UID: [4, 165, 60, 138, 185, 79, 128]
Status words: 90 00
  • 90 00 = 成功(無錯誤)。
  • UID 是卡片的唯一識別碼——這是最常被拿來做「卡號當身分」的基礎。

相容性

平台支援備註
Windows 10/11內建 Microsoft CCID/PC/SC 驅動,免裝 ACS 驅動即插即用
Linux (Kali/Ubuntu)建議黑名單 pn533 模組;pcscd 或 libnfc 皆可
macOS內建 PC/SC,pcsc_scan 可直接用;可搭 pyscard
Android 3.1+⚠️需 ACS Android Library,非免驅動
瀏覽器⚠️Web NFC API 只支援 Chrome on Android;桌面瀏覽器需 PC/SC bridge(見 ACR1252U 的 Web NFC 章節)

疑難排解

1. nfc-list 說「No NFC device found」但有接

  • 原因:多半是 pn533_usb 內核模組搶走了裝置。
  • 解法:執行方法 B 的 Step 1(黑名單 + rmmod),重插或重開機,再用 nfc-list 檢查。

2. pcsc_scan 列不到讀卡機

  • 原因pcscd 沒跑,或裝置權限不足(少數桌面環境)。
  • 解法sudo systemctl start pcscd;若權限問題,確認使用者身處能被 udev 允許的群組(通常 default 即可)。

3. libnfc 報 Device or resource busy

  • 原因:pcscd(或 pn533 模組)正佔用讀卡機。
  • 解法sudo systemctl stop pcscd(並確認模組已卸載),再跑 nfc-list

4. LED 一直紅、讀卡不嗶

  • 原因:卡片放歪、超過讀距,或該卡與讀卡機不相容(例如 ISO 15693 卡,ACR122U 不支援)。
  • 解法:確認卡片平放於天線正上方、距離 ≤ 50 mm;換一張支援的卡測。

5. pcsc_scan 出現大量重複 ATR / 瞬間插拔

  • 原因:USB 供電不穩或 udev 權限抖動。
  • 解法:換一條原廠線、插主機板後方的 USB 埠(避免 HUB)。

相關資源