APDU調試問題總結

問題1.================================================================
無法讀取銀行卡(手環等),卡號也尋不到,導致後續的操作無法進行
或者偶爾能尋到卡,但是讀寫很不穩定,可能讀着讀着就又尋不到卡了

  
原因:底層尋卡操作中,關閉再開啓天線之後,沒有短暫延時使天線穩定,
導致卡無法尋卡。卡的能量是從讀卡器的天線上獲取,如果卡沒有獲取到足夠的
能量(達到卡片內芯片的工作電壓),那麼卡片和讀卡器也就無法通信。

解決:關閉再開啓天線之後,加入10ms延時,問題解決

問題2:================================================================
無法接收超過64字節的APDU數據
在接收超過64字節的APDU數據時,發現數據被截斷了,而且每次最多收到64字節數據

原因:FM1722的FIFO寄存器大小爲64字節。所以一次最多接收64字節數據,所以需要
使用塊傳輸分包發送大量數據。

解決:ISO14443協議規定,可以將長字節的APDU數據分包發送,每個包大小可以自定義
RATS階段PCD會發送自身的最大接收長度(FSDI=5 即64字節)給卡片,卡片收到以後,會自動
將超過64字節的數據分塊發送給PCD,PCD在收到塊之後需要發送R(ACK)塊確認,然後,卡片會
繼續發送剩下的塊,直至所有數據發送完畢。
問題3:================================================================
APDU交互時,選擇DF經常超時報錯,偶爾能成功,此外GPO指令一直報錯(6F00),導致
後續扣款操作無法進行

原因:底層發送數據到FM1722的FIFO之後,延時過短,卡還沒來得及返回數據
讀卡器認爲卡沒有返回數據而直接跳過接收環節

解決:將延時增加到500ms,若還未收到數據,則報超時錯誤


問題4:================================================================
讀卡器向卡片發送APDU指令(APDU確定是正確的),但是卡片無返回(RATS成功後面進行APDU交互時)?

原因:
1. 同問題3  
2.CID的問題,CID由讀卡器規定,它指示了PCD同時可以操作多少張卡,它的可選值是0~14,
也就就是同時最多操作15張卡(卡片0~卡片14),RATS階段,讀卡器會發送
CID到卡片,假設CID=0,也就是規定該卡標識爲0,後續的APDU交互,如果支持CID,
讀卡器發送的塊數據中CID值必須爲0,該卡片纔會返回數據,若CID爲其他值,那麼卡片不會返回任何值,
換句話說,卡片根本不知道讀卡器在呼叫它,所以也就不會返回數據了

解決:針對原因2,RATS階段的CID值需要和後面APDU的CID值保持一致。

問題5:================================================================
讀取銀行卡(SAK=0x28)時,RATS成功返回之後,APDU的交互總是成功一次,超時一次
超時即 卡片無響應  

例如,讀卡器發送PPSE,卡片總是成功返回一次,超時失敗一次?

原因:暫時未知 目前發現幾乎所有SAK=0x28的卡都會這樣,但是SAK=0x20的就沒有問題

解決:底層加入APDU重發機制;如果超時,至多重發3次,若卡片仍超時,則判定失敗
實測正常情況下,暫無出現重發3次,卡片仍無響應的問題。
  


    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章