簡體   English   中英

Android響應PN532 InListPassiveTarget

[英]Android responds to PN532 InListPassiveTarget

我有一個奇怪的情況,我試圖在標簽模擬和標簽閱讀器模式之間切換我的PN532。 讀者持續約70ms,標簽仿真運行約600ms。

我想要發生的是,當我將我的Android設備放在天線附近時,它會讀取模擬標簽。 當我將PN標簽保存到PN532時,它應該讀取標簽。

我的解決方案有點工作,但我看到一個奇怪的情況,當我調用readPassiveTargetID來測試是否存在被動標簽時,Android正在響應。 這樣會很好,但我認為Android正在啟動一項服務,阻止它閱讀模擬標簽。

在測試時,有時設備根本不與PN532通信,但是當他們這樣做時,最常用的是讀卡器模式。 以下是發生這種情況時得到的輸出:

Nexus 5x(Android 6):

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

Galaxy 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很少讀取標簽。 當我只運行標簽模擬時,兩個設備都可以正常運行。

我在想我可能會遇到一些問題。

  1. 我是否需要做一些特殊的事情來切換模式? 切換時,我實際上沒有重置或重新初始化PN532。
  2. 是否有一個命令我可以發送告訴設備停止收聽或我可以發送的設置將解決這個問題?

我的解決方案有點工作,但我看到一個奇怪的情況,當我調用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中定義的各種選項進行激活。由於這些子協議基於NFC-A和NFC-F是支持被動對等模式和卡仿真模式的NFC設備,通常將兩者的收聽“階段”組合成單個可激活目標。

這正是您所看到的:支持ISO / IEC 14443A和ISO / IEC 18092被動模式的設備,速率為106kbps。 這兩種協議都使用ISO / IEC 14443A的防沖突和選擇程序。 為了簡化發現,NFC設備將卡仿真模式和對等模式兩者組合成一個單個可見目標(即具有一個UID的一個“卡”)。

您可以從激活期間接收的參數值(特別是SAK / SEL_RES字節)中清楚地看到這一點。 對於Nexus 5X,此字節為0x60 ,表示此目標支持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服務通信時,您仍然可以啟動應用程序的活動(請參閱如何從HostApduService向活動發送消息? )。

  • 您可以將PN532處於卡仿真模式的時間增加到約5秒(某些值明顯大於上面提到的超時)。 然后Android應該(非常)可靠地檢測模擬標簽,即使它在卡模擬模式下被激活/之前被動對等模式目標。 不幸的是,在PN532能夠檢測無源標簽之前的5秒等待時間在PN532應該讀取NFC標簽/非接觸式智能卡的情況下,在用戶體驗方面通常是不可接受的。

  • 如果您的應用只需要能夠與應用程序的活動在前台時(即當用戶嘗試與PN532端進行交互之前 手動打開應用程序)與PN532進行通信時,您可以使用閱讀器禁用P2P模式-mode API(請參閱NfcAdapter.enableReaderMode() 。這再次限制您使用運行Android 4.4+的設備(雖然支持所有NFC芯片組)。我懷疑這比在Android端使用HCE有很多好處,盡管當用戶試圖用他們的手機點擊PN532端以便自動打開應用程序或安裝應用程序(通過AAR)時,問題就會出現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM