小程序通过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()//需要移除回调,否则每初始化一次就会多一个回调