在Android上连续检测NFC标签
从我的阅读和实验中,我发现Android设备使用某种方法来防止重复读取标签()。这对于节能来说是非常好的,但是限制了这项技术的可能应用 例如,我面临的问题是,我有一个被动标记,其中内容不断更新。读取标签后,手机将停止检测标签,直到标签被删除。在此期间,如果不将标签从字段中删除并重新点击,您将无法继续读取标签中的更新内容。 此外,在最初读取标签后,磁场要么被关闭,要么极弱,以节省电源。因此,您无法为无源设备持续供电 有没有办法强迫Android设备持续供电并读取更新的被动标签在Android上连续检测NFC标签,android,tags,nfc,energy,Android,Tags,Nfc,Energy,从我的阅读和实验中,我发现Android设备使用某种方法来防止重复读取标签()。这对于节能来说是非常好的,但是限制了这项技术的可能应用 例如,我面临的问题是,我有一个被动标记,其中内容不断更新。读取标签后,手机将停止检测标签,直到标签被删除。在此期间,如果不将标签从字段中删除并重新点击,您将无法继续读取标签中的更新内容。 此外,在最初读取标签后,磁场要么被关闭,要么极弱,以节省电源。因此,您无法为无源设备持续供电 有没有办法强迫Android设备持续供电并读取更新的被动标签 注:我不介意它是否涉
注:我不介意它是否涉及到为实现对硬件的直接控制而对安卓设备进行根化。你在问题中所说的对安卓NFC设备来说根本不正确。一旦检测到标签(=响应所有强制命令并可能发送到应用程序的有效标签),NFC阅读器将持续为标签供电(HF载波保持开启)并与其交换一些命令。在保持活动状态阶段(“状态检查”)交换的命令取决于标记类型、Android版本和Android NFC堆栈实现。这通常是
tag
对象,甚至是从该标记句柄实例化的特定标记技术对象),只要您想访问标记,并且应用程序的标记读取活动需要持续保持在前台
例如,您可以这样做,从标记读取持续更新的NDEF消息(请注意,您最好使用AsyncTask
(或类似)而不是简单地生成该线程,并且您可能希望实现某种机制来中断该线程):
迈克尔回答得很好。 但我发现了一个问题。当标签上的微控制器对NFC设备中的非易失性存储器执行i2c读取时,似乎存在干扰手机正在进行的“ping”操作的风险 我使用的摩托罗拉G6 Play手机与M24LR-DISCOVERY标签非常相似,该标签上有一个M24LR04E-R。[我复制了ST25DV的结果。]该标签由工作台供电,而不是本实验的能量采集 当标签在手机的字段中时,我可以每隔130毫秒左右在Android调试器的logcat中看到活动
2020-10-13 19:38:50.555 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(793)] nfaConnectionCallback: Connection Event = 15
2020-10-13 19:38:50.555 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(1389)] nfaConnectionCallback: NFA_PRESENCE_CHECK_EVT
2020-10-13 19:38:50.680 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1953)] nativeNfcTag_doPresenceCheck
2020-10-13 19:38:50.680 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1997)] nativeNfcTag_doPresenceCheck: handle=0
2020-10-13 19:38:50.694 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(793)] nfaConnectionCallback: Connection Event = 15
2020-10-13 19:38:50.694 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(1389)] nfaConnectionCallback: NFA_PRESENCE_CHECK_EVT
2020-10-13 19:38:50.820 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1953)] nativeNfcTag_doPresenceCheck
2020-10-13 19:38:50.820 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1997)] nativeNfcTag_doPresenceCheck: handle=0
这似乎是Android在检查标签的存在。在这段时间里,我看到M24LR的RF_忙碌输出每130毫秒左右下降15毫秒左右。我将此与上面的Android活动联系起来
如果微控制器随后通过M24LR存储器的i2c执行块读取,则不久之后手机会播放通知音。发生的情况是,手机与标签失去连接,并重新连接。此时的logcat输出显示发生这种情况而不发出警告
2020-10-13 19:38:51.335 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(793)] nfaConnectionCallback: Connection Event = 15
2020-10-13 19:38:51.335 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(1389)] nfaConnectionCallback: NFA_PRESENCE_CHECK_EVT
2020-10-13 19:38:51.335 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(2173)] nativeNfcTag_doPresenceCheck: tag absent
2020-10-13 19:38:51.335 4209-28960/? D/NativeNfcTag: Tag lost, restarting polling loop
2020-10-13 19:38:51.335 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1392)] nativeNfcTag_doDisconnect: enter
2020-10-13 19:38:51.335 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1414)] nativeNfcTag_doDisconnect: exit
2020-10-13 19:38:51.336 4209-28960/? D/NfcService: Discovery configuration equal, not updating.
2020-10-13 19:38:51.336 4209-28960/? D/NativeNfcTag: Stopping background presence check
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(793)] nfaConnectionCallback: Connection Event = 6
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(1121)] nfaConnectionCallback: NFA_DEACTIVATED_EVT: Type=0, gIsTagDeactivating=0
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(5280)] notifyPollingEventwhileNfcOff: sDiscCmdwhleNfcOff=0
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(921)] getReconnectState = 0x0
2020-10-13 19:38:51.345 4209-4411/? I/libnfc_nci: [INFO:NfcTag.cpp(189)] NfcTag::setDeactivationState: state=0
2020-10-13 19:38:51.345 4209-4411/? I/libnfc_nci: [INFO:NfcTag.cpp(1358)] NfcTag::resetTechnologies
2020-10-13 19:38:51.345 4209-4411/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(263)] nativeNfcTag_abortWaits
断开连接显然会破坏手机上运行的任何试图与标签交换信息的应用程序
我尝试使用忙信号来阻止标签上的微控制器在射频访问进行中启动任何i2c读取操作,但问题仍然存在。我猜问题是由于在进行内存访问时发生了RF ping,但我只是猜测
似乎断开连接的机会随着读取的字节数的增加而增加(支持“冲突”的想法)。单字节读取通常可以在不造成断开连接的情况下进行
这真的是正确的行为吗?有什么办法可以防止这种情况发生吗?OP(或我自己)将如何使用这些设备来实现一个系统,其中标签上的微控制器可以读取/写入NFC设备的内存,以便与手机上运行的应用程序交换信息?
正如我所说,我在M24LR和ST25DV中都观察到了这一点
[如果这更多的是一个问题而不是一个答案,我表示歉意,但我想进一步阐明这一主题。]我从未观察到这种行为。你能提供一个讨论这个问题的链接吗?我将在原始帖子中更新此链接。如果你是正确的,我所说的事实上是错误的,我想根据我的观察,这是一个错误结论的案例。在阅读了您的回复后,我实现了一个与您提供的代码非常相似的代码,该代码持续轮询一块内存(没有延迟)整整一分钟。令我惊讶的是,安卓手机确实继续为该设备供电。我感谢你的帮助和详细的解释!我想和大家分享一下我的情况,我错过了ndef,close()指令,因此我的结论是,在每次阅读之后,我们必须关闭,然后再次连接以执行下一次阅读。虽然我的原始问题中没有提到,但我也在与您类似的上下文中使用M24LR。我确实设法得到了一份工作
2020-10-13 19:38:51.335 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(793)] nfaConnectionCallback: Connection Event = 15
2020-10-13 19:38:51.335 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(1389)] nfaConnectionCallback: NFA_PRESENCE_CHECK_EVT
2020-10-13 19:38:51.335 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(2173)] nativeNfcTag_doPresenceCheck: tag absent
2020-10-13 19:38:51.335 4209-28960/? D/NativeNfcTag: Tag lost, restarting polling loop
2020-10-13 19:38:51.335 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1392)] nativeNfcTag_doDisconnect: enter
2020-10-13 19:38:51.335 4209-28960/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(1414)] nativeNfcTag_doDisconnect: exit
2020-10-13 19:38:51.336 4209-28960/? D/NfcService: Discovery configuration equal, not updating.
2020-10-13 19:38:51.336 4209-28960/? D/NativeNfcTag: Stopping background presence check
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(793)] nfaConnectionCallback: Connection Event = 6
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(1121)] nfaConnectionCallback: NFA_DEACTIVATED_EVT: Type=0, gIsTagDeactivating=0
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcManager.cpp(5280)] notifyPollingEventwhileNfcOff: sDiscCmdwhleNfcOff=0
2020-10-13 19:38:51.344 4209-4411/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(921)] getReconnectState = 0x0
2020-10-13 19:38:51.345 4209-4411/? I/libnfc_nci: [INFO:NfcTag.cpp(189)] NfcTag::setDeactivationState: state=0
2020-10-13 19:38:51.345 4209-4411/? I/libnfc_nci: [INFO:NfcTag.cpp(1358)] NfcTag::resetTechnologies
2020-10-13 19:38:51.345 4209-4411/? I/libnfc_nci: [INFO:NativeNfcTag.cpp(263)] nativeNfcTag_abortWaits