2016-08-25 40 views
1

我是Xamarin以及Android開發新手。我有一個NFC標籤,特別是ST M24LR64E,上面有數據。我可以使用Google Play上的ST應用查看數據塊。在我的Xamarin應用程序中,我無法發送消息給標籤而沒有收到TagLostException。我可以毫無問題地查詢標籤ID,但試圖讀取單個數據塊時,我得到異常。任何方向將不勝感激。Xamarin和ST M24LR標籤NFC-V「標籤丟失」異常

byte[] response = new byte[] { 0x0A }; 

byte[] cmd = new byte[] 
{ 
    (byte) 0x26, 
    (byte) 0x01, 
    0x00 
}; 
response = nfcv.Transceive(cmd); 

byte[] single = new byte[] 
{ 
    (byte) 0x40, // FLAGS 
    (byte) 0x20, // READ_SINGLE_BLOCK 
    0, 0, 0, 0, 0, 0, 0, 0, 
    (byte) (0 & 0x0ff) 
}; 
Array.Copy(id, 0, single, 2, 8); 
response = nfcv.Transceive(single); 

第一個Transceive()是好的,我看到10個字節回來。只要我嘗試讀取一塊數據,我就會得到TagLostException。

+0

您似乎從我的答案中複製了READ_SINGLE_BLOCK命令(請參閱[這裏](http://stackoverflow.com/a/38783006/2425802))。不幸的是,該答案中使用的標誌字節是錯誤的。您應該使用0x20(而不是0x40)來指示尋址的版本。我假設'id'包含從'tag.GetId()'(或'nfcv.GetTag()。GetId()')獲得的標籤UID。 –

+0

此外,Android已經爲您執行INVENTORY請求,因此無需重新發布該請求。您可以通過來自'NfcV'對象的庫存請求獲取Android獲取的所有信息。 –

+0

謝謝@MichaelRoland - 但將標誌更改爲0x20仍然會產生標籤丟失異常。 – AndySousa

回答

1

使用NfcV標籤技術,TagLostException可能表示閱讀器不能再與標籤進行通信,或者該命令導致錯誤。

根據它manual,所述M24LR64E僅支持READ_SINGLE_BLOCK命令的擴展版本(協議擴展標誌集):

的Protocol_extension_flag應設置爲1用於M24LR64E-R正確操作。如果Protocol_extension_flag爲0,則M24LR64E-R將返回一個錯誤代碼。

因此,您的READ_SINGLE_BLOCK命令版本與標記不兼容。您需要設置協議擴展標誌並提供一個16位塊號。應該工作的版本是:

int blockNumber = 0; 
byte[] readSingleBlock = new byte[] { 
     (byte) 0x28, // Flags: Addressed (bit 5), Protocol Extension (bit 3) 
     (byte) 0x20, // Command: READ_SINGLE_BLOCK 
     0, 0, 0, 0, 0, 0, 0, 0, // placeholder for UID 
     (byte) (blockNumber & 0x0ff), 
     (byte) ((blockNumber >> 8) & 0x0ff) 
}; 
byte[] id = nfcv.GetTag().GetId(); 
Array.Copy(id, 0, readSingleBlock, 2, 8); 
response = nfcv.Transceive(readSingleBlock); 

既然你與庫存命令使用的高數據速率(Data_rate標誌),您可能還需要使用高數據速率與READ_SINGLE_BLOCK命令。在這種情況下,您將使用標誌值0x2A(而不是0x28)。

最後,您應該避免通過任何NfcX標籤工藝對象發送反衝突/枚舉命令,例如INVENTORY命令。雖然這可能會起作用,但您可能會混淆ANdroid NFC堆棧的內部狀態,因爲它已經爲您執行了這些命令並跟蹤了枚舉的標記。你可以得到所有你將通過從Tag對象庫存請求和NfcV對象得到以下信息:

  • tag.GetId()爲您提供了標籤的UID。
  • nfcv.GetDsfId()爲您提供標籤的DSFID。
  • nfcv.GetResponseFlags()爲您提供INVENTORY響應的標誌字節。
+0

非常感謝您的幫助。它解決了我的問題,然後一些人,第一次讓它工作,使我相信這一切都很好......自從將它擴展到將所有數據讀回來之後。再次感謝 – AndySousa