uniapp小程序读取nfc卡 物理卡号

188 阅读1分钟

小程序读取nfc卡默认有个唯一身份标签id,一般是数字+字母组合

e459399b7565881bf845c00d33fb4c30.jpg

可能对于物理卡号定义不同 之前以为是m1卡写入扇区的要密钥a或b解密,但客户端又说没用到解密密钥。 后来让客户端截图看了下,发现只是把标签id数据读取成十六进制,再排序,再转成十进制 物理卡号就显示成一样了

获取标签id

...
methods:{
// nfc 回调中
 handleDiscoveredCard(res) {
      try {
        // 获取物理卡号(UID)并转换为十六进制字符串  5A6D7A39
        const uidHex = this.buf2hex(res.id)
        // 更新状态  964324698
        const cardNumber = this.processCardNumber(uidHex)  
      } catch (error) {
        console.error('卡片处理错误:', error)
      }
    },
    // 将ArrayBuffer转换为十六进制字符串
    buf2hex(buffer) {
      if (!buffer) return ''
      return Array.from(new Uint8Array(buffer))
        .map(b => b.toString(16).padStart(2, '0'))
        .join('')
        .toUpperCase()
    },

    // 处理卡号转换逻辑
    processCardNumber(hexStr1) {
      let cardNumber = hexStr1

      // 简单实现高低位转换(具体逻辑可能需要根据实际情况调整)
      cardNumber = this.downUpChange(hexStr1)

      // 简单实现十六进制转十进制(具体逻辑可能需要根据实际情况调整)
      cardNumber = this.hexToDecimal(cardNumber)

      return cardNumber
    },

    // 简单实现高低位转换(具体逻辑可能需要根据实际情况调整)
    downUpChange(hexStr) {
      // 这里只是一个示例实现,实际逻辑可能需要根据具体情况调整
      const bytes = hexStr.match(/.{2}/g)
      if (bytes) {
        bytes.reverse()
        return bytes.join('')
      }
      return hexStr
    },

    // 简单实现十六进制转十进制(具体逻辑可能需要根据实际情况调整)
    hexToDecimal(hexStr) {
      return parseInt(hexStr, 16).toString()
    },
}
...