第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何正確寫入 MifareUltralight NFC 標(biāo)簽?

如何正確寫入 MifareUltralight NFC 標(biāo)簽?

喵喵時光機 2021-06-29 17:57:57
使用該MifareUltralight.writePage()方法的正確方法是什么?查詢該getMaxTransceiveLength()方法返回 253 個字節(jié)。然而,該標(biāo)簽以 888 字節(jié)進行廣告。是transceive(),因此writePage()應(yīng)該被調(diào)用多次?正在寫入的有效負(fù)載的大小為 457 字節(jié)。        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條經(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ā)長度。


查看完整回答
反對 回復(fù) 2021-07-07
  • 1 回答
  • 0 關(guān)注
  • 480 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號