123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 |
- 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) {
-
- // #ifdef MP-ALIPAY
- // nfcAdapter = my.getNFCAdapter() //获取NFC适配器实例
- // #endif
- // #ifdef MP-WEIXIN
- nfcAdapter = wx.getNFCAdapter() //获取NFC适配器实例
- // #endif
-
- 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
- }
- }
|