schangxiang@126.com
2025-05-20 e92383f760f42050f55aa032c649814deb3b7752
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
// 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;
}