NfcA 连接扇区写入,读取写入验证密钥指令说明
说明
带有密钥验证的卡,必读每次在读 或者写时都要先验证在读写, 不然就会失败
指令
通常的是 指令(1字节)+要操作的块(1字节) + 14个内容字节
扇区: 小程序没有扇区的概念因为NFC块都是连续的, 所以一般卡16个扇区, 每个扇区4个块, 对于小程序来说就是 0~63 块共计64块
例如 :
1扇区 第0块 小程序对应的就是第0块
2扇区 第3块 小程序对应的就是第8块 以此类推
验证指令: 0x60
\[0x60\]+要操作的块\[0x01\]+卡的ID\[0xde, 0x63, 0x35, 0x9c,\]+秘钥\[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\]
写入或读取不同的块 要验证不同的块, 比如读取 0x01 块 要操作的块就要写\[0x01\]
当要要操作 16扇区第3块时, 小程序的要操作的块就要写\[0x3f\]十进制63
读取指令: 0x30
\[0x30,0x01\] : 读取第0个扇区第二块,
写入指令: 0xa0
\[0xa0,0x09,0xff, 0xff, 0xff, 0xff, 0xff, 0xff\] : 在第9块写入 6个字节的数据
我的这个卡写入时必须要组合成 18个字节才能写入, 少于或多都会写入失败
\[指令(0xa0),块号(0x09),…16个字节\].length = 18, 内容不够的填充FF或者填充其他的内容, 数组必须凑够18个元素
例如:
const params = {
cmd: 0x60, // 验证指令
block: 0x01, // 块
cardId: [0xde, 0x63, 0x35, 0x9c], // 卡片id 获取从 NFCAdapter.onDiscovered((res)=>{ // res中含有卡片id });
key: [0xff, 0xff, 0xff, 0xff, 0xff, 0xff], // 验证密钥
};
const arr = [params.cmd, params.block, ...params.cardId, ...params.key];
const writeBuffer = new Uint8Array(arr).buffer;
const NFCAdapter = wx.getNFCAdapter();
const NFCType = NFCAdapter.getNfcA();
// 验证密钥
NFCType.transceive({
data: writeBuffer,
success: function(res) {
console.log("解密成功, 接收数据如下:", res);
// 开始读写
},
fail: function(err) {
console.log("解密失败", err);
log.push("解密失败" + checkErr(err));
},
});