您正在使用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設備將如何處理這個問題。
發送命令[0x08,0x20]會導致「標記丟失」異常,這聽起來很奇怪,因爲如果接受不到命令,我期待返回值[0x01,0x02](「命令未被識別」 ),沒有例外? – Carlo
@CarloCecchi您可能想嘗試將標誌字節設置爲0x0A。 (你可能想嘗試命令的編址版本。) –
我嘗試了0x02,0x08和0x20位的所有組合,但我總是得到一個「標記丟失」的錯誤,除了只有0x02。你能解釋一下我解釋了什麼意思嗎?我想念這一點。謝謝。 – Carlo