// 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; }