草庐IT

Android 响应 PN532 InListPassiveTarget

coder 2023-12-15 原文

我有一个奇怪的情况,我试图在标签仿真和标签阅读器模式之间切换我的 PN532。阅读器运行约 70 毫秒,标签仿真运行约 600 毫秒。

我想要发生的是,当我将我的 Android 设备放在天线附近时,它会读取模拟标签。当我将 NFC 标签放在 PN532 上时,它应该会读取标签。

我的解决方案有点工作,但我看到一个奇怪的情况,当我调用 readPassiveTargetID 时为了测试是否存在无源标签,Android 正在做出响应。这很好,但我认为 Android 正在启动一项服务,阻止它读取模拟标签。

对此进行测试时,有时设备根本不与 PN532 通信,但当它们进行通信时,通常使用阅读器模式。这是发生这种情况时我得到的输出:

Nexus 5x(安卓 6):

<< 4A 1 0
>> 4B 1 1 0 4 60 4 1 2 3 4 5 78 80 71 0

银河 S4 (Android 5.0.1):
<< 4A 1 0
>> 4B 1 1 0 4 20 4 8 87 F6 62 5 78 B3 70 2

5x 通常会在一秒左右后读取模拟标签,但当我在两种模式之间切换时,S4 很少读取标签。当我只运行标签仿真时,两个设备都可以完美运行。

我在想我正在做的事情可能存在一些问题。
  • 我需要做一些特别的事情来在模式之间切换吗?当我切换时,我实际上并没有重置或重新初始化 PN532。
  • 是否有我可以发送的命令来告诉设备停止收听,或者我可以发送一个设置来解决这个问题?
  • 最佳答案

    我的解决方案有点工作,但我看到一个奇怪的情况,当我调用 readPassiveTargetID 时(InListPassiveTarget) Android 正在响应。

    这不是一个奇怪的情况,而是当您尝试从任何 ISO/IEC 14443A 读取器访问 NFC 设备时可以预料到的情况。 NFC 设备通常支持

  • 读取器/写入器模式(即轮询无源标签),
  • 对等模式(即它轮询和监听其他对等模式目标)和
  • (有时)卡模拟模式(即它监听其他读/写设备的激活)。

  • 当 NFC 设备轮询标签时,这通常类似于 InListPassiveTarget 所做的,不同之处在于它通常会测试各种不同的标签技术(NFC-A = ISO/IEC 14443A,NFC-B = ISO/IEC 14443B,NFC -F = JIS X 6319-4,NFC-V = ISO/IEC 15693)。由于被动对等模式基于 ISO/IEC 14443A 和 JIS X 6319-4,因此它还将通过 NFC-A 和 NFC-F 测试自动发现被动对等目标。此外,它将测试其他对等设备(ISO/IEC 18092 主动模式)。

    当 NFC 设备监听其他设备(点对点或读写器模式)的激活时,它将允许使用 ISO/IEC 18092 中定义的各种选项进行激活。由于这些子协议(protocol)基于 NFC-A 和NFC-F 是一种支持被动对等模式和卡模拟模式的 NFC 设备,通常会将两者的监听“阶段”合并为一个可激活的目标。

    这正是您所看到的:支持 ISO/IEC 14443A 和 ISO/IEC 18092 无源模式(106kbps)的设备。这两种协议(protocol)都使用 ISO/IEC 14443A 中的防冲突和选择程序。为了简化发现,NFC 设备将卡模拟模式和点对点模式结合到一个单一的可见目标中(即一张“卡”和一个 UID)。

    您可以从激活期间收到的参数值(特别是 SAK/SEL_RES 字节)清楚地看到这一点。这个字节是 0x60对于 Nexus 5X,它表明此目标支持 ISO/IEC 14443-4(A 类)设置第 5 位和 ISO/IEC 18092 无源 106kbps 设置第 6 位。

    请注意,三星在其 Galaxy S4 上决定不在 SAK 字节 (0x20) 中宣布点对点模式支持,这可能是由于某些信用卡支付终端的问题。

    这很好,但我认为 Android 正在启动一项服务,阻止它读取模拟标签。

    它实际上不是服务启动,而是 Android 故意引入超时。在点对点或卡模拟模式下激活 Android 设备后,Android 设备将在外部阅读器关闭其 HF 场后等待大约 4 秒钟,然后重新开始轮询标签。这至少是我们使用 libnfc-nci 为 Nexus 设备测量的结果。三星以广泛修改 NFC 堆栈实现而闻名(通常会引入许多额外的错误(功能?)),因此这在 S4 上可能略有不同。

    我需要做一些特别的事情来在模式之间切换吗?当我切换时,我实际上并没有重置或重新初始化 PN532。

    您可能正在做您应该/可以做的事情。这是 Android 端的故意超时(场外 4 秒后)导致您遇到的情况。

    是否有我可以发送的命令来告诉设备停止收听,或者我可以发送一个设置来解决这个问题?

    不幸的是,这通常并不那么容易。你可以做的一些事情:
  • 您真的需要Android手机上的读写器模式吗?如果您可以使用主机卡仿真 (HCE) 在 Android 端实现所需的所有功能,则可以将 PN532 端实现为仅在读取器/写入器模式下运行。这将消除两种模式之间的切换,您将不再受到超时的影响。不幸的是,这将限制您使用支持 Android HCE(Android 4.4+ 和某些更新的 NFC 芯片组)的设备。此外,一些事情,比如如果丢失(通过 Android 应用程序记录,AAR)自动安装应用程序是不可能的。当读者与您的 HCE 服务通信时,您仍然可以启动应用程序的 Activity (请参阅 How can I send message from HostApduService to an activity?)。
  • 您可以将 PN532 处于卡模拟模式的时间增加到约 5 秒(某个值明显大于上述超时时间)。那么 Android 应该(相当)可靠地检测到模拟标签,即使它之前在卡模拟模式下/作为被动对等模式目标被激活。不幸的是,在 PN532 应该读取 NFC 标签/非接触式智能卡的情况下,就用户体验而言,在 PN532 能够检测到无源标签之前的 5 秒等待时间通常是 Not Acceptable 。
  • 如果您的应用程序只需要能够在应用程序的 Activity 处于前台时与 PN532 通信(即当用户 手动打开 应用程序 之前 他们尝试与PN532 端),您可以使用读取器模式 API 禁用 P2P 模式(请参阅 NfcAdapter.enableReaderMode() 。这再次将您限制为运行 Android 4.4+ 的设备(尽管所有 NFC 芯片组都支持)。我怀疑这会带来多大好处尽管在 Android 端使用 HCE,但因为当用户尝试用手机点击 PN532 端以自动打开应用程序或安装应用程序(通过 AAR)时,问题又回来了。
  • 关于Android 响应 PN532 InListPassiveTarget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37213889/

    有关Android 响应 PN532 InListPassiveTarget的更多相关文章

    1. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

      我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

    2. 安卓apk修改(Android反编译apk) - 2

      最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

    3. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

      在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

    4. ruby-on-rails - Rails 在记录 200 OK 后在做什么? (调试响应时间慢) - 2

      我试图在我的RubyonRails应用程序中调试一个极其缓慢的请求调用。我已设法根据自己的喜好优化Controller方法,Rails的日志告诉我它已在XX毫秒内完成操作(Completed200OKin5049ms(Views:34.9ms|ActiveRecord:76.3ms)).但是,在加载页面时,在浏览器中实际呈现任何内容之前打印此消息很长;最多约15秒的等待时间。Rackmini-profiler证实了这一点,告诉我GET操作(不计算完成Controller操作所花费的时间)花费了14秒左右。(分析器还确认Controller操作的执行时间约为5秒)。我可以接受Contro

    5. ruby - 带有 header 的 Sinatra 流式响应 - 2

      我想通过Sinatra应用程序代理远程文件。这需要将带有header的HTTP响应从远程源流式传输回客户端,但我不知道如何在Net::HTTP#提供的block内使用流式API时设置响应header获取响应。例如,这不会设置响应头:get'/file'dostreamdo|out|uri=URI("http://manuals.info.apple.com/en/ipad_user_guide.pdf")Net::HTTP.get_response(uri)do|file|headers'Content-Type'=>file.header['Content-Type']file.re

    6. ruby - Net::HTTP 对 HTTPS 请求的响应极其缓慢 - 2

      出于某种原因,在我的开发机器上,我对通过Net::HTTP执行的HTTPS请求的响应非常非常慢。我试过RestClient和HTTParty,它们都有同样的问题。它似乎是凭空冒出来的。我已毫无问题地提出这些请求数百次,但今天它们的速度慢得令人难以忍受。pry(main)>putsTime.now;HTTParty.get('https://api.easypost.com/v2/addresses');putsTime.now;2015-04-2908:07:08-05002015-04-2908:09:39-0500如您所见,响应耗时2.5分钟。不仅仅是这个EasyPostAPIUR

    7. ruby - 使用 Ruby 将 HTTP GET 的响应主体流式传输到 HTTP POST - 2

      我正在尝试下载一个大文件,然后使用Ruby将该文件发布到REST端点。该文件可能非常大,即超过可以存储在内存中甚至磁盘上的临时文件中的容量。我一直在用Net::HTTP尝试这个,但我愿意接受任何其他库(rest-client等)的解决方案,只要他们做我想做的事情。这是我尝试过的:require'net/http'source_uri=URI("https://example.org/very_large_file")source_request=Net::HTTP::Get.new(source_uri)source_http=Net::HTTP.start(source_uri.ho

    8. 更新证书后,Ruby Net::HTTP 响应 OpenSSL::SSL::SSLError "certificate verify failed" - 2

      我们最近更新了我们网站的SSL证书,在MacOSElCapitan10.11.3上出现以下情况:require'net/http'Net::HTTP.getURI('https://www.google.com')#=>"..."#ThesitewhosecertificategotrenewedNet::HTTP.getURI('https://www.example.com')#=>OpenSSL::SSL::SSLError:SSL_connectreturned=1errno=0state=error:certificateverifyfailed我在Google和StackO

    9. ruby-on-rails - Rails Controller 中未定义的方法呈现 - 尝试使用 200 状态代码响应 Sendgrid - 2

      我正在使用SendgridParseAPI和Griddlergem来接受传入的电子邮件。在大多数情况下,这工作正常;但是,如果您未使用状态代码200响应Sendgrid,他们将假定该应用程序未正确接收POST请求并继续尝试进行POST3天。我正在尝试使用状态代码进行响应,但遇到了问题。在常规的RESTful路由中,您可以执行类似...render:status=>200但是,我认为这必须在Controller中完成才能识别渲染方法。Griddler建议您创建一个EmailProcessor模型并使用“处理”方法来处理电子邮件。据我了解,您不能在模型中使用渲染方法。因此,我使用类方法创建

    10. ruby - 为什么一个简单的瘦服务器在进行基准测试时会在 16500 个请求时停止响应? - 2

      这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:'ab'programfreezesafterlotsofrequests,why?这是一个简单的测试服务器:require'rubygems'require'rack'require'thin'classHelloWorlddefcall(env)[200,{"Content-Type"=>"text/plain"},"OK"]endendRack::Handler::Thin.runHelloWorld.new,:Port=>9294#I'vetriedwiththeseaddedtoo,'rack.mu

    随机推荐