【问题标题】:NFC ACR122 TgInitAsTarget, initiator releasing targetNFC ACR122 TgInitAsTarget,发起者释放目标
【发布时间】:2014-01-10 18:05:57
【问题描述】:

我正在尝试让我的 ACR122 (usb) 设备模拟无源 NFC 标签,但无法正常进行通信。我希望有人能看到我在这里做错了什么并帮助我指出正确的方向。

对另一个问题ACR122 - Card Emulation 的回复指向http://code.google.com/p/nfcip-java/source/browse/trunk/nfcip-java/doc/ACR122_PN53x.txt 的一个文档,但是当我们按照这封信进行操作时,它的行为并不符合预期。

我们正在使用三星 Galaxy S3 Android 4.3 设备进行测试,并看到以下行为:

Transmit (TgInitAsTarget)
....'......4V@..  FF 00 00 00 27 D4 8C 00 08 00 12 34 56 40 01 FE 
................  A2 A3 A4 A5 A6 A7 C0 C1 C2 C3 C4 C5 C6 C7 FF FF 
...wfUD3"...      AA 99 88 77 66 55 44 33 22 11 00 00 

Receive
..%....7.5<...w.  D5 8D 25 1E D4 00 08 37 D9 35 3C BF D5 AE 77 9C 
...2Ffm.........  00 00 00 32 46 66 6D 01 01 11 03 02 00 13 04 01 
...               96 90 00 

Transmit (GetData)
.......           FF 00 00 00 02 D4 86 

Receive
..)..             D5 87 29 90 00 

TgInitAsTarget 命令似乎正在工作,返回一个 0x25 的模式,我们理解它的意思是“活动模式,DEP,424kbps”。

但随后“GetData”命令立即失败,返回状态码 0x29“配置为目标的 PN532 已被其发起者释放”。

我们尝试使用不同的模式(而不是 0x00“All”模式)更改 TgInitAsTarget 命令,尝试以下所有仍为以下 GetData 命令返回 0x29 的命令:

  • 模式 0x01“被动”,导致响应模式 0x04“DEP”
  • 模式 0x02“DEP”,导致响应模式 0x25(与“全部”相同)
  • 模式 0x03“DEP Passive”导致响应模式为 0x04“DEP”

在所有情况下,似乎 Android 都没有保持连接,尽管我对 NFC DEP 协议不够熟悉,无法知道我在这里做错了什么。我已经阅读了 PN532 芯片参考,这似乎表明我做的一切都是正确的。

我也尝试过 Windows Phone NFC 设备,它在 GetData 上遇到了同样的问题和错误代码。

如果任何熟悉 NFC 的人提供任何帮助,我们将不胜感激。

戴夫

【问题讨论】:

    标签: nfc hce acr122


    【解决方案1】:

    为了让 ACR122(或者更确切地说是其中的 PN532 NFC 控制器芯片)进入卡模拟模式,您需要执行以下操作:

    1. 读取寄存器:

      > FF000000 08 D406 6305 630D 6338
      < D507 xx yy zz 9000
      
    2. 更新寄存器值:

      xx = xx | 0x004;  // CIU_TxAuto |= InitialRFOn
      yy = yy & 0x0EF;  // CIU_ManualRCV &= ~ParityDisable
      zz = zz & 0x0F7;  // CIU_Status2 &= ~MFCrypto1On
      
    3. 写寄存器:

      > FF000000 11 D408 6302 80 6303 80 6305 xx 630D yy 6338 zz
      < D509 9000
      
    4. 设置参数:

      > FF000000 03 D412 30
      < D513 9000
      
    5. TgInitAsTarget

      > FF000000 27 D48C 05 0400 123456 20 000000000000000000000000000000000000 00000000000000000000 00 00
      < D58D xx ... 9000
      

      xx 应该等于 0x08。

    6. 使用一系列 TgGetData 和 TgSetData 命令进行通信:

      > FF000000 02 D486
      < D587 xx <C-APDU> 9000
      

      其中xx 是状态码(应该是0x00 表示成功),C-APDU 是阅读器发送的命令。

      > FF000000 yy D48E <R-APDU>
      < D587 xx 9000
      

      其中yy 是 2 + R-APDU(响应)的长度,xx 是状态码(应该是 0x00 表示成功)。

    【讨论】:

    • 非常感谢迈克尔,这让我们走上了正轨。如果您不介意,是否有任何您可以推荐我们阅读的参考资料?似乎关键在于 initastarget 命令的参数(设置为 PICC 模式),但我们找不到任何关于不同模式、它们如何工作等的参考资料。
    • 我建议您遵循 PN532 用户手册(您应该通过 Google 找到此内容)和 PN532 数据表(不确定在没有 NDA 的情况下是否已经可用)。
    • 我们有手册(不是数据表),但它描述了 TgInitAsTarget 命令的部分(例如“MiFare params here”、“FeliCa params here”、“ PICC/DEP/Passive 模式”),当遵循示例时,我们最终会知道 什么 我们正在设置,但不知道 为什么 我们要设置它,如果这有意义的话。我相信这会随着时间的推移而出现,我只是好奇是否有任何有用的参考资料可以帮助我们开始理解这些概念。我们现在肯定走​​在正确的轨道上;我们目前正在努力了解传入的 C-APDU 值。再次感谢,非常感谢。
    • 为了完整起见,万一有人和我们走同样的路,我们在NFC Forum Type 4 Tag Operation Spec 中找到了对 NDEF 标签的 C-APDU/R-APDU 序列的清晰描述。该协议基于 ISO7816-4,我们发现该参考对于理解所有内容也很有用。
    • @gudenau TgInitAsTarget 是一个阻塞命令(您只会收到一个 ACK​​ 帧,但在发送命令后不会立即收到实际响应),因此在阅读器实际连接到模拟标签之前您不会收到任何响应.在帧之间接收垃圾并不意外。确保只解释正确的帧。
    猜你喜欢
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多