窮遍全網沒有資料,最后找到了官方的寄存器文檔和StackOverflow上找到了解決方案
首先要用 MifareUltralight 來進行操作,在onNewIntent處先校驗返回的tag是否包含了MifareUltralight 這個功能
開啟和關閉密碼保護功能,是在NFC tools pro這個軟件上看到的,但是包括nxp官方的androidnfclib里都沒有提及怎么使用
首先通過
val mfc = MifareUltralight.get(tag);
獲取MifareUltralight操作對象
接下來說一下開啟密碼保護的流程,首先要認證PWD_AUTH,這個步驟是校驗密碼,一般來說默認密碼是4字節的0XFF,接下來如果正確會返回PACK,這個PACK的作用相當於另外一個校驗,認證PWD_AUTH
之后會把芯片中的PACK返回來用於確認,PACK相當於開發和NFC卡兩者知道的一個校驗,官方文檔如下解釋
這兩步都通過后就可以改寫PWD和PACK了
通過
mfc.transceive
命令去寫存儲器:
// set PACK: mfc.transceive( byteArrayOf( 0xA2.toByte(), 0x2C, /*PAGE 44*/ pack[0], pack[1], 0, 0 // Write PACK into first 2 Bytes and 0 in RFUI bytes ) ) // set PWD: 設置密碼為用戶設置的密碼 mfc.transceive( byteArrayOf( 0xA2.toByte(), 0x2B, /*PAGE 43*/ pwd[0], pwd[1], pwd[2], pwd[3] // Write PACK into first 2 Bytes and 0 in RFUI bytes ) )
然后設置 ,這個存儲器起到錯誤密碼驗證嘗試次數的限制,同時第42頁的第一個字節的第7位PROT用於定義是只開啟寫保護還是讀寫保護都開啟,這里我只是開啟了寫保護,密碼嘗試次數也是禁用了
// set AUTHLIM: 設置錯誤次數限制 val responseAuthLim = mfc.readPages(42) if (responseAuthLim != null && responseAuthLim.size >= 16) { val prot = false // false = PWD_AUTH for write only, true = PWD_AUTH for read and write val authLim = 0; //0-7 mfc.transceive( byteArrayOf( 0xA2.toByte(), 42, (responseAuthLim[0] and 0x078 or (if (prot) 0x080.toByte() else 0x000) or ((authLim and 0x007).toByte())).toByte() , responseAuthLim[1], responseAuthLim[2], responseAuthLim[3] //將1-3位按原數據寫會 ) ) }
最后再設置AUTH0,這個AUTH0才是實際上控制是否啟用密碼保護功能的存儲器,設置為FF(高與配置最后一頁)就實際上是禁用了密碼保護,建議根據實際需求開啟頁保護,我這里實際上只開啟了00頁
//設置Auth0 auth0實際控制是否啟用密碼保護 val responseAuth0 = mfc.readPages(41) if (responseAuth0 != null && responseAuth0.size >= 16) { val prot = false; // false = PWD_AUTH for write only, true = PWD_AUTH for read and write val auth0 = 0; mfc.transceive( byteArrayOf( 0xA2.toByte(), 41, responseAuthLim[0], responseAuthLim[1], responseAuthLim[2], //將0-2位按原數據寫會 (auth0 and 0x0ff).toByte() ) ) }
順序執行完成后即可以開啟密碼保護,無法寫入,需要刪除密碼后才能寫入
刪除密碼就是把PWD PACK,AUTHLIM置為默認值,把AUTH0置為0xFF
完整代碼參考:https://github.com/yanjiepeng/TazanTagWritter/blob/master/README.md