收藏
回答

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)
      }
    })
  })

}

回答关注问题邀请回答
收藏

6 个回答

  • 黄同学
    黄同学
    2022-05-30

    解决了

    2022-05-30
    有用
    回复
  • 王景
    王景
    2022-01-12

    从NFC中M1卡的协议逻辑来看,需要先Load key,然后auth,最后才能够读,都是通过transceive这个函数,但是我这边拼接完成apdu指令之后,提示的却是13017 system internal error 相关读写操作失败?这是为何?

    2022-01-12
    有用
    回复 2
    • lee
      lee
      2023-03-21
      大佬,这块的源码可以分享一下吗
      2023-03-21
      回复
    • 王景
      王景
      01-30回复lee
      公司源码怎么可能分享啊,兄弟!
      01-30
      回复
  • 水风轻
    水风轻
    2021-04-26

    所有的读写卡验密操作前 必须先isconnected

    2021-04-26
    有用
    回复
  • DMfire
    DMfire
    2021-01-30

    您好,请问解决了嘛?

    2021-01-30
    有用
    回复
  • Finley
    Finley
    2020-12-04

    顶一下,问题相同

    2020-12-04
    有用
    回复
  • 读书人@看书人
    读书人@看书人
    2020-11-22

    您好,请问解决了嘛?

    2020-11-22
    有用
    回复
登录 后发表内容
问题标签