如何使用NFC读卡器读取NFC卡片的UID?

方法1:

APDU命令FFCA000000 读取UID

ACR122U APDU Command
< FF CA 00 00 00
> 04 76 BF E1 BF 02 80 90 00


方法2:

因为Mifare UltraLight卡片的UID是在卡片的第一个page和第二个Page里面,所以我们可以直接读取page 1个page 2数据就好了。

ACR122U Read Page

< FF B0 00 00 04
> 04 76 BF 45 90 00
> Data Read at Start Page 00
> Number of Bytes Read: 04
>> Hex Mode: 04 76 BF 45

ACR122U Read Page
< FF B0 00 01 04
> E1 BF 02 80 90 00
> Data Read at Start Page 01
> Number of Bytes Read: 04
>> Hex Mode: E1 BF 02 80


参考1:

APDU "Read Binary Blocks command" 参考“ACR122U NFC Reader API.pdf”的5.3 Read Binary Blocks 章节
APDU "Get UID APDU"参考“ACR122U NFC Reader API.pdf”的4.1 PICC Commands for General Purposes章节


参考2:

What is a unique identifier number and what is it used for?
ISO/IEC 14443 Type A defines a Unique IDentifer to be used for card selection and activation. The standard defines single, double and triple size UIDs which correspondingly consist of 4, 7 and 10 Byte. In many contactless systems, the UID is not only used for card activation but also as a logical reference i.e. in a background system to the card itself

MIFARE Ultralight C
Unique 7 bytes serial number (UID)

MIFARE Plus
7 or 4 bytes UID. Optional supporting random UID


在 Android 11 中,可以使用 `NfcAdapter#enableReaderMode` 方法来启用应用程序的 NFC 读卡器模式。在这种模式下,当设备读取到支持 NFC 技术的标签时,应用程序将会接收到回调事件,可以在回调事件中访问标签上的数据。 要实现当读卡器读取手机 NFCUID 不变,可以在回调事件中使用 `IsoDep` 类来和标签进行通信。在与标签进行通信时,可以使用 `IsoDep#getHistoricalBytes` 方法来获取标签的历史字节,从而获得 UID 信息。 以下是一个示例代码: ```java public class MainActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback { private NfcAdapter nfcAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nfcAdapter = NfcAdapter.getDefaultAdapter(this); } @Override protected void onResume() { super.onResume(); enableReaderMode(); } @Override protected void onPause() { super.onPause(); disableReaderMode(); } private void enableReaderMode() { Bundle options = new Bundle(); options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 5000); nfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, options); } private void disableReaderMode() { nfcAdapter.disableReaderMode(this); } @Override public void onTagDiscovered(Tag tag) { IsoDep isoDep = IsoDep.get(tag); try { isoDep.connect(); byte[] historicalBytes = isoDep.getHistoricalBytes(); if (historicalBytes != null) { String uid = bytesToHex(Arrays.copyOfRange(historicalBytes, 2, 10)); Log.d("MainActivity", "UID: " + uid); } } catch (IOException e) { e.printStackTrace(); } finally { try { isoDep.close(); } catch (IOException e) { e.printStackTrace(); } } } private static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte aByte : bytes) { sb.append(String.format("%02X", aByte)); } return sb.toString(); } } ``` 在上述代码中,我们首先在 `onResume` 方法中启用了 NFC 读卡器模式,并在 `onPause` 方法中禁用了该模式。在 `onTagDiscovered` 方法中,我们使用 `IsoDep` 类与标签进行通信,并在回调事件中获取标签的历史字节。最后,我们从历史字节中提取 UID 信息,并打印到日志中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值