// src/utils/rfidUtils.js
|
|
let NfcAdapter;
|
let NfcV;
|
|
export function NFCInit() {
|
try {
|
var main = plus.android.runtimeMainActivity();
|
var Intent = plus.android.importClass('android.content.Intent');
|
var Activity = plus.android.importClass('android.app.Activity');
|
var PendingIntent = plus.android.importClass('android.app.PendingIntent');
|
var IntentFilter = plus.android.importClass('android.content.IntentFilter');
|
NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
|
NfcV = plus.android.importClass('android.nfc.tech.NfcV')
|
var _nfcAdapter = NfcAdapter.getDefaultAdapter(main);
|
|
var ndef = new IntentFilter('android.nfc.action.NDEF_DISCOVERED');
|
var tag = new IntentFilter('android.nfc.action.TAG_DISCOVERED');
|
var tech = new IntentFilter('android.nfc.action.TECH_DISCOVERED');
|
var intentFiltersArray = [ndef, tag, tech];
|
|
var techListsArray = [
|
['android.nfc.tech.Ndef'],
|
['android.nfc.tech.IsoDep'],
|
['android.nfc.tech.NfcA'],
|
['android.nfc.tech.NfcB'],
|
['android.nfc.tech.NfcF'],
|
['android.nfc.tech.Nfcf'],
|
['android.nfc.tech.NfcV'],
|
['android.nfc.tech.NdefFormatable'],
|
['android.nfc.tech.MifareClassi'],
|
['android.nfc.tech.MifareUltralight']
|
];
|
|
var _intent = new Intent(main, main.getClass());
|
_intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
|
var pendingIntent = PendingIntent.getActivity(main, 0, _intent, 0);
|
|
if (_nfcAdapter == null) {
|
return '本设备不支持NFC!';
|
} else if (_nfcAdapter.isEnabled() == false) {
|
return 'NFC功能未打开!';
|
} else {
|
_nfcAdapter.enableForegroundDispatch(main, pendingIntent, IntentFilter, techListsArray);
|
return 'NFC正常';
|
}
|
} catch (e) {
|
console.log(e);
|
}
|
}
|
|
export function NFCReadUID() {
|
var main = plus.android.runtimeMainActivity();
|
var _intent = main.getIntent();
|
var _action = _intent.getAction();
|
|
var tagFromIntent = _intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
|
var uid = _intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
|
var text = _intent.getByteArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
|
var rawMsgs = _intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
|
|
var UID = Bytes2HexString(uid);
|
return {
|
UID,
|
text
|
};
|
}
|
|
export function Bytes2HexString(arrBytes) {
|
var str = '';
|
var reversedArrBytes = arrBytes?.slice().reverse();
|
for (var i = 0; i < reversedArrBytes.length; i++) {
|
var tmp;
|
var num = reversedArrBytes[i];
|
if (num < 0) {
|
tmp = (255 + num + 1).toString(16).toUpperCase();
|
} else {
|
tmp = num.toString(16).toUpperCase();
|
}
|
if (tmp.length == 1) {
|
tmp = '0' + tmp;
|
}
|
str += tmp;
|
}
|
return str;
|
}
|
|
// export function read() { // 读代码
|
// var main = plus.android.runtimeMainActivity();
|
// var intent = main.getIntent();
|
// // this.callBack(NFCServices.READING, '请勿移开标签正在读取数据!')
|
// // NFC id
|
// let bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
|
// let nfc_id = byteArrayToHexString(bytesId);
|
// let extractedValues = {}
|
// let tag = plus.android.importClass('android.nfc.Tag');
|
// tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
|
// // 开始读取扇区
|
// // let NfcV = NfcV
|
// // 此处地址有长度判断
|
// if (nfc_id.length === 16) {
|
// let tech = NfcV.get(tag);
|
// if (tech != null) {
|
// try {
|
// tech.connect();
|
// let isConnected = tech.isConnected()
|
// if (isConnected) {
|
// // 感觉这个tagUid就是上面的nfc_id (mac地址)
|
// var tagUid = tag.getId();
|
|
// // //读取块信息
|
// // let buffer1 = [0x22, 0x20, ...tagUid];
|
// // var aa= nfcV.transceive(buffer1);
|
// let str1;
|
// let bytelist="";
|
// for(let i = 0; i < 50; i++) {
|
// let line=readBlockConcat(tech, tagUid, i);
|
// let str = String(byteArrayToHexString(line))?.slice(2);
|
// // 转换为 ASCII 数组,然后连接成字符串
|
// let statusArr = decimalArrayToAscii(hexStringToArrayAndConvert(str));
|
// let openStatus = statusArr.length ? statusArr.join('') : '';
|
// bytelist=bytelist+openStatus;
|
// }
|
|
// extractedValues = {
|
// read_raw: nfc_id,
|
// mac_raw: reverseString(nfc_id),
|
// mac: stringToMacAddress(nfc_id),
|
// openStatus: bytelist.trim()
|
// }
|
// return extractedValues.openStatus
|
// // console.log(extractedValues);
|
// // this.callBack(NFCServices.READ_SUCCESS, '读取数据成功!', extractedValues)
|
// }
|
// } catch (e) {
|
// console.log('nfc catch', e.stack);
|
// return '没有读取到数据!'
|
// }
|
// }
|
// } else {
|
// //mac地址长度不符合本次需求,返回mac地址和一个错误的openStatus,openStatus看自己业务情况,可以去掉
|
// extractedValues = {
|
// read_raw: nfc_id,
|
// mac_raw: reverseString(nfc_id),
|
// mac: stringToMacAddress(nfc_id),
|
// openStatus: ''
|
// }
|
// return extractedValues.openStatus
|
// // this.callBack(NFCServices.READ_SUCCESS, '读取数据成功!', extractedValues)
|
// // console.log(extractedValues);
|
// }
|
// return nfc_id
|
// }
|
|
export function read() {
|
var main = plus.android.runtimeMainActivity();
|
var intent = main.getIntent();
|
|
let nfc_id = byteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID));
|
let extractedValues = {};
|
|
if (nfc_id&&nfc_id.length === 16) {
|
let tag = plus.android.importClass('android.nfc.Tag');
|
tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
|
|
let tech = NfcV.get(tag);
|
if (tech != null) {
|
try {
|
tech.connect();
|
if (tech.isConnected()) {
|
var tagUid = tag.getId();
|
let bytelist = [];
|
|
let count = 0
|
for (let i = 0; i < 55; i++) {
|
let line = readBlockConcat(tech, tagUid, i);
|
// console.log(`Read block ${i}:`, line);
|
if(line==null) {
|
if(count>=100){
|
return ''
|
}
|
i--;
|
count++
|
}
|
let str = String(byteArrayToHexString(line))?.slice(2);
|
let statusArr = decimalArrayToAscii(hexStringToArrayAndConvert(str));
|
let openStatus = statusArr?.length ? statusArr.join('') : '';
|
bytelist.push(openStatus);
|
}
|
|
extractedValues = {
|
read_raw: nfc_id,
|
mac_raw: reverseString(nfc_id),
|
mac: stringToMacAddress(nfc_id),
|
openStatus: bytelist.join('').trim()
|
};
|
|
return extractedValues.openStatus;
|
}
|
} catch (e) {
|
console.log('Error while reading NFC:', e.stack || e.message);
|
return '没有读取到数据!';
|
}
|
}
|
} else {
|
extractedValues = {
|
read_raw: nfc_id,
|
mac_raw: reverseString(nfc_id),
|
mac: stringToMacAddress(nfc_id),
|
openStatus: ''
|
};
|
|
return extractedValues.openStatus;
|
}
|
|
return nfc_id;
|
}
|
|
|
export function reverseString (inputString) {
|
return inputString.match(/.{1,2}/g).reverse().join('');
|
}
|
|
export function stringToMacAddress(inputString) {
|
// 如果是真货长度是16位,mac取反
|
if (inputString.length === 16) {
|
inputString = reverseString(inputString) }
|
// 删除字符串中的非十六进制字符
|
var cleanedString = inputString.replace(/[^0-9A-Fa-f]/g, '');
|
// 将字符串切割成每两个字符一组
|
var pairs = cleanedString.match(/.{1,2}/g);
|
// 使用冒号连接数组中的每一组字符
|
var macAddress = pairs.join(':').toUpperCase();
|
return macAddress;
|
}
|
|
// 拼接两个块的数据,返回结果是Byte数组或者null
|
export function readBlockConcat(nfcV, tagUid, index = 0x24) {
|
// 0x20: Read Single Block
|
let buffer = [0x22, 0x20, ...tagUid, index];
|
return nfcV.transceive(buffer);
|
}
|
// 将十六进制字符串每两位分割成一个数组
|
export function hexStringToArrayAndConvert(hexString) {
|
let hexArray = hexString.match(/.{1,2}/g) || [];
|
// 将每个元素转换为十进制数
|
let decimalArray = hexArray.map(hex => parseInt(hex, 16));
|
return decimalArray;
|
}
|
// 将每个十进制数值转换为对应的 ASCII 数值
|
export function decimalArrayToAscii(decimalArray) {
|
let asciiArray = decimalArray.map(decimal => String.fromCharCode(decimal));
|
return asciiArray;
|
}
|
|
// 将字节数组转换为字符串
|
export function byteArrayToHexString(inarray) {
|
let i, j, inn;
|
let hex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];
|
let out = "";
|
|
if(inarray)
|
{
|
for (j = 0; j < inarray.length; ++j) {
|
inn = inarray[j] & 0xff;
|
i = (inn >>> 4) & 0x0f;
|
out += hex[i];
|
i = inn & 0x0f;
|
out += hex[i];
|
}
|
}
|
return out;
|
}
|
|
// 二维码解析
|
export function QRCodeAnalysis(code) {
|
if (!code || code.length < 10 || !code.includes("^")) {
|
throw new Error(`传入二维码【${code ?? ""}】异常,请确认!`);
|
}
|
|
let entity = {};
|
let list = code.trim().split("^");
|
|
if (list.length !== 2 || list[1].length < 10) {
|
throw new Error(`传入二维码【${code ?? ""}】格式异常,请确认!`);
|
}
|
|
entity.materialNo = list[0];
|
entity.materialId = list[1].substring(4);
|
|
// 判断是否以字母结尾的正则表达式
|
let reg = /[A-Z]$/;
|
if (reg.test(list[1])) {
|
entity.materialBatch = list[1].substring(4, list[1].length - 1 - 4);
|
} else {
|
entity.materialBatch = list[1].substring(4, list[1].length - 4);
|
}
|
|
entity.line = list[1].substring(0, 4);
|
|
return entity;
|
}
|
|
export function splitAndFilter(codeStr) {
|
// 使用 '/' 分割字符串
|
var qrCodes = codeStr.split('/');
|
|
// 过滤空白或无效项
|
var qrCodeList = qrCodes.filter(function(item) {
|
return item.trim() !== '';
|
});
|
|
return qrCodeList;
|
}
|