2015-10-09 52 views
1

我需要開發一款能夠讀取包含大約8 kB二進制數據的NfcV標籤的Android應用程序。一個標籤塊是8個字節。訪問2k字節以上的NFC標籤內存

我寫了下面的代碼:

for (int i = 0; i < 256; ++i) 
    { 
     byte[] cmd = new byte[] { 
      0x02, 
      0x20, 
      (byte)i   // Block number 
     }; 
     byte[] block = nfcV.transceive(cmd); 

     for(int j = 0; j < 8; ++j) this.sensorData[i * 8 + j] = block[j + 1]; 
    } 

但是這讓我只讀了第一2K字節的標籤(8個字節的256塊)。

如何讀取所有8 kByte?

不幸的是我有關於標籤的一些信息。我知道它是由德州儀器生產的,Taginfo應用程序表示它與ISO/IEC 15693-3和ISO/IEC 15693-2兼容。

回答

1

您正在使用READ SINGLE BLOCK命令(命令代碼0x20)從ISO/IEC 15693標籤讀取。該標準僅爲從0到255的塊地址定義了READ SINGLE BLOCK命令。因此,由於您的標籤似乎具有8個字節的塊大小,因此此命令將您限制爲標籤內存的前2 KB。

超出此地址空間的讀取未由ISO/IEC 15693標準定義。因此,這取決於您使用的標籤類型,因此您應該查閱標籤的用戶手冊。有些廠家標籤通過定義一個協議擴展克服這個地址空間的限制(見Protocol_Extension_flag在命令的請求標誌字節)

byte[] cmd = new byte[]{ 
      (byte)0x08, //Protocol_Extension_flag=1 
      (byte)0x20, //READ SINGLE BLOCK 
      (byte)(address & 0x00FF), (byte)((address>>8) & 0x00FF) 
}; 

但是,如果你的標籤支持這個特定的協議擴展,這隻會工作。根據您的標籤類型,標籤也可以使用其他方法來處理剩餘的內存。

另請注意,有些Android設備無法正確使用未解決的ISO/IEC 15693命令。因此,堅持尋址版本的命令通常會更好。上面的命令(Addressed_flag集並列入命令標籤的UID)的討論版本將是這樣的:

byte tagId = nfcV.getTag().getId(); 
byte[] cmd = new byte[]{ 
      (byte)0x28, //Addressed_flag=1, Protocol_Extension_flag=1 
      (byte)0x20, //READ SINGLE BLOCK 
      (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, // placeholder for UID 
      (byte)(address & 0x00FF), (byte)((address>>8) & 0x00FF) 
}; 
System.arraycopy(tagId, 0, cmd, 2, 8); 

在上述兩種情況下,你可以試試Data_rate_flag(標誌的第二個最低位的變化字節)和Sub-carrier_flag(標誌字節的最低位),但我不確定Android設備將如何處理這個問題。

+1

發送命令[0x08,0x20]會導致「標記丟失」異常,這聽起來很奇怪,因爲如果接受不到命令,我期待返回值[0x01,0x02](「命令未被識別」 ),沒有例外? – Carlo

+0

@CarloCecchi您可能想嘗試將標誌字節設置爲0x0A。 (你可能想嘗試命令的編址版本。) –

+0

我嘗試了0x02,0x08和0x20位的所有組合,但我總是得到一個「標記丟失」的錯誤,除了只有0x02。你能解釋一下我解釋了什麼意思嗎?我想念這一點。謝謝。 – Carlo