亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何正確寫入 MifareUltralight NFC 標簽?

如何正確寫入 MifareUltralight NFC 標簽?

喵喵時光機 2021-06-29 17:57:57
使用該MifareUltralight.writePage()方法的正確方法是什么?查詢該getMaxTransceiveLength()方法返回 253 個字節。然而,該標簽以 888 字節進行廣告。是transceive(),因此writePage()應該被調用多次?正在寫入的有效負載的大小為 457 字節。        val jsonString = Gson().toJson(casualty)          val casualtyBytes = toBlob(casualty)        var currentPage = PAGE_OFFSET        val pageBytes = ByteArray(MifareUltralight.PAGE_SIZE)        var byteIndex = 0        for(i in 0 until casualtyBytes.size){            pageBytes[byteIndex] = casualtyBytes[i]            byteIndex++            if(byteIndex == 4 || i == (casualtyBytes.size-1)) {                tag.writePage(currentPage, pageBytes)                currentPage++                byteIndex = 0            }        }fun toBlob(item : Any) : ByteArray{    val bos = ByteArrayOutputStream()    val gzip = GZIPOutputStream(bos) //compress    val oos = ObjectOutputStream(gzip)    oos.writeObject(item)    oos.close()    return bos.toByteArray()}例外java.io.IOException: Transceive failed    at android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:52)    at android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151)    at android.nfc.tech.MifareUltralight.writePage(MifareUltralight.java:193)    at some.package.nfc.NfcCasualtyPublisher.writeToTag(NfcCasualtyPublisher.kt:42)    at some.package.nfc.NfcCasualtyPublisher.access$writeToTag(NfcCasualtyPublisher.kt:11)    at some.package.nfc.NfcCasualtyPublisher$publishCasualty$1.run(NfcCasualtyPublisher.kt:21)    at java.lang.Thread.run(Thread.java:818)
查看完整描述

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 和硬件理論上可能的最大收發長度。


查看完整回答
反對 回復 2021-07-07
  • 1 回答
  • 0 關注
  • 514 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號