1 回答

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