1 回答

TA貢獻1752條經驗 獲得超4個贊
MIFARE Ultralight 和 NTAG 標簽的內存被組織成每頁 4 字節的頁面。因此,WRITE 命令 ( MifareUltralight.writePage()
) 一次寫入 4 個字節。(請注意,READ 命令 ( MifareUltralight.readPages()
) 一次讀取 4 頁(= 16 字節)。
因此,當您想寫入您的 NTAG216 標簽時,您需要將數據拆分為 4 個字節的塊。您似乎已經在代碼中使用 for 循環這樣做了(盡管您會遇到一些問題,因為如果您的數據不是頁面對齊的,則您不會清除最后一頁的未使用字節)。
并非 MIFARE Ultralight/NTAG 標簽的所有頁面都可自由用于數據存儲。只有第 4 頁到第 225 頁(對于 NTAG216)中的用戶存儲區是。前 2 頁(第 0 頁和第 1 頁)是只讀的,并為標簽序列號保留。接下來的 2 頁(第 2 頁和第 3 頁)包含一次寫入內存(即曾經寫入 1 的位不能再次更改為 0 的內存區域)。具體來說,第 2 頁中有鎖定位(也在第 226 頁中,但如果您的數據只有 457 字節,則不應觸及它們)。如果您設置了鎖定位,則會阻止對部分用戶內存頁面的寫訪問,這將導致“收發失敗”異常。因此,如果 PAGE_OFFSET 的值小于 4,您可能會通過將數據寫入保留內存區域而使標記無法使用。
一般來說,如果您只想存儲(可自由讀取的)數據并且不會使用標簽的附加功能(例如密碼保護),我強烈建議您不要使用低級 IO 方法進行訪問NFC 標簽。相反,堅持使用 NDEF 抽象層并將您的數據存儲在 NDEF 記錄中。然后,Android 會負責將數據放入任何 NFC 標簽上的適當內存位置。
最后,收發長度是一個命令或響應中可以傳輸的字節數。因此,例如,對于 WRITE 命令,這總共將是 6 個字節(4 個字節的數據有效載荷、1 個地址字節和 1 個命令代碼字節)。對于 READ 響應,這將是 16 字節的數據負載。的值getMaxTransceiveLength()
表示底層庫、HAL 和硬件理論上可能的最大收發長度。
添加回答
舉報