Nexus 4 读取 Mifare Classic 卡 UID
Posted
技术标签:
【中文标题】Nexus 4 读取 Mifare Classic 卡 UID【英文标题】:Nexus 4 read Mifare Classic card UID 【发布时间】:2013-06-04 07:25:49 【问题描述】:目前我们正在开发适用于 android 的 NFC 应用程序。我们的经验
使用 NXP PN5xx 芯片开发的 POS NFC 控制系统,用于控制 Mifare Classic (1K) 和 CEPAS 标准
为 Galaxy Nexus 中的 MiFareClassic 和 Ultralight C 开发 Android NFC 控制系统(使用 NXP NFC 芯片组)
为 Nexus 4 中的 Ultralight C 开发 Android NFC 控制系统
我们的挑战:我们想在我们的 POS 机(带有 NXP 芯片)和新的 Android 平板电脑(带有 Broadcom 芯片)中控制 MiFareClassic 1K 卡,我们已经安装了卡库,无法替换它们。
-我们知道Nexus 4已经改变了NFC芯片,现在除了UID之外它不能读/写任何Mifare经典卡块。
- 我们的代码将 Mifare 经典卡检测为 NfcA 类型。 NfcA 有一个叫做transceive(byte[] data) 的方法将原始的 NFC-A 命令发送到标签并接收响应。
- 我们的问题是我们需要知道发送什么代码到设备来读取UID,网上其他人说可以但是找不到方法
目前我们总是报错:android.nfc.TagLostException: Tag was lost.
感谢您的回答。
【问题讨论】:
【参考方案1】:您无法使用 Nexus 4 中的 Broadcom 芯片与 Mifare Classic 芯片通话。
您可以读取 UID。这是与 NfcA 兼容的 Mifare Classic 协议的一部分。
除此之外,还需要实施 Broadcom 芯片(以及许多其他即将推出的 NFC 控制器)所缺乏的 Mifare Classic Crypto1 算法。
在软件中运行 Crypto1(源代码在***上)也不是一种选择,因为 Mifare Classic 的身份验证请求将要求芯片发送与 NfcA 不兼容的帧。
【讨论】:
Nils,我同意你的看法。如何读取 UID?这是我的问题。你有任何示例代码吗?你可以看到我收到一个错误,它在我上面的 OP 中。【参考方案2】:您可以在 Intent 中的 Tag 对象上调用 getId()
。这将返回标签的 ID(在 MIFARE Classic 的情况下,可能是 4 或 7 字节的唯一 ID、随机 ID 或固定的非唯一 4 字节 ID;取决于确切的 MIFARE Classic产品)。
无需在NfcA
上致电connect()
(也无法做任何有意义的事情)。
请注意,这不适用于三星 Galaxy S4。当点击 MIFARE 标签时,该手机不会发送 NFC 意图。相反,它会在屏幕上显示一条错误消息,指出手机与该标签不兼容,然后忽略该标签。
更新: 在运行 Android 4.4 KitKat 的 S4 上,您可以使用 NFC 阅读器模式来访问卡 UID 等详细信息,也可以访问 MIFARE Classic 标签。
【讨论】:
您好,朋友在S4上用NFC tools
的app测试了一张Mifare 1K卡,app成功检测到了序列号(本例为UID)。你知道这是怎么做到的吗?谢谢。【参考方案3】:
好吧,调度器已经设置好了,你可以在你的活动中使用它:
private String serialId = "";
@Override
public void onNewIntent(Intent intent)
String action = intent.getAction();
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action))
try
byte[] tagId = tag.getId();
serialId = bytesToHex(tagId);
Log.d("[ReadCardTools]", "Serial Number: " + result);
catch (NullPointerException ex)
ex.printStackTrace();
serialId = "ERROR";
else
Toast.makeText(this, "This tag is not supported. Action: " + action, Toast.LENGTH_LONG).show();
private String bytesToHex(byte[] bytes)
char[] hexChars = new char[bytes.length * 2];
int v;
for (int j = 0; j < bytes.length; j++)
v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[(j * 2) + 1] = hexArray[v & 0x0F];
return new String(hexChars);
【讨论】:
以上是关于Nexus 4 读取 Mifare Classic 卡 UID的主要内容,如果未能解决你的问题,请参考以下文章
.NET - 通过 NFC 阅读器读取 Mifare Classic。恩智浦与博通阅读器
将 javax.smartcardio 用于 MIFARE Classic 和 Omnikey 5021 CL
Mifare Classic一操作就显示。 错误: 这不是一张MIFARE CLASSIC卡片。