var config = require("./NFCConfig"); var successCode = config.nfcSuccessCode(); var errorCode = config.nfcErrorCode(); var nfcAdapter = null; var isoDep = null; var isFirst = false; export function startScanNfcDevice(callBack) { isFirst = false; initNfcAdapter(function(res) { if (res.code == successCode) { console.log('初始化NFC适配器实例成功', res) //注册贴卡监听回调 nfcAdapter.onDiscovered(function(res) { console.log('监听回调到卡片了', res); if (!isFirst) { if (res.techs.includes(nfcAdapter.tech.isoDep)) { //获取isoDep实例 console.log('发现' + nfcAdapter.tech.isoDep + '卡'); isoDep = nfcAdapter.getIsoDep(); isFirst = true; callBack.call(this, { code: successCode, msg: "搜索卡片成功", data: isoDep }) } } }); //开始监听贴卡 nfcAdapter.startDiscovery({ success: function(res) { console.log('监听贴卡成功', res) }, fail: function(err) { console.log('监听贴卡失败', err) var msg = ""; if (err) { msg = nfcErrMsg(err.errCode) } callBack.call(this, { code: errorCode, msg: msg, data: null }) }, }) } else { //初始化NFC实例失败 callBack.call(this, res) } }) }; export function onDiscovered(callBack) { //注册贴卡监听回调 nfcAdapter.onDiscovered(discoverHandler); } export function offDiscovered(callBack) { //注册贴卡监听回调 nfcAdapter.offDiscovered(discoverHandler); } function discoverHandler(res, callBack) { if (res.techs.includes(nfcAdapter.tech.isoDep)) { //获取isoDep实例 console.log('发现' + nfcAdapter.tech.isoDep + '卡'); isoDep = nfcAdapter.getIsoDep(); callBack.call(this, { code: successCode, msg: "搜索卡片成功", data: isoDep }) } } export function startDiscovery(callBack) { //开始监听贴卡 nfcAdapter.startDiscovery({ success: function(res) { console.log('监听贴卡成功', res) }, fail: function(err) { console.log('监听贴卡失败', err) var msg = ""; if (err) { msg = nfcErrMsg(err.errCode) } callBack.call(this, { code: errorCode, msg: msg, data: null }) } }) } export function stopScanNfcDevice(callBack) { if (nfcAdapter != null) { nfcAdapter.stopDiscovery({ success: function(res) { callBack.call(this, { code: successCode, msg: "停止扫描成功", data: null }) }, fail: function(err) { var msg = ""; if (err) { msg = nfcErrMsg(err.errCode) } callBack.call(this, { code: errorCode, msg: msg, data: null }) } }) } else { callBack.call(this, { code: successCode, msg: "暂无NFC适配器实例", data: null }) } }; export function connectDevice(callBack) { if (isoDep != null) { isoDep.connect({ success: function(res) { console.log('连接卡片成功', res) callBack.call(this, { code: successCode, msg: "连接卡片成功", data: null }) }, fail: function(err) { var msg = ""; if (err) { msg = nfcErrMsg(err.errCode) } console.log("链接卡片失败:", err.errCode) callBack.call(this, { code: errorCode, msg: msg, data: null }) } }) } else { callBack.call(this, { code: errorCode, msg: "连接卡片不存在", data: null }) } }; export function disConnectDevice(callBack) { if (isoDep != null) { isoDep.close({ success: function(res) { callBack.call(this, { code: successCode, msg: "断开卡片成功", data: null }) }, fail: function(err) { var msg = ""; if (err) { msg = nfcErrMsg(err.errCode) } callBack.call(this, { code: errorCode, msg: msg, data: null }) } }) } else { callBack.call(this, { code: successCode, msg: "暂无连接卡片", data: null }) } }; export function sendMessageToDevice(cmdArr, callBack) { if (cmdArr.length <= 0) { callBack.call(this, { code: errorCode, msg: "发送数据不能为空", data: null }) return } var resultCmdArr = []; for (var i = 0; i < cmdArr.length; i++) { var sendbuf = hexStringToArrayBuffer(cmdArr[i]); isoDep.transceive({ data: sendbuf, success: function(res) { var resultCmd = arrayBufferToHexString(res.data); resultCmdArr.push(resultCmd); if (resultCmdArr.length == cmdArr.length) { callBack.call(this, { code: successCode, msg: "发送数据成功", data: resultCmdArr }) } }, fail: function(err) { if (i == 0) { console.log('发送数据失败', err); var msg = ""; if (err) { msg = nfcErrMsg(err.errCode) } callBack.call(this, { code: errorCode, msg: msg, data: null }) return } } }); } }; export function removeObj() { isoDep = null; nfcAdapter = null; } function initNfcAdapter(callBack) { nfcAdapter = wx.getNFCAdapter() //获取NFC适配器实例 console.log("获取NFC适配器实例:", nfcAdapter); if (nfcAdapter != null) { callBack.call(this, { code: successCode, msg: "初始化NFC适配器实例成功", data: null }) } else { callBack.call(this, { code: errorCode, msg: "初始化NFC适配器实例失败", data: null }) } }; //十六进制字符串转字节数组 function hexStringToArrayBuffer(str) { var hex = str; return new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function(h) { return parseInt(h, 16) })).buffer; }; //字节数组转十六进制字符串 function arrayBufferToHexString(buffer) { return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join(''); }; function nfcErrMsg(errCode) { switch (errCode) { case 0: return "正常"; break; case 13000: return "设备不支持NFC"; break; case 13001: return "系统NFC开关未打开"; break; case 13010: return "未知错误"; break; case 13019: return "用户未授权"; break; case 13011: return "参数无效"; break; case 13012: return "将参数解析为NdefMessage失败"; break; case 13021: return "已经开始NFC扫描"; break; case 13018: return "尝试在未开始NFC扫描时停止NFC扫描"; break; case 13022: return "标签已经连接"; break; case 13023: return "尝试在未连接标签时断开连接"; break; case 13013: return "未扫描到NFC标签"; break; case 13014: return "无效的标签技术"; break; case 13015: return "从标签上获取对应技术失败"; break; case 13024: return "当前标签技术不支持该功能"; break case 13017: return "相关读写操作失败"; break default: return "连接失败"; break } }