前言:記錄一下ios開發(fā)中NFC添加密碼功能镣奋,卡類型為(NFCMiFareTag -->NFCMiFareUltralight)胚股,調用的iOS方法為:sendMiFareCommand。
一盈魁、JS代碼實現(xiàn)奸柬,調用的ios原生NFC發(fā)送方法枷遂,針對卡類型為NTAG216的卡片。?NTAG212晋辆、NTAG213茴她、NTAG215、NTAG216的配置位置不同晌坤,所以只需查到卡類型的配置起始位置即可逢艘。NTAG216的配置起始位置為E3。
二骤菠、寫入密碼的過程(0xA2為寫入命令它改,0x30為讀取命令)
?let?pass?=?stringToBytes('1111');?//?密碼 ?必須為4位 ?stringToBytes為字符串轉byte方法;pass為數(shù)組商乎。
?let?pack?=?stringToBytes('11');??//?確認值 必須為2位
1搔课、寫入密碼到?E5位置 ,即起始位置E3+2;
sendCommand([0xA2, E5,?pass[0],?pass[1],?pass[2],?pass[3]]);
2截亦、將PACK(第E6頁,字節(jié)0-1)設置為所需的密碼確認(默認值為0x0000).
sendCommand([0xA2, E6,?pack[0],?pack[1],?0x00,?0x00]);
3爬泥、將AUTHLIM(第E4頁,字節(jié)0,位2-0)設置為最大失敗密碼驗證嘗試次數(shù)(將此值設置為0將允許無限次數(shù)的PWD_AUTH嘗試).將PROT(第E4頁,字節(jié)0,位7)設置為所需的值(0?=僅在寫訪問時需要PWD_AUTH,1?=讀和寫訪問需要PWD_AUTH).
let?response?= sendCommand([0x30,E4]); //讀取E4頁數(shù)據(jù)
let?response?=?readResponseE4.result;
let?prot?=?false; // false 為只加密寫 true為讀寫都加密
let?authlim?=?0;?
let writeResponse?= sendCommand([0xA2, E4,?((response[0]?&?0x078)?|?(prot???0x080?:?0x000)?|?(authlim?&?0x007)),?response[1],?response[2],?response[3]]);
4、將AUTH0(第E3頁,字節(jié)3)設置為應該要求密碼驗證的第一頁.
let?readResponseE3?= sendCommand([0x30,?0xE3]);?//讀取E3頁數(shù)據(jù)
let?writeResponseT?= sendCommand([0xA2,?index?-?2,?readResponseE3.result[0],?readResponseE3.result[1],?readResponseE3.result[2],?(0?&?0x0ff)]); //0為密碼要保護的開始位置崩瓤。
三袍啡、驗證密碼(0x1B為驗證命令)
sendCommand([0x1B,?pass[0],?pass[1],?pass[2],?pass[3]]); //驗證通過會返回pack值,還需要與本地驗證pack是否一致
四却桶、刪除密碼
首先需要驗證密碼境输,然后只需將AUTH0(即配置起始頁)設置為0x0ff即可蔗牡。
let?readResponse?= sendCommand([0x30,?E3]);
let?deleteStatu?= sendCommand([0xA2, E3,?response[0],?response[1],?response[2],?(0x0ff?&?0x0ff)]);
五、ios原生方法
需要將傳入的byte數(shù)組轉成data類型嗅剖。
- (void)sendMiFareCommand:(NSData *)command?completionHandler:(void(^)(NSData *response, NSError *?_Nullable?error))completionHandler API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(watchos, macos, tvos);
相關參考資料
https://stackoverflow.com/questions/34390476/how-to-remove-password-protection-in-ntag216