onLoad: function () { //调用wx.getNFCAdapter()获取NFC适配器实例 const adapter = wx.getNFCAdapter(); console.log("获取NFC实例", adapter) adapter.onDiscovered(res => { console.log("读取到卡片了", res); let tagId = res.id; console.log("获取到tagID:", tagId); if (res.techs.includes(adapter.tech.mifareClassic)) { console.log('发现' + adapter.tech.mifareClassic + '卡'); let mifareClassic = adapter.getMifareClassic(); mifareClassic.connect({ success: res => { console.log("设备已连接", res) console.log("开始拼接验密指令。。。"); var arr = [0x60, 0x04, 0x11, 0x22, 0x33, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]; var arrayBuffer = new Uint8Array(arr).buffer console.log("解密指令为:", arrayBuffer); mifareClassic.transceive({ data: arrayBuffer, success: function (res) { console.log('发送数据并解密成功, 接收数据如下:', res); }, fail: function (err) { console.log('发送数据失败A', err); } }) } }) mifareClassic.isConnected({ success: function (isConnected) { console.log('成功连接', isConnected); var arr02 = [0x30, 0x04]; var arrayBuffer02 = new Uint8Array(arr02).buffer mifareClassic.transceive({ data: arrayBuffer02, success: function (res) { console.log('读取数据:', res); }, fail: function (err) { console.log('失败', err); } }) } }); } }) adapter.startDiscovery({ fail(err) { console.log('failed to discover:', err) } }) }, onHide() { if (this.nfc) { this.nfc.stopDiscovery() } }
怎么使用MifareClassic.transceive 有读写扇区的列子程序没?如题
2021-04-26MifareClassic 是加密卡 在读写操作前需要验密
小程序NFC调MifareClassic.transceive读卡异常?[图片] 文档上对于接口的描述是发送数据 对于MifareClassic的分块读写 指令 0x30 + 块号 可以用于读取某个块的数据指令 0xA0 + 块号 + 待写入数据 可以用于往某个块写入数据我按照格式请求读卡返回的是: {"errMsg":"transceive:fail:system internal error","errCode":13017} [图片] 是我的data格式不正确? 相关回答
2021-04-26所有的读写卡验密操作前 必须先isconnected
MifareClassic.transceive 如何读写?微信小程序的文档上好像提到了 对于MifareClassic的分块读写 指令 0x30 + 块号 可以用于读取某个块的数据指令 0xA0 + 块号 + 待写入数据 可以用于往某个块写入数据https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareClassic.html 在搜索卡的过程中,能看到命令行打印的日志是支持 MifareClassic的 但是我们在读数据的时候遇到了问题,按道理来说下面的代码应该读取到一块的数据,但是每次不管是读什么卡返回的都是 0x04 (请问是不是读取卡片之前,还需要其它的命令,例如授权,希望有大神可以出来指点一下) const READ_FIRST = '3000' // 十六进制命令字符串 读取第一块的数据 var adapter = null async function testNFC() { adapter = wx.getNFCAdapter() console.log('wx.getNFCAdapter', adapter) initAdapter(adapter) try { // 小程序api promise化的帮助函数 let res = await utils.apiPromise(adapter.startDiscovery) console.log('startDiscovery', res) } catch (e) { console.log(e) utils.showMsg('nfc识别失败,错误码' + e.errCode + `错误信息:${e.errMsg}`) } } function initAdapter(adapter) { // 监听发现卡片的事件 adapter.onDiscovered(async function (card) { console.log('onDiscovered', card) adapter.stopDiscovery() adapter.offDiscovered() let res = {} const instance = adapter.getMifareClassic() instance.connect({ success: async res => { let res1 = {} res1 = await runCommand(instance, READ_FIRST) // read first console.log(res1) }, fail: e => console.error(e) }) }) } function runCommand(instance, command) { console.log('runCommand', command) if (typeof command === 'string') { // 十六进制字符转ArrayBuffer 此函数不在此处列出 command = hexStringToArrayBuffer(command) } return new Promise(function(resolve, reject) { instance.transceive({ data: command, success: res => { // buffer 转十六进制字符串的函数 不在此处列出 console.log('runCommand success:', res, buf2hex(res.data)) resolve( buf2hex(res.data) ) }, fail: err => { console.log('runCommand error:', err) reject(err) } }) }) }
2021-04-26问题解决了,所有的读写卡验密操作前 必须先isconnected
MifareClassic.transceive 验密失败,求帮助在进行M1 s50卡的读写开发,但是在验密过程一直失败 验密指令:[0x60, 0x04, 0x55, 0xED, 0xA1, 0x3F,0xC3, 0x37, 0x21, 0xA4, 0x12, 0x68] 秘钥和ID号是正确的,(ps:但是ID号随便写什么,都和返回结果没关系) 返回结果是 {errMsg: "transceive:ok", data: ArrayBuffer(1)} data里面是 0: 0 其他的命令比如读、写、选卡等的话 可以成功 但是操作也是无效的,返回的结果大概是这种[-78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [图片]
2021-04-26