1、获取NFCAdapter实例对象
NFCAdapter = wx.getNFCAdapter();
2、启动监听NFC标签
NFCAdapter.startDiscovery({
success: res => {
this.title = '请将设备放入识别区NFC';
console.log(res);
},
fail: error => {
this.title = '刷新重试';
console.error(error);
},
complete: res => {
console.log(res);
}
});
3、初始化监听回调事件
NFCAdapter.onDiscovered(callback => {
});
这个时候就完成初始化,将标签放入识别区
4、设备放入识别区后,监听回调返回的对象callback 中处理获取到的标签内容
let aid = parseInt(ab2hex(callback.id), 16);
if (callback.messages) {
let cordsArray = callback.messages[0].records;
cordsArray.find(item => {
this.read.payload = byteToString(new Uint8Array(item.payload));
this.read.id = byteToString(new Uint8Array(item.id));
this.read.type = byteToString(new Uint8Array(item.type));
});
}
这个是数据转换方法
/**
* 字节对象转字符串
* @param {Object} arr
*/
const byteToString = function(arr) {
if (typeof arr === 'string') {
return arr;
}
var str = '',
_arr = arr;
for (var i = 0; i < _arr.length; i++) {
var one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/);
if (v && one.length == 8) {
var bytesLength = v[0].length;
var store = _arr[i].toString(2).slice(7 - bytesLength);
for (var st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2);
}
str += String.fromCharCode(parseInt(store, 2));
i += bytesLength - 1;
} else {
str += String.fromCharCode(_arr[i]);
}
}
return str;
};
/**
* 格式化得到aid值
* @param {Object} buffer
*/
const ab2hex = function(buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2);
}
);
return hexArr.join('');
};
5、这个时候就开始写入了——获取NDEF对象就是NFCAdapter.getNdef()
// 获取NDEF对象
NFCTab = NFCAdapter.getNdef()
// 连接标签
NFCTab.connect({
success: res => {
this.title = '连接设备成功';
console.log(res);
},
fail: error => {
this.title = '连接设备失败';
console.error(error);
},
complete: res => {
console.log(res);
}
});
/** 这里我做了同步处理,代码就不贴上来了 */
// 准备写入的数据
const records = [
{
id: string2ArrayBuffer(this.id),
payload: string2ArrayBuffer(this.payload),
type: string2ArrayBuffer(this.type),
tnf: 2
}
];
// 注:tnf这个字段我参照别踩过的坑看到的,具体详情自行百度
// 执行写入
NFCTab.writeNdefMessage({
records: records,
success: res => {
this.title = '数据写入成功';
console.log(res);
},
fail: error => {
this.title = '数据写入失败';
console.error(error);
},
complete: res => {
this.closeConnect(NFCTab);
this.isWrite = false
this.title = "请将设备放入识别区NFC"
console.log(res);
}
});
// 关闭 连接
closeConnect(NFCTab) {
NFCTab.close({
success: res => {
this.title = '清除标签连接成功';
console.log('清除标签连接成功');
},
fail: error => {
this.title = '清除标签连接失败';
console.error('清除标签连接失败');
},
complete: res => {
console.log(res);
}
});
}
6、退出当前页或者退出小程序再把对象都清理一下
closeNFC() {
NFCAdapter.offDiscovered(callback => {});
NFCAdapter.stopDiscovery();
}