NfcA 连接扇区写入,读取写入验证密钥指令说明
发布于 2 年前 作者 gzou 977 次浏览 来自 分享

说明

带有密钥验证的卡,必读每次在读 或者写时都要先验证在读写, 不然就会失败

指令

通常的是 指令(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));
		},
	});

回到顶部