【小程序NFC通信】小程序通过NFC与设备通讯

小程序通过NFC与设备通讯

下面是我的成功实例,记录一下

utils/device.js

// nfc硬件交互
let nfc = wx.getNFCAdapter()//获取 NFC 实例
let isoDep = nfc.getIsoDep()//获取 isoDep 实例
class StartNFC{//通信前准备
  constructor(){
    this.compatibility()
  }
  compatibility = ()=>{//先看看用户手机是否兼容nfc操作
    wx.getSystemInfoAsync({
      success:res=> {
        // console.log("先看看用户手机是否兼容nfc操作",res)
        let system = res.system.split(" ")
        // console.log(system,parseInt(system[1]) )
        if(system[0]=="Android" && parseInt(system[1]) >=5){//ios暂时不支持
          this.getNFCAdapter()
        }else{
          wx.showToast({
            title: '当前设备不支持NFC功能',
            icon: 'none'
          })
        }
      }
    })

  }
  
  getNFCAdapter(){//NFC 实例,开启读卡功能
    nfc.startDiscovery({
        success:res=> {//已经成功开启读卡功能
            nfc.onDiscovered(this.discoverHandler)//贴卡,onDiscovered 回调
        },
        fail(err) {
          console.log(err)
          if(!err.errCode){
              wx.showToast({
                title: '请检查NFC功能是否正常!',
                icon: 'none'
              })
              return
            }
            switch (err.errCode) {
                case 13000:
                  wx.showToast({
                    title: '设备不支持NFC!',
                    icon: 'none'
                  })
                  break;
                case 13001:
                  wx.showToast({
                    title: '系统NFC开关未打开!',
                    icon: 'none'
                  })
                  break;
                case 13019:
                  wx.showToast({
                    title: '用户未授权!',
                    icon: 'none'
                  })
                  break;
                case 13010:
                  wx.showToast({
                    title: '未知错误!',
                    icon: 'none'
                  })
                  break;
            }
        }
    })
  }
  //移除 NFC Tag的监听函数
  offDiscovered(){
    nfc.offDiscovered(this.discoverHandler)
  }
  discoverHandler=res=> {//匹配到卡片支持 ISO-DEP 标准
    console.log(res) //拿到了techs数组,用于匹配NFC卡片具体可以使用什么标准(NfcA等实例)处理
    let {techs} = res
    if(techs.includes('ISO-DEP')){
      wx.showToast({
        title: '贴卡成功,可进行通信操作',
        icon: 'none'
      })
    }else{
      wx.showToast({
        title: '该设备不支持ISO-DEP标准',
        icon: 'none'
      })
    }
  }
}

class WriteNFC{//写入数据
  constructor(x, y) { //传入需要写入的数据
    this.arr = x;
    this.arr2 = y;
    this.getIsoDep()
  }
  getIsoDep=()=>{//这里可以写一写自己的业务逻辑
    var _this = this;
    isoDep.connect({//连接 NFC 标签
      success:res =>{

      /* 根据设备通信协议写入数据 */
      this.transceiveFunc(this.arr,res=>{
      	//成功
        console.log("得到设备返回内容"+res)
      },err=>{
        //失败
      })
  }

  refreshcmd(){//这里也可以写一写自己的业务逻辑
      let arr = [0xF0,0xd4,0x05,0x81,0x00]
      this.transceiveFunc(arr,res=>{//再次写入新byte数据(在演示一遍,跟getIsoDep同理)
       //这里写成功逻辑
      },err=>{
        //这里写失败逻辑
      })
  }
  

  transceiveFunc(arr, doSuccess, doFail){//这里是封装的写入数据的方法,上边调用了
    isoDep.transceive({
      data:new Uint8Array(arr).buffer,
      success:res=>{
        let resbuf = res.data
        doSuccess(this.ab2str(resbuf));
      },
      fail:error=>{
        doFail(error)
        return
      }
    })
  }

  ab2str(buffer) {//ArrayBuffer转16进度字符串
    const hexArr = Array.prototype.map.call(
      new Uint8Array(buffer),
      function (bit) {
        return ('00' + bit.toString(16)).slice(-2)
      }
    )
    return hexArr.join('')
  }
}

class EndNFC{
  constructor(){
    this.isoDepClose()
    this.stopDiscovery()
  }
  isoDepClose=()=>{//断开连接
    isoDep.close({
      success:res =>{
        console.log("断开连接成功",res)
      },
      fail:error =>{
        console.log('断开连接失败',error)
      }
    })
  }
  stopDiscovery=()=>{//结束监听贴卡
    nfc.stopDiscovery({
      success:res=> {
          console.log("结束监听贴卡成功",res)
      },
      fail(err) {
          console.log("结束监听贴卡失败",err)
      }
    })
  }
}
module.exports = {
  StartNFC,WriteNFC,EndNFC
}

template.js (调用)

1、引用
var GetNfc = require('./utils/device.js');

2、初始化NFC
let NFC = new GetNfc.StartNFC()

3、写入数据(byte数组数字格式:[0,225,31,54,0,255])
new GetNfc.WriteNFC(arr.map(Number),arr2.map(Number))


4、结束nfc
new GetNfc.EndNFC()
NFC.offDiscovered()//需要移除回调,否则每初始化一次就会多一个回调

微信小程序支持NFC(Near Field Communication)的读写功能,可以通过对NFC标签的读取和写入实现与设备的交互。在微信小程序中,可以通过wx.startHCE()方法启动HCE服务,使手机模拟一个NFC片。可以通过wx.onHCEMessage()方法监听HCE服务接收到的消息,并通过wx.sendHCEMessage()方法发送消息。这样,可以实现小程序与其他NFC设备之间的通信。 要使用NFC读写功能,首先需要在小程序的app.json文件中声明NFC权限。例如,在"permission"字段中添加"nfc"权限。然后,在小程序的页面中,使用wx.startHCE()方法来启动HCE服务。在启动HCE服务之后,可以监听HCE服务接收到的消息,并处理这些消息。可以使用wx.onHCEMessage()方法来监听HCE服务接收到的消息,并在回调函数中处理这些消息。同时,可以使用wx.sendHCEMessage()方法来向HCE服务发送消息。 需要注意的是,NFC读写功能在不同的手机上的支持程度可能会有所差异。在使用NFC读写功能时,建议进行兼容性测试,并提供适当的错误处理机制,以确保用户的良好体验。 总结起来,要在微信小程序中实现NFC的读写功能,需要进行以下步骤: 1. 在app.json文件中声明NFC权限。 2. 使用wx.startHCE()方法启动HCE服务。 3. 使用wx.onHCEMessage()方法监听HCE服务接收到的消息,并进行处理。 4. 使用wx.sendHCEMessage()方法向HCE服务发送消息。 希望以上信息对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值