最近来了个离谱的需求,要用微信小程序读写NFC卡数据,微信官方文档可以说是垃圾的一批了,啥都没有,踩了好几天坑把整体思路记录一下。
如果需要DEMO可直达下载链接:https://download.csdn.net/download/weixin_65984842/87703559
首先调用微信自带的方法。
const adapter = wx.getNFCAdapter(); //调用wx.getNFCAdapter()获取NFC适配器实例然后在onload中利用onDiscovered监听卡片,正常都会返回一个data,里面有ID还有techs,如果是NDEF卡还会返回一个messages,直接操作messages就可以了比较简单,M1是加密卡需要调用getMifareClassic方法
adapter.onDiscovered(res => { console.log("读取到卡片了", res); let tagId = res.id; //如果是M1卡,这个ID是需要用于读取的秘钥 let ssid = _this.buf2hex(tagId) //转换数据格式 console.log("获取到tagID:", ssid); this.setData({ssid}); this.isCardTypeRead(res,adapter); })M1卡的读取方法,这里比较费劲,需要知道你卡片的厂商给的秘钥信息,如果你会暴力破解就当我没说
let adapter = that.data.Nfcadapter; if (adapter.tech.mifareClassic) { console.log("发现" + adapter.tech.mifareClassic + "卡"); let mifareClassic = adapter.getMifareClassic(); mifareClassic.connect({ success: (res) => { const {ssid,cardPwda } = _this.data console.log("设备已连接", res); console.log("开始拼接验密指令。。。"); let arr = [0x60, 0x00] //查询扇,后边需要拼接上秘钥, let newCardPsd = new Uint8Array(cardPsd) //转换命令格式 let newArr = [...arr,...newCardPsd] //把查询扇区的初始跟查询ID拼接到一起 console.log('read',newArr) // 0x60, //指令类型 // 0x00, //扇区读取位置 00就是读取所有,09就是第二扇区第二块 // 0x11, 0x22, 0x33, 0x44, //秘钥A // 0xff, 0xff, 0xff, 0xff, 0xff,0xff //秘钥B,根据卡片厂商给的信息写通常都是固定的或者跟A一样 var arrayBuffer = new Uint8Array(arr).buffer; console.log("解密指令为:", arrayBuffer); console.log("解密指令为:", arr); mifareClassic.transceive({ data: arrayBuffer, success: function (res) { console.log("connect发送数据并解密成功, 接收数据如下:", res); console.log('connect发送数据并解密成功, 接收数据如下:', that.buf2hex(res.data)); }, fail: function (err) { console.log("connect发送数据失败A", err); }, }); }, }); // 向标签发送读取指定块数据的命令,以验证标签是否已经连接成功。 mifareClassic.isConnected({ success: function (isConnected) { console.log("isConnected成功连接", isConnected); var arr02 = [0x30, 0x00]; //第二位0x00以为读取从0开始的所有扇区 var arrayBuffer02 = new Uint8Array(arr02).buffer; console.log(arrayBuffer02); mifareClassic.transceive({ data: arrayBuffer02, success: function (res) { console.log("读取数据:", res); let hexArr = Array.prototype.map.call( new Uint8Array(res.id), function (bit) { return ("00" + bit.toString(16)).slice(-2); } ); let strCode= hexArr.join(""); console.log('isConnected转换后的',strCode); that.setData({ nfcMsg: str, }); mifareClassic.close({ success: (res) => { console.log("清除标签连接成功"); }, fail: (error) => { console.error("清除标签连接失败"); }, complete: (res) => { console.log(res); }, }); }, fail: function (err) { console.log("失败", err); }, }); }, }); }