"navigationBarTitleText": "APP扫描签约" | "navigationBarTitleText": "APP扫描签约" | ||||
} | } | ||||
} | } | ||||
], | |||||
,{ | |||||
"path" : "pages/nfc/nfc", | |||||
"style" : | |||||
{ | |||||
"navigationBarTitleText": "NFC链接", | |||||
"enablePullDownRefresh": false | |||||
} | |||||
} | |||||
], | |||||
"subPackages": [{ | "subPackages": [{ | ||||
"root": "subpackage/after-sale", //售后相关 | "root": "subpackage/after-sale", //售后相关 | ||||
"pages": [{ | "pages": [{ |
let item = e; | let item = e; | ||||
//停止扫描蓝牙 | //停止扫描蓝牙 | ||||
console.info("停止扫描蓝牙"); | console.info("停止扫描蓝牙"); | ||||
wx.stopBluetoothDevicesDiscovery({ | |||||
uni.stopBluetoothDevicesDiscovery({ | |||||
success: function (res) { | success: function (res) { | ||||
console.log(device); | console.log(device); | ||||
if (item.selected == false) { | if (item.selected == false) { |
<template> | |||||
<div></div> | |||||
</template> | |||||
<script setup lang='ts'> | |||||
import { | |||||
onLoad, | |||||
onReady | |||||
} from "@dcloudio/uni-app"; | |||||
import { | |||||
ref, | |||||
reactive | |||||
} from "vue"; | |||||
const tools = require("../../static/etcUtil/tools.js"); | |||||
const NFCAPI = require('../../utils/nfc/NFCAPI.js'); | |||||
const cmd = require("../../static/etcUtil/cmdConfig.js"); | |||||
const routeType = ref(null); //来源 1激活 2圈存 3信息重写 4信息读取 | |||||
const state = reactive({ | |||||
fee: "", | |||||
cardId: "" | |||||
}); | |||||
onLoad((option) => { | |||||
routeType.value = option.routeType ? option.routeType : "1"; | |||||
state.cardId = option.cardId; | |||||
if (option.fee) { | |||||
state.fee = option.fee; | |||||
} | |||||
console.log("传过来的参数", option) | |||||
}); | |||||
//已准备 | |||||
onReady(() => { | |||||
scanNfc(); | |||||
}) | |||||
function scanNfc() { | |||||
tools.showLoadingAlert("扫描蓝牙中"); | |||||
//先断开所有设备 | |||||
NFCAPI.remove(() => { | |||||
//开始扫描设备 | |||||
NFCAPI.startScanDevice((res) => { | |||||
tools.hideLoadingAlert(); | |||||
if (res.code != 0) { | |||||
if (res.code == 1203) { | |||||
tools.showModalAlert("扫描超时请重新扫描NFC标签", function(res) { | |||||
if (res.confirm) { | |||||
scanNfc(); | |||||
} | |||||
}, null, "", true) | |||||
} else { | |||||
tools.showToastAlert(res.msg); | |||||
} | |||||
return; | |||||
} else { | |||||
NFCAPI.connectDevice(function() { | |||||
if (res.code != 0) { | |||||
tools.showToastAlert(res.msg); | |||||
return; | |||||
} | |||||
//获取卡信息 | |||||
transCmd(function() { | |||||
getCardId(res, function() { | |||||
if (routeType.value == "2") { | |||||
tools.toUrl( | |||||
`/pages/recharge/recharge?connectSuccess=1&&cardId=${state.cardId}&&fee=${state.fee}` | |||||
); //跳转到圈存界面 | |||||
} | |||||
}) | |||||
}) | |||||
}); | |||||
} | |||||
}) | |||||
}) | |||||
} | |||||
function getCardId(resultCmdArr: any, callback: any) { | |||||
var that = this; | |||||
if (resultCmdArr.length == 4) { | |||||
var str = resultCmdArr[2].substring(resultCmdArr[2].length - 4, resultCmdArr[2].length); //判断是否为9000 | |||||
var str3 = resultCmdArr[3].substring(resultCmdArr[3].length - 4, resultCmdArr[3].length); //判断是否为9000 | |||||
if (str == "9000" || str3 == "9000") { | |||||
if (resultCmdArr[2].length > 86 || resultCmdArr[3] >= 12) { | |||||
var card = { | |||||
cardNo: resultCmdArr[2].substring(20, 40), | |||||
startTime: resultCmdArr[2].substring(40, 48), | |||||
endTime: resultCmdArr[2].substring(48, 56), | |||||
version: resultCmdArr[2].substring(18, 19) >= 4 ? "4x" : "2x", | |||||
money: that.hex2int(resultCmdArr[3].substring(0, 8)), | |||||
v_userType: parseInt(resultCmdArr[2].substring(80, 82), 16) | |||||
}; | |||||
console.log("写命令拿到卡号:" + JSON.stringify(card)) | |||||
var jizhangka = card.cardNo.substring(8, 10); | |||||
if (jizhangka == '23') { | |||||
console.log('记账卡'); | |||||
tools.alertFback("不支持记账卡圈存", function() { | |||||
//返回首页 | |||||
uni.reLaunch({ | |||||
url: 'pages/index/index' | |||||
}) | |||||
}) | |||||
return; | |||||
} | |||||
that.setData({ | |||||
cardNo: card.cardNo, | |||||
cardMoney: card.money > 0 ? card.money : 0, | |||||
}) | |||||
callback(card.cardNo); | |||||
} else { | |||||
tools.showToastAlert("CMD_READBINARY指令长度不符" + resultCmdArr[2]); | |||||
} | |||||
return; | |||||
} | |||||
} else { | |||||
tools.showToastAlert("回包长度不符"); | |||||
} | |||||
} | |||||
function transCmd(callback: any) { | |||||
tools.showLoadingAlert('透传指令中'); | |||||
var cmdArr = [cmd.HOME_DIRECTORY, cmd.APPLICATION_DIRECTORY, cmd.CMD_READBINARY, cmd.CMD_GETBALANCE]; | |||||
NFCAPI.transCmd(cmdArr, function(res) { | |||||
tools.hideLoadingAlert(); | |||||
console.log(res); | |||||
if (res.code == 0) { | |||||
callback(res.data); | |||||
} else { | |||||
tools.showToastAlert(res.msg); | |||||
} | |||||
}); | |||||
} | |||||
</script> | |||||
<style lang='scss' scoped> | |||||
</style> |
const bluetoothUtil = require("../../static/etcUtil/index.js"); | const bluetoothUtil = require("../../static/etcUtil/index.js"); | ||||
const cmd = require("../../static/etcUtil/cmdConfig.js"); | const cmd = require("../../static/etcUtil/cmdConfig.js"); | ||||
const tools = require("../../static/etcUtil/tools.js"); | const tools = require("../../static/etcUtil/tools.js"); | ||||
const NFCAPI = require('../../utils/nfc/NFCAPI.js'); | |||||
const state = reactive({ | const state = reactive({ | ||||
isShowBlue: false, | isShowBlue: false, | ||||
fee: 5000, | fee: 5000, | ||||
money: 50, | money: 50, | ||||
orderNum: "", | orderNum: "", | ||||
transWay: "", //“blu”为蓝牙充值方式、“nfc”为NFC充值方式 | |||||
cardId: "", //卡号 需要传参 | cardId: "", //卡号 需要传参 | ||||
mockpreBalance: 2000, //fix:模拟余额 目前没有检测状态接口,第一次会模拟圈层检测来检测状态 | mockpreBalance: 2000, //fix:模拟余额 目前没有检测状态接口,第一次会模拟圈层检测来检测状态 | ||||
show: false, | show: false, | ||||
//读卡信息 | //读卡信息 | ||||
const card: any = reactive({ | |||||
const card : any = reactive({ | |||||
cardId: "", | cardId: "", | ||||
netId: "", | netId: "", | ||||
cardType: "", | cardType: "", | ||||
money: undefined, | money: undefined, | ||||
v_userType: "", | v_userType: "", | ||||
}); | }); | ||||
const getParams = (val) => { | |||||
console.log("val蓝牙完毕传过来的参数", val) | |||||
state.cardId = val.cardId; | |||||
state.connectSuccess = val.connectSuccess; | |||||
} | |||||
// const getParams = (val: any) => { | |||||
// console.log("val蓝牙完毕传过来的参数", val) | |||||
// state.cardId = val.cardId; | |||||
// state.connectSuccess = val.connectSuccess; | |||||
// } | |||||
onLoad((option) => { | onLoad((option) => { | ||||
/*获取openId 用途:(用户支付)*/ | /*获取openId 用途:(用户支付)*/ | ||||
getOpenID(); | getOpenID(); | ||||
/*传参*/ | /*传参*/ | ||||
state.transWay = option.transWay; //“blu”为蓝牙充值方式、“nfc”为NFC充值方式 | |||||
state.cardId = option.cardId; | state.cardId = option.cardId; | ||||
state.connectSuccess = option.connectSuccess; | state.connectSuccess = option.connectSuccess; | ||||
state.orderNum = getItem("orderNum"); | state.orderNum = getItem("orderNum"); | ||||
//钱包 | //钱包 | ||||
]; | ]; | ||||
tools.showLoadingAlert("正在执行指令"); | tools.showLoadingAlert("正在执行指令"); | ||||
bluetoothUtil.transCmd(cmdArr, "10", function (res) { | |||||
tools.hideLoadingAlert(); | |||||
//10:写卡 20:写OBU | |||||
let str = res[2].substring(res[2].length - 4, res[2].length); | |||||
let str3 = res[3].substring(res[3].length - 4, res[3].length); | |||||
if (str == "9000" || str3 == "9000") { | |||||
if (res[2].length > 86 || res[3] >= 12) { | |||||
card.cardId = res[2].substring(20, 40); //卡号 | |||||
card.startTime = res[2].substring(40, 48); | |||||
card.endTime = res[2].substring(48, 56); | |||||
card.version = res[2].substring(18, 19) >= 4 ? "4x" : "2x"; | |||||
card.netId = res[2].substring(20, 24); | |||||
card.cardType = res[2].substring(28, 29) == 23 ? 1 : 2; | |||||
card.vehiclePlateColor = parseInt(res[2].substring(82, 84), 16); | |||||
(card.money = parseInt(parseInt(res[3].substring(0, 8), 16), 10)), | |||||
console.log("======卡信息======", card); | |||||
if (card.cardId !== state.cardId) { | |||||
msg("设备卡信息与当前充值卡号不匹配,请核对卡号"); | |||||
return; | |||||
} | |||||
quanCheckActionTrue().then((val) => { | |||||
checkQuanCengEvent(val); | |||||
}); | |||||
} else { | |||||
console.error("CMD_READBINARY指令长度不符" + res[2]); | |||||
tools.hideLoadingAlert(); | |||||
transCmd(cmdArr, function (res : any) { | |||||
getCardIdReturn(res); | |||||
}) | |||||
}; | |||||
function getCardIdReturn(res : any) { | |||||
tools.hideLoadingAlert(); | |||||
//10:写卡 20:写OBU | |||||
let str = res[2].substring(res[2].length - 4, res[2].length); | |||||
let str3 = res[3].substring(res[3].length - 4, res[3].length); | |||||
if (str == "9000" || str3 == "9000") { | |||||
if (res[2].length > 86 || res[3] >= 12) { | |||||
card.cardId = res[2].substring(20, 40); //卡号 | |||||
card.startTime = res[2].substring(40, 48); | |||||
card.endTime = res[2].substring(48, 56); | |||||
card.version = res[2].substring(18, 19) >= 4 ? "4x" : "2x"; | |||||
card.netId = res[2].substring(20, 24); | |||||
card.cardType = res[2].substring(28, 29) == 23 ? 1 : 2; | |||||
card.vehiclePlateColor = parseInt(res[2].substring(82, 84), 16); | |||||
(card.money = parseInt(parseInt(res[3].substring(0, 8), 16), 10)), | |||||
console.log("======卡信息======", card); | |||||
if (card.cardId !== state.cardId) { | |||||
msg("设备卡信息与当前充值卡号不匹配,请核对卡号"); | |||||
return; | |||||
} | } | ||||
quanCheckActionTrue().then((val) => { | |||||
checkQuanCengEvent(val); | |||||
}); | |||||
} else { | |||||
console.error("CMD_READBINARY指令长度不符" + res[2]); | |||||
tools.hideLoadingAlert(); | |||||
} | } | ||||
console.error("CMD_READBINARY指令长度不符" + res[2]); | |||||
tools.hideLoadingAlert(); | |||||
}); | |||||
}; | |||||
} | |||||
console.error("CMD_READBINARY指令长度不符" + res[2]); | |||||
tools.hideLoadingAlert(); | |||||
} | |||||
const checkQuanCengEvent = (val : any) => { | const checkQuanCengEvent = (val : any) => { | ||||
if (val.chargeStatus === 1) { | if (val.chargeStatus === 1) { | ||||
let cmdArr = val.command.split(","); | let cmdArr = val.command.split(","); | ||||
uni.showLoading({ | uni.showLoading({ | ||||
title: "写入中", | title: "写入中", | ||||
}); | }); | ||||
bluetoothUtil.transCmd(cmdArr, "10", function (res) { | |||||
transCmd(cmdArr, function (res : any) { | |||||
let response = res.toString(); | let response = res.toString(); | ||||
var dic = { | var dic = { | ||||
command: val.command, | command: val.command, | ||||
}; | }; | ||||
uni.hideLoading(); | uni.hideLoading(); | ||||
cardCzXFCheckAction().then((xfRes) => { | cardCzXFCheckAction().then((xfRes) => { | ||||
quanApplyAction(dic).then((value: any) => { | |||||
quanApplyAction(dic).then((value : any) => { | |||||
console.log("圈层申请完后的结果"); | console.log("圈层申请完后的结果"); | ||||
console.log(value.commandType, value); | console.log(value.commandType, value); | ||||
//圈存初始化验证通过 , 进行圈存 | //圈存初始化验证通过 , 进行圈存 | ||||
uni.showLoading({ | uni.showLoading({ | ||||
title: "写入中", | title: "写入中", | ||||
}); | }); | ||||
bluetoothUtil.transCmd(cmdArr, "10", function (res) { | |||||
transCmd(cmdArr, function (res : any) { | |||||
var status = res[1].substring(res[1].length - 4, res[1].length); | var status = res[1].substring(res[1].length - 4, res[1].length); | ||||
console.log("打印状态"); | console.log("打印状态"); | ||||
console.log(status); | console.log(status); | ||||
let response = res.toString(); | let response = res.toString(); | ||||
var dic = { | var dic = { | ||||
command: val.command, | command: val.command, | ||||
cosResponse: response, | |||||
cosResponse: response, | |||||
rechargeId: val.rechargeId, | rechargeId: val.rechargeId, | ||||
}; | }; | ||||
quanFixAction(dic).then((value: any) => { | |||||
quanFixAction(dic).then((value : any) => { | |||||
console.log(value); | console.log(value); | ||||
console.log("修复结果返回"); | console.log("修复结果返回"); | ||||
var fixStatus = value.fixStatus; | var fixStatus = value.fixStatus; | ||||
}; | }; | ||||
/*透传*/ | /*透传*/ | ||||
const transCmd = (cmd) => { | |||||
bluetoothUtil.transCmd(cmd, "10", function (res) { | |||||
var status = res[1].substring(res[1].length - 4, res[1].length); | |||||
if (status === "9000") { | |||||
return res.toString(); | |||||
} | |||||
}); | |||||
const transCmd = (cmd : any, click : any) => { | |||||
if (state.transWay == 'blu') { | |||||
bluetoothUtil.transCmd(cmd, "10", function (res : any) { | |||||
click(res); | |||||
}); | |||||
} else { | |||||
//nfc透传 | |||||
NFCAPI.transCmd(cmd, function (res : any) { | |||||
tools.hideLoadingAlert(); | |||||
if (res.code == 0) { | |||||
click(res.data); | |||||
} else { | |||||
//透传失败返回 | |||||
tools.alertF(res.msg); | |||||
} | |||||
}); | |||||
} | |||||
}; | }; | ||||
/*圈层检测 -假数据校验*/ | /*圈层检测 -假数据校验*/ | ||||
}); | }); | ||||
}; | }; | ||||
/*圈层确认*/ | /*圈层确认*/ | ||||
const uanConfirmAction = (data: any) => { | |||||
const uanConfirmAction = (data : any) => { | |||||
console.log("圈层确认进入"); | console.log("圈层确认进入"); | ||||
let cmdArr = data.command.split(","); | let cmdArr = data.command.split(","); | ||||
console.log(cmdArr); | console.log(cmdArr); | ||||
bluetoothUtil.transCmd(cmdArr, "10", function (res: any) { | |||||
transCmd(cmdArr, function (res : any) { | |||||
console.log("圈层透传"); | console.log("圈层透传"); | ||||
console.log(res); | console.log(res); | ||||
var arraylenth = res.length; | var arraylenth = res.length; | ||||
msg("充值成功"); | msg("充值成功"); | ||||
navTo(`/pages/recharge/result`) | navTo(`/pages/recharge/result`) | ||||
}).catch((error) => { | }).catch((error) => { | ||||
console.log('输出内容',error) | |||||
console.log('输出内容', error) | |||||
}); | }); | ||||
} | } | ||||
}); | }); | ||||
}; | }; | ||||
request(cardCzPayResult, options).then((res) => { | request(cardCzPayResult, options).then((res) => { | ||||
const data = stringToJson(res.bizContent); | const data = stringToJson(res.bizContent); | ||||
if (data.tradeState === "SUCCESS") | |||||
if (data.tradeState === "SUCCESS"){ | |||||
uni.redirectTo({ | uni.redirectTo({ | ||||
url: `/pages/bluetooth/bluetooth?routeType=2&&cardId=${state.cardId}&&fee=${state.fee}`, | url: `/pages/bluetooth/bluetooth?routeType=2&&cardId=${state.cardId}&&fee=${state.fee}`, | ||||
}); | }); | ||||
} | |||||
// state.isShowBlue=true; | // state.isShowBlue=true; | ||||
console.log(data); | console.log(data); | ||||
}); | }); | ||||
}; | }; |
/** | /** | ||||
* 透传 | * 透传 | ||||
* type 10 写卡 20 写OBU | |||||
*/ | */ | ||||
function transCmd(cmdArr, type, func, callBack = null) { | function transCmd(cmdArr, type, func, callBack = null) { | ||||
var connectPrefixName = datas.getData("connectPrefixName"); | var connectPrefixName = datas.getData("connectPrefixName"); |
rbacSource: 'MINI_PROGRAM', | rbacSource: 'MINI_PROGRAM', | ||||
accessToken: getItem(StorageKeys.Token) | accessToken: getItem(StorageKeys.Token) | ||||
} | } | ||||
options.url = envs[process.env.NODE_ENV].baseUrl + '/api/interfaceMidGroundIn' | |||||
// options.url = envs[process.env.NODE_ENV].baseUrl + '/api/interfaceMidGroundIn' | |||||
options.url = envs[process.env.NODE_ENV].baseUrl + '/ifzt/api/interfaceMidGroundIn' | |||||
// options.url = envs[process.env.NODE_ENV].baseUrl + '/ifzt/api/interfaceMidGroundIn' | // options.url = envs[process.env.NODE_ENV].baseUrl + '/ifzt/api/interfaceMidGroundIn' | ||||
//默认json数据格式提交` | //默认json数据格式提交` | ||||
let contentType = 'application/x-www-form-urlencoded' | let contentType = 'application/x-www-form-urlencoded' | ||||
} | } | ||||
} | } | ||||
options.fail = (err) => { | options.fail = (err) => { | ||||
console.log('请求失败返回参数:', res) | |||||
// console.log('请求失败返回参数:', res) | |||||
uni.hideLoading() | uni.hideLoading() | ||||
console.log('请求错误', err) | console.log('请求错误', err) | ||||
// if (err == 'openId无效,请核实传参!') { | // if (err == 'openId无效,请核实传参!') { |
var NFCSDK = require('./NFCDeviceWechat.js'); | |||||
/** | |||||
* 开始扫描 | |||||
* @param {*} callBack | |||||
*/ | |||||
export function startScanDevice(callBack) { | |||||
NFCSDK.startScanDevice( | |||||
(res) => { | |||||
callBack.call(this, res); | |||||
} | |||||
) | |||||
} | |||||
/** | |||||
* 停止扫描 | |||||
* @param {回调} callBack | |||||
*/ | |||||
export function stopScanDevice(callBack) { | |||||
NFCSDK.stopScanDevice( | |||||
(res) => { | |||||
callBack.call(this, res); | |||||
} | |||||
); | |||||
} | |||||
/** | |||||
* 连接卡片 | |||||
* @param {回调} callBack | |||||
*/ | |||||
export function connectDevice(callBack) { | |||||
NFCSDK.connectDevice( | |||||
(res) => { | |||||
callBack.call(this, res); | |||||
} | |||||
) | |||||
} | |||||
/** | |||||
* 断开连接 | |||||
* @param {回调} callBack | |||||
*/ | |||||
export function disconnectDevice(callBack) { | |||||
NFCSDK.disConnectDevice((res) => { | |||||
callBack.call(this, res); | |||||
}) | |||||
} | |||||
/** | |||||
* | |||||
* @param {指令数组} cmdArr | |||||
* @param {回调} callback | |||||
*/ | |||||
export function transCmd(cmdArr, callback) { | |||||
NFCSDK.ICCTransCmd(cmdArr, (res) => { | |||||
callback.call(this, res); | |||||
}) | |||||
} | |||||
/** | |||||
* 移除扫描、断开链接及实例 | |||||
* @param {回调} callBack | |||||
*/ | |||||
export function remove(callback) { | |||||
NFCSDK.remove((res) => { | |||||
callback.call(this, res); | |||||
}) | |||||
} |
export function ICCResetCmd() { | |||||
return "A801" | |||||
}; | |||||
export function ICCChannelCmd() { | |||||
return "A3" | |||||
}; | |||||
export function ESAMResetCmd() { | |||||
return "A803" | |||||
}; | |||||
export function ESAMChannelCmd() { | |||||
return "A7" | |||||
}; | |||||
export function ResetFlag() { | |||||
return "JLReset" | |||||
}; | |||||
export function ChannelFlag() { | |||||
return "JLChannel" | |||||
}; | |||||
export function successCode() { | |||||
return 0 | |||||
}; | |||||
export function errorCode() { | |||||
return 1202 | |||||
}; | |||||
export function timeOutCode() { | |||||
return 1203 | |||||
}; | |||||
export function cardNoExists() { | |||||
return 1204 | |||||
}; | |||||
export function nfcSuccessCode() { | |||||
return 0 | |||||
}; | |||||
export function nfcErrorCode() { | |||||
return 1001 | |||||
}; | |||||
export function disConnectError() { | |||||
return 1101 | |||||
}; | |||||
export function cosErrorCode() { | |||||
return 1201 | |||||
}; | |||||
export function ondisConnect() { | |||||
return 1 | |||||
}; | |||||
export function DevResult(type, objc) { | |||||
var code = ""; | |||||
var err_msg = ""; | |||||
var data = null; | |||||
var msg = ""; | |||||
if (objc.code == successCode()) { | |||||
err_msg = "执行成功"; | |||||
if (type == 0) { | |||||
var data = objc.data; | |||||
var sw = data.substr(data.length - 4, 4); | |||||
code = successCode(); | |||||
data = objc.data; | |||||
msg = "操作成功" | |||||
} else { | |||||
code = objc.code; | |||||
data = null; | |||||
msg = objc.msg | |||||
} | |||||
return { | |||||
code: code, | |||||
data: data, | |||||
msg: msg | |||||
} | |||||
} else { | |||||
return { | |||||
code: objc.code, | |||||
data: null, | |||||
msg: objc.msg | |||||
} | |||||
} | |||||
}; |
var config = require("./NFCConfig"); | |||||
var nfcTool = require("./NFCManagerTool"); | |||||
var scanTimeId;//定时扫描 | |||||
var connectTimeId;//定时链接卡片 | |||||
var transTimeId;//定时发送数据 | |||||
var timeOut = 10000; | |||||
var isConnect = false; | |||||
export function startScanDevice(callBack) { | |||||
scanTimeId = setTimeout(res => { | |||||
nfcTool.stopScanNfcDevice(res => { | |||||
callBack.call(this, { | |||||
code: config.timeOutCode(), | |||||
msg: "扫描超时", | |||||
data: null | |||||
}) | |||||
}) | |||||
}, timeOut); | |||||
nfcTool.startScanNfcDevice(res => { | |||||
clearTimeout(scanTimeId); | |||||
console.log("返回上层数据:" + JSON.stringify(res)); | |||||
callBack.call(this, res) | |||||
}) | |||||
}; | |||||
export function stopScanDevice(callBack) { | |||||
nfcTool.stopScanNfcDevice(res => { | |||||
callBack.call(this, res) | |||||
}) | |||||
}; | |||||
export function connectDevice(callBack) { | |||||
if (isConnect) { | |||||
callBack.call(this, { | |||||
code: 10004, | |||||
msg: "卡片已被连接", | |||||
data: null | |||||
}); | |||||
return | |||||
} | |||||
nfcTool.connectDevice(res => { | |||||
if (res.code == 0) { | |||||
isConnect = true; | |||||
callBack.call(this, { | |||||
code: config.successCode(), | |||||
msg: "连接成功", | |||||
data: null | |||||
}) | |||||
} else { | |||||
disConnectDevice(res => {}); | |||||
console.log("返回上层数据:" + JSON.stringify(res)); | |||||
callBack.call(this, { | |||||
code: config.nfcErrorCode(), | |||||
msg: "连接失败", | |||||
data: null | |||||
}) | |||||
} | |||||
}) | |||||
}; | |||||
export function disConnectDevice(callBack) { | |||||
nfcTool.disConnectDevice(res => { | |||||
clearTimeout(scanTimeId); | |||||
clearTimeout(connectTimeId); | |||||
clearTimeout(transTimeId); | |||||
isConnect = false; | |||||
callBack.call(this, res) | |||||
}) | |||||
}; | |||||
export function ICCTransCmd(cmdArr, callBack) { | |||||
console.info("发送数据=============>>::" + cmdArr); | |||||
if (!isConnect) { | |||||
callBack.call(this, { | |||||
code: config.errorCode(), | |||||
msg: "未连接NFC标签", | |||||
data: null | |||||
}); | |||||
return | |||||
} | |||||
transTimeId = setTimeout(res => { | |||||
callBack.call(this, { | |||||
code: config.timeOutCode(), | |||||
msg: "ICC透传超时", | |||||
data: null | |||||
}) | |||||
}, timeOut); | |||||
nfcTool.sendMessageToDevice(cmdArr, res => { | |||||
clearTimeout(transTimeId); | |||||
console.log("返回上层数据:" + JSON.stringify(res)); | |||||
callBack.call(this, res) | |||||
}) | |||||
}; | |||||
export function remove(callBack) { | |||||
stopScanDevice(res => { | |||||
disConnectDevice(res => { | |||||
nfcTool.removeObj(); | |||||
callBack.call(this, { | |||||
code: config.successCode(), | |||||
msg: "断开NFC成功", | |||||
data: null | |||||
}); | |||||
}) | |||||
}) | |||||
} |
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 = uni.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 | |||||
} | |||||
} |