2013-03-28 73 views
1

我正在嘗試閱讀恩智浦在我的Android應用程序中開發的NFC標籤。可以使用Android讀取標籤:App by NXPone other可以正確讀取。使用Android閱讀恩智浦ICODE SLI-L標籤

準確的標籤類型是「ICODE SLI-L(SL2ICS50)」,而RF技術是「Type V/ISO 15693」(從這些工作應用程序獲取的數據)。內存由2個頁面組成,每個頁面有4個塊,每個塊有4個字節 - 我只想將整個數據存儲在內存中。

標籤必須使用Android的NfcV類處理,標籤的數據表是available here,但使用NfcV很難找到任何工作代碼示例。我嘗試了幾個我自己通過數據表總結出來的東西,並嘗試了來自this PDF I found with Google的通信示例,但沒有任何效果。

在我的活動相應的方法(我使用NFC前景調度)看起來是這樣的:

public void onNewIntent(Intent intent) { 
    android.nfc.Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    NfcV tech = NfcV.get(tag); 
    try { 
     tech.connect(); 
     byte[] arrByt = new byte[9]; 
     arrByt[0] = 0x02; 
     arrByt[1] = (byte) 0xB0; 
     arrByt[2] = 0x08; 
     arrByt[3] = 0x00; 
     arrByt[4] = 0x01; 
     arrByt[5] = 0x04; 
     arrByt[6] = 0x00; 
     arrByt[7] = 0x02; 
     arrByt[8] = 0x00; 
     byte[] data = tech.transceive(arrByt); 
     // Print data 
     tech.close(); 
    } catch (IOException e) { 
     // Exception handling 
    } 
} 

,當我把我的手機上的標籤的方法是正確調用,但NfcV對象的transceive()方法總是拋出一個IOException:android.nfc.TagLostException: Tag was lost.。這是我嘗試過的所有字節數組的結果(上面的那個不太可能是正確的,但是在最後幾天我嘗試了其他所有字節數組,其結果都是相同的行爲)。發生錯誤是因爲我發送了錯誤的命令給標籤 - 但我不能拿出正確的命令。任何想法?

+0

我甚至發郵件給恩智浦, ey將我鏈接到我已有的數據表,並建議我在此處詢問StackOverflow ;-) –

回答

6

ISO 15693定義了不同的讀取命令,製造商也可以定義專有的讀取命令。支持ISO 15693單塊讀取命令,您可以發送如下:

public static void processNfcIntent(Intent intent){ 
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    if(tag != null){ 
     // set up read command buffer 
     byte blockNo = 0; // block address 
     byte[] readCmd = new byte[3 + id.length]; 
     readCmd[0] = 0x20; // set "address" flag (only send command to this tag) 
     readCmd[1] = 0x20; // ISO 15693 Single Block Read command byte 
     byte[] id = tag.getId(); 
     System.arraycopy(id, 0, readCmd, 2, id.length); // copy ID 
     readCmd[2 + id.length] = blockNo; // 1 byte payload: block address 

     NfcV tech = NfcV.get(tag); 
     if (tech != null) { 
     // send read command 
     try { 
      tech.connect(); 
      byte[] data = tech.transceive(readCmd); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
      tech.close(); 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } 
     } 
     } 
    } 
} 
+0

Works,謝謝! –

+0

偉大的工作,我已經添加了一些必要的小改動,使其開箱即用(希望他們能夠被接受)。 只需在onNewIntent(Intent intent)中調用processNfcIntent(intent),或者無論您想使用它。 –

相關問題