如何在其读取中获取自定义 NFC 标签?
How to get a custom NFC tags in its read?
我正在尝试为将复制 NFC 标签的智能手机创建一个应用程序。我遇到了在某些情况下无法为标签类型添加标签的问题。
有一个方法:
/**
* Callback when a new tag is discovered by the system.
* <p>
* <p>Communication with the card should take place here.
*
* @param tag Discovered tag
*/
@Override
public void onTagDiscovered(Tag tag) {
... ... ... ... ... ...
MifareClassic mifareClassic = MifareClassic.get(tag);
if (mifareClassic != null) {
mAccountCallback.get().onTagsTypeReceived(
TECH_TYPE_MFR_CLASS, mifareClassic.getType());
mAccountCallback.get().onMifareClassicReceived(mifareClassic);
}
... ... ... ... ... ...
NfcA nfcA = NfcA.get(tag);
if (nfcA != null) {
mAccountCallback.get().onNfcAReceived(nfcA);
}
... ... ... ... ... ...
}
对于标签,包含MifareUltralight MifareClassic技术列表或访问标签类型的方法是:
.getType()
但是如果没有这些技术,这个方法也就不可用了。但是,通过读取相同的标签,您使用连接到 PC 的 reader b 程序 Arduino 1.8.5,它们的数据读取没有问题:
A screenshot of the monitor output from programs Arduino 1.8.5
如何才能键入任何标签?
由于您的标签似乎是 MIFARE Ultralight 标签,您可以从 MifareUltralight
标签技术对象中获得类似的类型信息(即 getType()
方法):
MifareUltralight mifareUltralight = MifareUltralight.get(tag);
if (mifareUltralight != null) {
... = mifareUltralight.getType();
}
虽然这种类型信息可能有多大用处,但值得怀疑。有关对不同类型的 MIFARE Ultralight / NTAG 产品进行指纹识别的更好方法,请参阅这些问题:
- Distinguish different types of MIFARE Ultralight
但是,还要注意对任意类型的标签进行指纹识别当然不是一项简单的任务(另请参阅 )。
对于一个任意的NFC标签任务还没有解决。该解决方案仅适用于NFC类型A。文档公司"NXP Semiconductors" AN10833 "MIFARE Type Identification Procedure"在第3.2节Select确认(SAK)的编码中定义了SAK不同类型标签的对应值。在此基础上出现了代码:
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
String type = "";
int mSak = (int) (sak & 0x7F);
if (mTagType.getText().toString().equals(getString(R.string.tag_type))) {
switch (mSak) {
case 0x04:
type = getString(R.string.sak_indicates_uid_is_not_complete);
break;
case 0x09:
type = getString(R.string.mifare_classic_protocol_320_bytes);
break;
case 0x08:
type = getString(R.string.mifare_classic_protocol_1kb);
break;
case 0x18:
type = getString(R.string.mifare_classic_protocol_4kb);
break;
case 0x00:
type = getString(R.string.mifare_ultralight_or_ultralight_c);
break;
case 0x10:
case 0x11:
type = getString(R.string.mifare_plus);
break;
case 0x01:
type = getString(R.string.only_mentioned_in_nxp_an_10833_mifare_type_identification_procedure);
break;
case 0x20:
type = getString(R.string.picc_compliant_with_iso_iec_14443_4);
break;
case 0x40:
type = getString(R.string.picc_compliant_with_iso_iec_18092_nfc);
break;
default:
type = getString(R.string.picc_type_unknown);
break;
}
mTagType.setText(type);
}
}
});
获取SAK值的方法是class android.nfc.tech.NfcA:
.getSak()
我正在尝试为将复制 NFC 标签的智能手机创建一个应用程序。我遇到了在某些情况下无法为标签类型添加标签的问题。
有一个方法:
/**
* Callback when a new tag is discovered by the system.
* <p>
* <p>Communication with the card should take place here.
*
* @param tag Discovered tag
*/
@Override
public void onTagDiscovered(Tag tag) {
... ... ... ... ... ...
MifareClassic mifareClassic = MifareClassic.get(tag);
if (mifareClassic != null) {
mAccountCallback.get().onTagsTypeReceived(
TECH_TYPE_MFR_CLASS, mifareClassic.getType());
mAccountCallback.get().onMifareClassicReceived(mifareClassic);
}
... ... ... ... ... ...
NfcA nfcA = NfcA.get(tag);
if (nfcA != null) {
mAccountCallback.get().onNfcAReceived(nfcA);
}
... ... ... ... ... ...
}
对于标签,包含MifareUltralight MifareClassic技术列表或访问标签类型的方法是:
.getType()
但是如果没有这些技术,这个方法也就不可用了。但是,通过读取相同的标签,您使用连接到 PC 的 reader b 程序 Arduino 1.8.5,它们的数据读取没有问题:
A screenshot of the monitor output from programs Arduino 1.8.5
如何才能键入任何标签?
由于您的标签似乎是 MIFARE Ultralight 标签,您可以从 MifareUltralight
标签技术对象中获得类似的类型信息(即 getType()
方法):
MifareUltralight mifareUltralight = MifareUltralight.get(tag);
if (mifareUltralight != null) {
... = mifareUltralight.getType();
}
虽然这种类型信息可能有多大用处,但值得怀疑。有关对不同类型的 MIFARE Ultralight / NTAG 产品进行指纹识别的更好方法,请参阅这些问题:
- Distinguish different types of MIFARE Ultralight
但是,还要注意对任意类型的标签进行指纹识别当然不是一项简单的任务(另请参阅
对于一个任意的NFC标签任务还没有解决。该解决方案仅适用于NFC类型A。文档公司"NXP Semiconductors" AN10833 "MIFARE Type Identification Procedure"在第3.2节Select确认(SAK)的编码中定义了SAK不同类型标签的对应值。在此基础上出现了代码:
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
String type = "";
int mSak = (int) (sak & 0x7F);
if (mTagType.getText().toString().equals(getString(R.string.tag_type))) {
switch (mSak) {
case 0x04:
type = getString(R.string.sak_indicates_uid_is_not_complete);
break;
case 0x09:
type = getString(R.string.mifare_classic_protocol_320_bytes);
break;
case 0x08:
type = getString(R.string.mifare_classic_protocol_1kb);
break;
case 0x18:
type = getString(R.string.mifare_classic_protocol_4kb);
break;
case 0x00:
type = getString(R.string.mifare_ultralight_or_ultralight_c);
break;
case 0x10:
case 0x11:
type = getString(R.string.mifare_plus);
break;
case 0x01:
type = getString(R.string.only_mentioned_in_nxp_an_10833_mifare_type_identification_procedure);
break;
case 0x20:
type = getString(R.string.picc_compliant_with_iso_iec_14443_4);
break;
case 0x40:
type = getString(R.string.picc_compliant_with_iso_iec_18092_nfc);
break;
default:
type = getString(R.string.picc_type_unknown);
break;
}
mTagType.setText(type);
}
}
});
获取SAK值的方法是class android.nfc.tech.NfcA:
.getSak()