NFC标签密码保护与ST25 Android SDK

3

我正在使用ST25标签,更具体地说是type5标签ST25DV64K。安卓的ST25 SDK中有一些有趣的示例和教程。我仍然在努力使用文档末尾提供的代码示例 这里,关于受密码保护的数据,其中包含以下行:

byte[] password;
int passwordNumber = type5Tag.getPasswordNumber(area);
tag.presentPassword(passwordNumber, password);
NDEFMsg ndefMsg = myTag.readNdefMessage(area);

第一个问题,当我实例化 Type5Tag 时,我没有看到 Type5Tag 类的这些方法:
import com.st.st25sdk.type5.*;
Type5Tag tag5;
tag5.??

然后,我们不清楚应该如何首次设置密码。我找不到任何设置特定区域密码以及删除密码的示例,我们可以使用什么格式的密码?是否可以从Android上完成此操作或者必须使用ST25应用程序?欢迎提供示例!谢谢。

1个回答

3
在ST25 SDK Zip文件中,您将找到一个基本的Android应用程序示例,其中使用了ST25 SDK库(它在\integration\android\examples\ST25AndroidDemoApp中)。
例如使用了一个名为“TagDiscovery”的类,它能够识别任何ST25标签并实例化正确的对象。在您的情况下,如果您只使用ST25DV64K标签,则可能要做一些简单的事情。
我建议您: 在android活动中,我希望您已经订阅了每次点击NFC标签时都会收到通知(在“ST25AndroidDemoApp”示例中,在onResume()函数中查看enableForegroundDispatch())。 要确定Intent是否对应于“NFC Intent”,我们检查Intent的Action是否是ACTION_NDEF_DISCOVERED、ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED。
当这种情况发生时,我们知道它是一个NFC Intent。然后我们可以调用此方法来获取androidTag实例:
Tag androidTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

此对象表示Android中当前的NFC标签。

现在我们将实例化一个ST25DVTag对象。

import com.st.st25sdk.type5.st25dv.ST25DVTag;

…

AndroidReaderInterface readerInterface = AndroidReaderInterface.newInstance(androidTag);
byte[] uid = androidTag.getId();
uid = Helper.reverseByteArray(uid);
ST25DVTag myST25DVTag = new ST25DVTag(readerInterface, uid);

现在您拥有一个名为myST25DVTag的对象,可用于与标签通信!

例如,如果要使用密码:

byte[] password = new byte[];      // TODO: Fill the password
int passwordNumber = myST25DVTag.getPasswordNumber(area);
myST25DVTag.presentPassword(passwordNumber, password);
NDEFMsg ndefMsg = myST25DVTag.readNdefMessage(area);

在执行此操作之前,您需要检查哪个密码与这个区域相关联。该标签有3个密码,可以自由地分配到任何区域。默认情况下,没有设置密码,因此您应该设置一个密码。以下是一个示例,在其中我使用密码2来保护Area1:

int AREA1 = 1;
int passwordChosen = 2;
myST25DVTag.setPasswordNumber(AREA1, passwordChosen);
                           

我建议您从Google Play安装“ST25 NFC Tap” Android应用程序:https://play.google.com/store/apps/details?id=com.st.st25nfc&hl=fr&gl=US 如果您敲击ST25DV并进入“区域安全状态”菜单,您将能够看到:区域数量,哪些区域受读写密码保护,使用哪个密码等等。
如果您有兴趣,该应用程序的源代码在此处可用:https://www.st.com/en/embedded-software/stsw-st25001.html 如果有不清楚的地方,请告诉我。
免责声明:我是ST25 SDK开发团队之一。

我不建议在设置密码或读/写带有密码的标签时使用enableForegroundDispatch(),除非您需要支持低于API 19的API,因为当实际用户使用enableForegroundDispatch()时会生成大量错误。相比之下,最好使用enableReaderMode(),因为您可以在实际完成与标签交互时正确提示用户发出声音。 - Andrew
NFC标签可以触发一些本地处理。例如:打开URL、进行蓝牙配对、发送短信等。 enableForegroundDispatch() 允许您的 Activity 接管这个本地处理。换句话说,它的意思是:“将 NFC Intent 交给当前 Activity 处理,而不是执行本地处理”。只有当 Activity 在前台时才会执行此操作(这就是为什么在 onPause() 中调用 disableForegroundDispatch() 很重要的原因)。 它赋予应用程序决定 NFC Intent 应该执行什么操作的能力。您使用 enableForegroundDispatch() 遇到了哪些错误? - OlivierGrenoble
enableForegroundDispatch()如果你正在进行任何未缓存的ndef读取操作,会产生大量的TagLostExceptionIOException。系统NFC服务/应用程序读取卡片并发出通知声音,将任何数据打包到一个Intent中,然后必须暂停和恢复您的应用程序以传递Intent,然后您必须在应用程序中处理Intent,而当您完成此操作时,用户已经将卡片移出了RF场,因为他们将通知声音视为成功。如果您必须自己进行读写,则卡片不在范围内。 - Andrew
使用enableReaderMode()而不是enableForegroundDispatch()的另一个原因是,如果您要执行除缓存的ndef读取之外的任何操作,大多数其他Tag操作都会声明“这是一个I/O操作,并且将阻塞直到完成。它不能从主应用程序线程调用”,onNewIntent在主应用程序线程中运行,因此您应该创建自己的线程来处理NFC Intent(大多数人不这样做),而enableReaderMode会自动在新线程中运行onTagDiscovered - Andrew
我们没有遇到您提到的问题。我们的应用程序接收NFC Intent,然后所有的NFC处理都通过transceive()函数完成。确实,它们不应该在UI线程中完成,因此我们使用了一个ASYNC任务。 - OlivierGrenoble
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接