2016-04-30 65 views
1

我正在寫一個應用程序來讀取NFC標籤的二進制信息。這裏是NFC意向處理函數的代碼:Android NfcV獲取信息命令只返回一個字節

protected void onNewIntent(@NonNull Intent intent) 
{ 
    try 
    { 
     Tag tag  = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     NfcV nfcV = NfcV.get(tag); 
     byte[] cmdInfo = new byte[]{(byte) 0x02, (byte) 0x2b}; // 'Get info' command 
     byte[] answer = nfcV.transceive(cmdInfo); // Read info from tag. 

     ... 
    } 
    catch(IOException e) 
    { 
     ... 
    } 
} 

如果我運行這個功能閱讀三星S3新的一切NFC標籤工作正常,答案可變充滿預期的數據:

 
00 04 4B A0 14 01 00 A0 07 E0 F3 07 

Howewer如果我運行相同的功能閱讀華爲P8lite同一NFC標籤上的答案可變充滿只有一個字節:

 
03 

在一個錯誤的情況下,ISO 1569 3-3標準說我應該收到像

 
01 03 

也就是說,至少有兩個字節,其中第二個字節是錯誤代碼。所以我實際得到的答案在理論上是不可能的。

我在做什麼錯?它依賴於移動硬件嗎?我該如何解決它?

回答

2

由於您沒有使用尋址命令(Address_flag未設置,請求中沒有UID字段)。如果標籤不支持可選命令(即使是錯誤代碼),也不應該收到任何響應。因此,根據標準,您不應該收到0301 03

請注意,Android設備中的NFC芯片組在ISO/IEC 15693中經常有侷限性,並且不支持完整的標準。例如,已知某些芯片組在未編址的命令方面存在問題。你可以解決,通過使用該命令的處理版本:

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
NfcV nfcV = NfcV.get(tag); 
byte[] cmdInfo = new byte[]{ 
     (byte)0x20, 
     (byte)0x2B, 
     (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00 }; 
System.arraycopy(tag.getId(), 0, cmdInfo, 2, 8); 
byte[] answer = nfcV.transceive(cmdInfo); 

你可能也想爲Data_rate_flag不同的設置進行測試,因爲您的設備上的NFC芯片組可能與VICCs在高數據響應問題率。

+0

使用命令版本的命令解決了問題。非常感謝你! – Carlo

+1

@CarloCe您是否也嘗試Data_rate_flag的不同設置?其他SO讀者可能會感興趣的是知道P8lite是否支持這兩種選項... –

+2

如果我使用尋址命令,它將同時接受data_rate set和unset – Carlo