小程序读取nfc卡默认有个唯一身份标签id,一般是数字+字母组合
可能对于物理卡号定义不同
之前以为是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()
},
}
...