微信小程序的文档上好像提到了
对于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)
}
})
})
}
解决了
从NFC中M1卡的协议逻辑来看,需要先Load key,然后auth,最后才能够读,都是通过transceive这个函数,但是我这边拼接完成apdu指令之后,提示的却是13017 system internal error 相关读写操作失败?这是为何?
所有的读写卡验密操作前 必须先isconnected
您好,请问解决了嘛?
顶一下,问题相同
您好,请问解决了嘛?