微信小程序之NFC近场通信

1,324 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

概念

近场通信(NFC),小程序读取NFC,这种功能大多数人用的较少,因为小程序大多数是为了用户使用方便,不管是IOS端和Android端都可以随扫随用,个人理解小程序的作用是:

  1. 方便用户随时使用操作
  2. 往app端引流 但是请注意:该NFC功能只限于Android系统,并且仅支持有NFC读取模块的手机使用!

读卡组件

当标签或者NFC卡片贴在设备背部时,设备默认会响震动播放提示音,这说明已经读取成功。

  • 读取成功做了什么
  1. 获取getNFCAdapter实例对象 在这之前不管之前有没有创建过该实例对象,都需要给它取消监听NFC TAG,根据之前踩过的坑,它会读取失败或者需要读取两次(因为创建了两次)
nfc.offDiscovered(wx.getNFCAdapter())
const nfc = wx.getNFCAdapter();
  1. 会判断扫描标签类型 首先标签会分为加密和不加密两种,其次是它的协议类型,如果加密则更复杂,甚至需要引入专门解密的包组件。
  1. NDEF格式,支持对支持该格式的标签进行读写
  2. NFCA,NFCB分别只支持NFC-A(ISO 14443-3A or 3B)的标签进行读写
  3. lsoDep只支持ISO-DEP(ISO 14443-4)的标签进行读写
  1. 监听读取标签的状态
  • 监听 注册标签监听,是首先读取的意思,类似于生命周期的第一步创建,把监听的方法放到onDiscovered()内。
nfc.onDiscovered(this.successNfc)

开始监听标签 进入到开始监听,意味着读卡成功或者失败,一般情况下只需要监听失败的就可以了,原因:读取成功会自动进入到数据处理的过程

nfc.startDiscovery({
 fail(err) {
    if (err.errCode == 13000) {}
    if (err.errCode == 13001) {}
    if (err.errCode == 13016) {}
  }
})

常见的错误码:

13000:设备不支持NFC; 13001:系统NFC开关未打开; 13016:连接失败

  • 读取成功 读取成功以Promis的形式返回,根据读取的区位不同,分别获取不同的数据;
that.successNfc= function (res) {
   var message =  res.messages && res.messages[0].records[0].payload
})

随后,把NFC扫描结果的ID转换为16进制,创建一个8位无符号整数值类型化数组。

  var hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function (bit) {
      return ('00' + bit.toString(16)).slice(-2)
    }
  )
  return hexArr.join('').toUpperCase();
  • 读取失败 读取失败后,可再次进行读取。读取失败的原因:
  1. 标签贴的时间太短
  2. 标签协议不支持

参考资料

NFCAdapter