@@ -80,7 +80,16 @@ | |||
"navigationBarTitleText": "APP扫描签约" | |||
} | |||
} | |||
], | |||
,{ | |||
"path" : "pages/nfc/nfc", | |||
"style" : | |||
{ | |||
"navigationBarTitleText": "NFC链接", | |||
"enablePullDownRefresh": false | |||
} | |||
} | |||
], | |||
"subPackages": [{ | |||
"root": "subpackage/after-sale", //售后相关 | |||
"pages": [{ |
@@ -308,7 +308,7 @@ | |||
let item = e; | |||
//停止扫描蓝牙 | |||
console.info("停止扫描蓝牙"); | |||
wx.stopBluetoothDevicesDiscovery({ | |||
uni.stopBluetoothDevicesDiscovery({ | |||
success: function (res) { | |||
console.log(device); | |||
if (item.selected == false) { |
@@ -0,0 +1,135 @@ | |||
<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> |
@@ -75,6 +75,7 @@ | |||
const bluetoothUtil = require("../../static/etcUtil/index.js"); | |||
const cmd = require("../../static/etcUtil/cmdConfig.js"); | |||
const tools = require("../../static/etcUtil/tools.js"); | |||
const NFCAPI = require('../../utils/nfc/NFCAPI.js'); | |||
const state = reactive({ | |||
isShowBlue: false, | |||
@@ -103,6 +104,7 @@ | |||
fee: 5000, | |||
money: 50, | |||
orderNum: "", | |||
transWay: "", //“blu”为蓝牙充值方式、“nfc”为NFC充值方式 | |||
cardId: "", //卡号 需要传参 | |||
mockpreBalance: 2000, //fix:模拟余额 目前没有检测状态接口,第一次会模拟圈层检测来检测状态 | |||
show: false, | |||
@@ -121,7 +123,7 @@ | |||
//读卡信息 | |||
const card: any = reactive({ | |||
const card : any = reactive({ | |||
cardId: "", | |||
netId: "", | |||
cardType: "", | |||
@@ -138,15 +140,16 @@ | |||
money: undefined, | |||
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) => { | |||
/*获取openId 用途:(用户支付)*/ | |||
getOpenID(); | |||
/*传参*/ | |||
state.transWay = option.transWay; //“blu”为蓝牙充值方式、“nfc”为NFC充值方式 | |||
state.cardId = option.cardId; | |||
state.connectSuccess = option.connectSuccess; | |||
state.orderNum = getItem("orderNum"); | |||
@@ -269,46 +272,51 @@ | |||
//钱包 | |||
]; | |||
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) => { | |||
if (val.chargeStatus === 1) { | |||
let cmdArr = val.command.split(","); | |||
uni.showLoading({ | |||
title: "写入中", | |||
}); | |||
bluetoothUtil.transCmd(cmdArr, "10", function (res) { | |||
transCmd(cmdArr, function (res : any) { | |||
let response = res.toString(); | |||
var dic = { | |||
command: val.command, | |||
@@ -316,7 +324,7 @@ | |||
}; | |||
uni.hideLoading(); | |||
cardCzXFCheckAction().then((xfRes) => { | |||
quanApplyAction(dic).then((value: any) => { | |||
quanApplyAction(dic).then((value : any) => { | |||
console.log("圈层申请完后的结果"); | |||
console.log(value.commandType, value); | |||
//圈存初始化验证通过 , 进行圈存 | |||
@@ -337,7 +345,7 @@ | |||
uni.showLoading({ | |||
title: "写入中", | |||
}); | |||
bluetoothUtil.transCmd(cmdArr, "10", function (res) { | |||
transCmd(cmdArr, function (res : any) { | |||
var status = res[1].substring(res[1].length - 4, res[1].length); | |||
console.log("打印状态"); | |||
console.log(status); | |||
@@ -346,10 +354,10 @@ | |||
let response = res.toString(); | |||
var dic = { | |||
command: val.command, | |||
cosResponse: response, | |||
cosResponse: response, | |||
rechargeId: val.rechargeId, | |||
}; | |||
quanFixAction(dic).then((value: any) => { | |||
quanFixAction(dic).then((value : any) => { | |||
console.log(value); | |||
console.log("修复结果返回"); | |||
var fixStatus = value.fixStatus; | |||
@@ -398,13 +406,23 @@ | |||
}; | |||
/*透传*/ | |||
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); | |||
} | |||
}); | |||
} | |||
}; | |||
/*圈层检测 -假数据校验*/ | |||
@@ -523,11 +541,11 @@ | |||
}); | |||
}; | |||
/*圈层确认*/ | |||
const uanConfirmAction = (data: any) => { | |||
const uanConfirmAction = (data : any) => { | |||
console.log("圈层确认进入"); | |||
let cmdArr = data.command.split(","); | |||
console.log(cmdArr); | |||
bluetoothUtil.transCmd(cmdArr, "10", function (res: any) { | |||
transCmd(cmdArr, function (res : any) { | |||
console.log("圈层透传"); | |||
console.log(res); | |||
var arraylenth = res.length; | |||
@@ -558,7 +576,7 @@ | |||
msg("充值成功"); | |||
navTo(`/pages/recharge/result`) | |||
}).catch((error) => { | |||
console.log('输出内容',error) | |||
console.log('输出内容', error) | |||
}); | |||
} | |||
}); | |||
@@ -703,12 +721,12 @@ | |||
}; | |||
request(cardCzPayResult, options).then((res) => { | |||
const data = stringToJson(res.bizContent); | |||
if (data.tradeState === "SUCCESS") | |||
if (data.tradeState === "SUCCESS"){ | |||
uni.redirectTo({ | |||
url: `/pages/bluetooth/bluetooth?routeType=2&&cardId=${state.cardId}&&fee=${state.fee}`, | |||
}); | |||
} | |||
// state.isShowBlue=true; | |||
console.log(data); | |||
}); | |||
}; |
@@ -110,6 +110,7 @@ function disconnectDevice() { | |||
/** | |||
* 透传 | |||
* type 10 写卡 20 写OBU | |||
*/ | |||
function transCmd(cmdArr, type, func, callBack = null) { | |||
var connectPrefixName = datas.getData("connectPrefixName"); |
@@ -59,7 +59,8 @@ export function request(code, options = {}, start = false) { | |||
rbacSource: 'MINI_PROGRAM', | |||
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' | |||
//默认json数据格式提交` | |||
let contentType = 'application/x-www-form-urlencoded' | |||
@@ -167,7 +168,7 @@ export function request(code, options = {}, start = false) { | |||
} | |||
} | |||
options.fail = (err) => { | |||
console.log('请求失败返回参数:', res) | |||
// console.log('请求失败返回参数:', res) | |||
uni.hideLoading() | |||
console.log('请求错误', err) | |||
// if (err == 'openId无效,请核实传参!') { |
@@ -0,0 +1,67 @@ | |||
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); | |||
}) | |||
} |
@@ -0,0 +1,76 @@ | |||
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 | |||
} | |||
} | |||
}; |
@@ -0,0 +1,102 @@ | |||
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 | |||
}); | |||
}) | |||
}) | |||
} |
@@ -0,0 +1,321 @@ | |||
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 | |||
} | |||
} |