queclink-parser 1.9.28 → 1.9.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +30 -23
- package/package.json +37 -35
- package/src/gl300.js +6 -6
- package/src/gl50.js +2 -2
- package/src/gl533cg.js +25 -9
- package/src/gmt100.js +10 -10
- package/src/gv200.js +56 -58
- package/src/gv300.js +55 -51
- package/src/gv300w.js +77 -73
- package/src/gv310lau.js +215 -200
- package/src/gv350ceu.js +278 -263
- package/src/gv500.js +2 -2
- package/src/gv50p.js +10 -10
- package/src/gv55.js +10 -10
- package/src/gv57cg.js +142 -142
- package/src/gv58lau.js +504 -483
- package/src/gv600w.js +39 -39
- package/src/gv75w.js +71 -67
- package/src/gv800w.js +44 -44
- package/src/index.js +16 -16
- package/src/utils.js +725 -720
package/src/gv350ceu.js
CHANGED
|
@@ -23,18 +23,18 @@ const parse = raw => {
|
|
|
23
23
|
imei: parsedData[2],
|
|
24
24
|
protocolVersion: utils.getProtocolVersion(parsedData[1]),
|
|
25
25
|
temperature: null,
|
|
26
|
-
history
|
|
26
|
+
history,
|
|
27
27
|
sentTime: utils.parseDate(parsedData[parsedData.length - 2]),
|
|
28
28
|
serialId: parseInt(parsedData[parsedData.length - 1], 16)
|
|
29
29
|
}
|
|
30
30
|
// Gps
|
|
31
31
|
if (command[1] === 'GTFRI') {
|
|
32
32
|
try {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
const number = parsedData[6] !== '' ? parseInt(parsedData[6], 10) : 1
|
|
34
|
+
const satelliteInfo = utils.includeSatellites(parsedData[18])
|
|
35
|
+
const gnnsTriggerType = utils.includeGnssTrigger(parsedData[18])
|
|
36
|
+
const jammingSate = utils.includeJammingSate(parsedData[18])
|
|
37
|
+
const index =
|
|
38
38
|
6 + (12 + satelliteInfo + gnnsTriggerType + jammingSate) * number
|
|
39
39
|
|
|
40
40
|
data = Object.assign(data, {
|
|
@@ -53,28 +53,28 @@ const parse = raw => {
|
|
|
53
53
|
raw: parsedData[index + 7],
|
|
54
54
|
sos: false,
|
|
55
55
|
input: {
|
|
56
|
-
|
|
56
|
+
1:
|
|
57
57
|
utils.nHexDigit(
|
|
58
58
|
utils.hex2bin(
|
|
59
59
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
60
60
|
),
|
|
61
61
|
4
|
|
62
62
|
)[3] === '1',
|
|
63
|
-
|
|
63
|
+
2:
|
|
64
64
|
utils.nHexDigit(
|
|
65
65
|
utils.hex2bin(
|
|
66
66
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
67
67
|
),
|
|
68
68
|
4
|
|
69
69
|
)[2] === '1',
|
|
70
|
-
|
|
70
|
+
3:
|
|
71
71
|
utils.nHexDigit(
|
|
72
72
|
utils.hex2bin(
|
|
73
73
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
74
74
|
),
|
|
75
75
|
4
|
|
76
76
|
)[1] === '1',
|
|
77
|
-
|
|
77
|
+
4:
|
|
78
78
|
utils.nHexDigit(
|
|
79
79
|
utils.hex2bin(
|
|
80
80
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
@@ -83,21 +83,21 @@ const parse = raw => {
|
|
|
83
83
|
)[0] === '1'
|
|
84
84
|
},
|
|
85
85
|
output: {
|
|
86
|
-
|
|
86
|
+
1:
|
|
87
87
|
utils.nHexDigit(
|
|
88
88
|
utils.hex2bin(
|
|
89
89
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
90
90
|
),
|
|
91
91
|
3
|
|
92
92
|
)[2] === '1',
|
|
93
|
-
|
|
93
|
+
2:
|
|
94
94
|
utils.nHexDigit(
|
|
95
95
|
utils.hex2bin(
|
|
96
96
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
97
97
|
),
|
|
98
98
|
3
|
|
99
99
|
)[1] === '1',
|
|
100
|
-
|
|
100
|
+
3:
|
|
101
101
|
utils.nHexDigit(
|
|
102
102
|
utils.hex2bin(
|
|
103
103
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
@@ -109,8 +109,8 @@ const parse = raw => {
|
|
|
109
109
|
state:
|
|
110
110
|
utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6) !== ''
|
|
111
111
|
? utils.states[ // eslint-disable-line
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6)
|
|
113
|
+
]
|
|
114
114
|
: null
|
|
115
115
|
},
|
|
116
116
|
azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
|
|
@@ -153,18 +153,18 @@ const parse = raw => {
|
|
|
153
153
|
index - (satelliteInfo + gnnsTriggerType + jammingSate) + 1
|
|
154
154
|
] !== ''
|
|
155
155
|
? parseInt(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
156
|
+
parsedData[
|
|
157
|
+
index - (satelliteInfo + gnnsTriggerType + jammingSate) + 1
|
|
158
|
+
],
|
|
159
|
+
10
|
|
160
|
+
)
|
|
161
161
|
: null,
|
|
162
162
|
triggerType:
|
|
163
163
|
gnnsTriggerType &&
|
|
164
164
|
parsedData[index - (jammingSate + gnnsTriggerType) + 1] !== ''
|
|
165
165
|
? utils.gnssTriggerTypes[
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
parsedData[index - (jammingSate + gnnsTriggerType) + 1]
|
|
167
|
+
]
|
|
168
168
|
: null,
|
|
169
169
|
jammingSate:
|
|
170
170
|
jammingSate && parsedData[index - jammingSate + 1] !== ''
|
|
@@ -182,9 +182,9 @@ const parse = raw => {
|
|
|
182
182
|
|
|
183
183
|
// More than 1 GNSS report in data
|
|
184
184
|
if (number > 1) {
|
|
185
|
-
|
|
185
|
+
const moreData = []
|
|
186
186
|
for (let i = 1; i < number; i++) {
|
|
187
|
-
|
|
187
|
+
const gnssIx =
|
|
188
188
|
7 + (12 + satelliteInfo + gnnsTriggerType + jammingSate) * i
|
|
189
189
|
moreData.push({
|
|
190
190
|
index: i,
|
|
@@ -244,8 +244,8 @@ const parse = raw => {
|
|
|
244
244
|
gnnsTriggerType &&
|
|
245
245
|
parsedData[gnssIx + (jammingSate + gnnsTriggerType) + 1] !== ''
|
|
246
246
|
? utils.gnssTriggerTypes[
|
|
247
|
-
|
|
248
|
-
|
|
247
|
+
parsedData[gnssIx + (jammingSate + gnnsTriggerType) + 1]
|
|
248
|
+
]
|
|
249
249
|
: null,
|
|
250
250
|
jammingSate:
|
|
251
251
|
jammingSate && parsedData[gnssIx + jammingSate + 1] !== ''
|
|
@@ -254,17 +254,17 @@ const parse = raw => {
|
|
|
254
254
|
})
|
|
255
255
|
}
|
|
256
256
|
|
|
257
|
-
data = Object.assign(data, { moreData
|
|
257
|
+
data = Object.assign(data, { moreData })
|
|
258
258
|
}
|
|
259
259
|
} catch (err) {
|
|
260
260
|
return { type: 'UNKNOWN', raw: data.raw.toString() }
|
|
261
261
|
}
|
|
262
262
|
} else if (command[1] === 'GTERI') {
|
|
263
263
|
// GPS with AC100 and/or Bluetoth Devices Connected
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
264
|
+
const number = parsedData[7] !== '' ? parseInt(parsedData[7], 10) : 1
|
|
265
|
+
const satelliteInfo = utils.includeSatellites(parsedData[18])
|
|
266
|
+
const gnnsTriggerType = utils.includeGnssTrigger(parsedData[18])
|
|
267
|
+
const jammingSate = utils.includeJammingSate(parsedData[18])
|
|
268
268
|
let index =
|
|
269
269
|
7 + (12 + satelliteInfo + gnnsTriggerType + jammingSate) * number
|
|
270
270
|
|
|
@@ -297,28 +297,28 @@ const parse = raw => {
|
|
|
297
297
|
raw: parsedData[index + 7],
|
|
298
298
|
sos: false,
|
|
299
299
|
input: {
|
|
300
|
-
|
|
300
|
+
1:
|
|
301
301
|
utils.nHexDigit(
|
|
302
302
|
utils.hex2bin(
|
|
303
303
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
304
304
|
),
|
|
305
305
|
4
|
|
306
306
|
)[3] === '1',
|
|
307
|
-
|
|
307
|
+
2:
|
|
308
308
|
utils.nHexDigit(
|
|
309
309
|
utils.hex2bin(
|
|
310
310
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
311
311
|
),
|
|
312
312
|
4
|
|
313
313
|
)[2] === '1',
|
|
314
|
-
|
|
314
|
+
3:
|
|
315
315
|
utils.nHexDigit(
|
|
316
316
|
utils.hex2bin(
|
|
317
317
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
318
318
|
),
|
|
319
319
|
4
|
|
320
320
|
)[1] === '1',
|
|
321
|
-
|
|
321
|
+
4:
|
|
322
322
|
utils.nHexDigit(
|
|
323
323
|
utils.hex2bin(
|
|
324
324
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
@@ -327,21 +327,21 @@ const parse = raw => {
|
|
|
327
327
|
)[0] === '1'
|
|
328
328
|
},
|
|
329
329
|
output: {
|
|
330
|
-
|
|
330
|
+
1:
|
|
331
331
|
utils.nHexDigit(
|
|
332
332
|
utils.hex2bin(
|
|
333
333
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
334
334
|
),
|
|
335
335
|
3
|
|
336
336
|
)[2] === '1',
|
|
337
|
-
|
|
337
|
+
2:
|
|
338
338
|
utils.nHexDigit(
|
|
339
339
|
utils.hex2bin(
|
|
340
340
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
341
341
|
),
|
|
342
342
|
3
|
|
343
343
|
)[1] === '1',
|
|
344
|
-
|
|
344
|
+
3:
|
|
345
345
|
utils.nHexDigit(
|
|
346
346
|
utils.hex2bin(
|
|
347
347
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
@@ -353,8 +353,8 @@ const parse = raw => {
|
|
|
353
353
|
state:
|
|
354
354
|
utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6) !== ''
|
|
355
355
|
? utils.states[ // eslint-disable-line
|
|
356
|
-
|
|
357
|
-
|
|
356
|
+
utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6)
|
|
357
|
+
]
|
|
358
358
|
: null
|
|
359
359
|
},
|
|
360
360
|
azimuth: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
|
|
@@ -396,17 +396,17 @@ const parse = raw => {
|
|
|
396
396
|
index - (satelliteInfo + gnnsTriggerType + jammingSate) + 1
|
|
397
397
|
] !== ''
|
|
398
398
|
? parseInt(
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
399
|
+
parsedData[
|
|
400
|
+
index - (satelliteInfo + gnnsTriggerType + jammingSate) + 1
|
|
401
|
+
]
|
|
402
|
+
)
|
|
403
403
|
: null,
|
|
404
404
|
triggerType:
|
|
405
405
|
gnnsTriggerType &&
|
|
406
406
|
parsedData[index - (jammingSate + gnnsTriggerType) + 1] !== ''
|
|
407
407
|
? utils.gnssTriggerTypes[
|
|
408
|
-
|
|
409
|
-
|
|
408
|
+
parsedData[index - (jammingSate + gnnsTriggerType) + 1]
|
|
409
|
+
]
|
|
410
410
|
: null,
|
|
411
411
|
jammingSate:
|
|
412
412
|
jammingSate && parsedData[index - jammingSate + 1] !== ''
|
|
@@ -424,7 +424,9 @@ const parse = raw => {
|
|
|
424
424
|
const ac100DevicesConnected =
|
|
425
425
|
AC100 && digitFuelSensor
|
|
426
426
|
? parseInt(parsedData[index + 10], 10)
|
|
427
|
-
: AC100 && !digitFuelSensor
|
|
427
|
+
: AC100 && !digitFuelSensor
|
|
428
|
+
? parseInt(parsedData[index + 9], 10)
|
|
429
|
+
: 0
|
|
428
430
|
// Review when RF433 devices are implemented
|
|
429
431
|
// eslint-disable-next-line no-unused-vars
|
|
430
432
|
const rf433DevicesConnected =
|
|
@@ -433,12 +435,12 @@ const parse = raw => {
|
|
|
433
435
|
let externalData = {
|
|
434
436
|
eriMask: {
|
|
435
437
|
raw: parsedData[4],
|
|
436
|
-
digitFuelSensor
|
|
437
|
-
AC100
|
|
438
|
-
canData
|
|
439
|
-
fuelLevelPercentage
|
|
440
|
-
fuelVolume
|
|
441
|
-
bluetoothAccessory
|
|
438
|
+
digitFuelSensor,
|
|
439
|
+
AC100,
|
|
440
|
+
canData,
|
|
441
|
+
fuelLevelPercentage,
|
|
442
|
+
fuelVolume,
|
|
443
|
+
bluetoothAccessory
|
|
442
444
|
},
|
|
443
445
|
uartDeviceType:
|
|
444
446
|
parsedData[index + 8] !== ''
|
|
@@ -461,17 +463,17 @@ const parse = raw => {
|
|
|
461
463
|
fuelVolume && fuelLevelPercentage && parsedData[index + 12] !== ''
|
|
462
464
|
? parseInt(parsedData[index + 13], 10)
|
|
463
465
|
: fuelVolume &&
|
|
464
|
-
|
|
465
|
-
|
|
466
|
+
!fuelLevelPercentage &&
|
|
467
|
+
parsedData[index + 12] !== ''
|
|
466
468
|
? parseInt(parsedData[index + 12], 10)
|
|
467
469
|
: null
|
|
468
470
|
},
|
|
469
471
|
AC100Devices: null
|
|
470
472
|
})
|
|
471
473
|
} else if (!digitFuelSensor && AC100) {
|
|
472
|
-
|
|
474
|
+
const ac100Devices = []
|
|
473
475
|
let count = index + 11
|
|
474
|
-
for (
|
|
476
|
+
for (let i = 0; i < ac100DevicesConnected; i++) {
|
|
475
477
|
ac100Devices.push({
|
|
476
478
|
deviceNumber: parsedData[count],
|
|
477
479
|
deviceType: parsedData[count + 1],
|
|
@@ -487,12 +489,14 @@ const parse = raw => {
|
|
|
487
489
|
AC100Devices: ac100Devices
|
|
488
490
|
})
|
|
489
491
|
} else if (digitFuelSensor && AC100) {
|
|
490
|
-
|
|
492
|
+
const ac100Devices = []
|
|
491
493
|
let count =
|
|
492
494
|
fuelVolume && fuelLevelPercentage
|
|
493
495
|
? 33
|
|
494
|
-
: fuelVolume && !fuelLevelPercentage
|
|
495
|
-
|
|
496
|
+
: fuelVolume && !fuelLevelPercentage
|
|
497
|
+
? index + 13
|
|
498
|
+
: index + 12
|
|
499
|
+
for (let j = 0; j < ac100DevicesConnected; j++) {
|
|
496
500
|
ac100Devices.push({
|
|
497
501
|
deviceNumber: parsedData[count],
|
|
498
502
|
deviceType: parsedData[count + 1],
|
|
@@ -514,8 +518,8 @@ const parse = raw => {
|
|
|
514
518
|
fuelVolume && fuelLevelPercentage && parsedData[index + 13] !== ''
|
|
515
519
|
? parseInt(parsedData[index + 13], 10)
|
|
516
520
|
: fuelVolume &&
|
|
517
|
-
|
|
518
|
-
|
|
521
|
+
!fuelLevelPercentage &&
|
|
522
|
+
parsedData[index + 12] !== ''
|
|
519
523
|
? parseInt(parsedData[index + 12], 10)
|
|
520
524
|
: null
|
|
521
525
|
},
|
|
@@ -525,9 +529,9 @@ const parse = raw => {
|
|
|
525
529
|
} else if (parsedData[index + 8] === '2') {
|
|
526
530
|
// AC100 1 Wire Bus
|
|
527
531
|
if (!digitFuelSensor && AC100) {
|
|
528
|
-
|
|
532
|
+
const ac100Devices = []
|
|
529
533
|
let count = index + 10
|
|
530
|
-
for (
|
|
534
|
+
for (let k = 0; k < ac100DevicesConnected; k++) {
|
|
531
535
|
ac100Devices.push({
|
|
532
536
|
deviceNumber: parsedData[count],
|
|
533
537
|
deviceType: parsedData[count + 1],
|
|
@@ -552,9 +556,9 @@ const parse = raw => {
|
|
|
552
556
|
AC100Devices: null
|
|
553
557
|
})
|
|
554
558
|
} else if (digitFuelSensor && AC100) {
|
|
555
|
-
|
|
559
|
+
const ac100Devices = []
|
|
556
560
|
let count = index + 12
|
|
557
|
-
for (
|
|
561
|
+
for (let l = 0; l < ac100DevicesConnected; l++) {
|
|
558
562
|
ac100Devices.push({
|
|
559
563
|
deviceNumber: parsedData[count],
|
|
560
564
|
deviceType: parsedData[count + 1],
|
|
@@ -598,16 +602,18 @@ const parse = raw => {
|
|
|
598
602
|
}
|
|
599
603
|
|
|
600
604
|
if (canData) {
|
|
601
|
-
|
|
605
|
+
const newIndex =
|
|
602
606
|
digitFuelSensor && !AC100
|
|
603
607
|
? index + 9 + 1
|
|
604
608
|
: !digitFuelSensor && AC100
|
|
605
609
|
? index + 9 + 4
|
|
606
|
-
: digitFuelSensor && AC100
|
|
607
|
-
|
|
610
|
+
: digitFuelSensor && AC100
|
|
611
|
+
? index + 9 + 5
|
|
612
|
+
: index + 9
|
|
613
|
+
const parsedCanData = utils.getCanData(parsedData, newIndex, command[1], {
|
|
608
614
|
deviceType: 'GV350CEU'
|
|
609
615
|
})
|
|
610
|
-
|
|
616
|
+
const canInfo = parsedCanData[3]
|
|
611
617
|
index = parsedCanData[0]
|
|
612
618
|
if (Object.keys(canInfo).length > 0) {
|
|
613
619
|
data = Object.assign(data, { can: canInfo })
|
|
@@ -635,23 +641,23 @@ const parse = raw => {
|
|
|
635
641
|
// Bluetooth Accessories
|
|
636
642
|
if (bluetoothAccessory) {
|
|
637
643
|
// let btIndex = digitFuelSensor ? index + 1 : index
|
|
638
|
-
|
|
639
|
-
|
|
644
|
+
const btIndex = canData ? index : index + 9
|
|
645
|
+
const btDevices = utils.getBleData(parsedData, btIndex)
|
|
640
646
|
externalData = Object.assign(externalData, {
|
|
641
|
-
btDevices
|
|
647
|
+
btDevices
|
|
642
648
|
})
|
|
643
649
|
}
|
|
644
650
|
|
|
645
651
|
data = Object.assign(data, {
|
|
646
|
-
externalData
|
|
652
|
+
externalData
|
|
647
653
|
})
|
|
648
654
|
|
|
649
655
|
// More than 1 GNSS report in data
|
|
650
656
|
if (number > 1) {
|
|
651
|
-
|
|
657
|
+
const moreData = []
|
|
652
658
|
const optionalLen = satelliteInfo + gnnsTriggerType + jammingSate
|
|
653
659
|
for (let i = 1; i < number; i++) {
|
|
654
|
-
|
|
660
|
+
const gnssIx = 7 + (12 + optionalLen) * i
|
|
655
661
|
moreData.push({
|
|
656
662
|
index: i,
|
|
657
663
|
loc: {
|
|
@@ -711,13 +717,13 @@ const parse = raw => {
|
|
|
711
717
|
jammingSate &&
|
|
712
718
|
parsedData[gnssIx + 12 + satelliteInfo + gnnsTriggerType] !== ''
|
|
713
719
|
? utils.jammingSateTypes[
|
|
714
|
-
|
|
715
|
-
|
|
720
|
+
parsedData[gnssIx + 12 + satelliteInfo + gnnsTriggerType]
|
|
721
|
+
]
|
|
716
722
|
: null
|
|
717
723
|
})
|
|
718
724
|
}
|
|
719
725
|
|
|
720
|
-
data = Object.assign(data, { moreData
|
|
726
|
+
data = Object.assign(data, { moreData })
|
|
721
727
|
}
|
|
722
728
|
} else if (command[1] === 'GTHBD') {
|
|
723
729
|
// Heartbeat. It must response an ACK command
|
|
@@ -737,16 +743,16 @@ const parse = raw => {
|
|
|
737
743
|
RSSI_quality:
|
|
738
744
|
parsedData[10] !== ''
|
|
739
745
|
? utils.getSignalStrength(
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
746
|
+
utils.networkTypes[parsedData[10]],
|
|
747
|
+
parseInt(parsedData[6], 10)
|
|
748
|
+
)
|
|
743
749
|
: null, // Signal Strength
|
|
744
750
|
RSSI_percentage:
|
|
745
751
|
parsedData[10] !== ''
|
|
746
752
|
? utils.getSignalPercentage(
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
753
|
+
utils.networkTypes[parsedData[10]],
|
|
754
|
+
parseInt(parsedData[6], 10)
|
|
755
|
+
)
|
|
750
756
|
: null, // Signal Percetange
|
|
751
757
|
GSM_quality:
|
|
752
758
|
parsedData[7] !== ''
|
|
@@ -763,16 +769,16 @@ const parse = raw => {
|
|
|
763
769
|
raw: parsedData[18] + parsedData[19] + parsedData[20],
|
|
764
770
|
sos: false,
|
|
765
771
|
input: {
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
772
|
+
4: utils.nHexDigit(utils.hex2bin(parsedData[21][1]), 4)[0] === '1',
|
|
773
|
+
3: utils.nHexDigit(utils.hex2bin(parsedData[21][1]), 4)[1] === '1',
|
|
774
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[21][1]), 4)[2] === '1',
|
|
775
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[21][1]), 4)[3] === '1'
|
|
770
776
|
},
|
|
771
777
|
output: {
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
778
|
+
4: utils.nHexDigit(utils.hex2bin(parsedData[22][1]), 4)[0] === '1',
|
|
779
|
+
3: utils.nHexDigit(utils.hex2bin(parsedData[22][1]), 4)[1] === '1',
|
|
780
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[22][1]), 4)[2] === '1',
|
|
781
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[22][1]), 4)[3] === '1'
|
|
776
782
|
},
|
|
777
783
|
charge: parsedData[12] === '1'
|
|
778
784
|
},
|
|
@@ -804,15 +810,15 @@ const parse = raw => {
|
|
|
804
810
|
command[1] === 'GTHBM'
|
|
805
811
|
) {
|
|
806
812
|
// Common Alarms
|
|
807
|
-
|
|
808
|
-
|
|
813
|
+
const number = parsedData[6] !== '' ? parseInt(parsedData[6], 10) : 1
|
|
814
|
+
const posAppendMask = parsedData[18]
|
|
809
815
|
? utils.nHexDigit(utils.hex2bin(parsedData[18]), 8)
|
|
810
816
|
: null
|
|
811
817
|
|
|
812
818
|
// If get satellites is configured
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
819
|
+
const satelliteInfo = posAppendMask && posAppendMask[7] === '1' ? 1 : 0
|
|
820
|
+
const jammingSate = posAppendMask && posAppendMask[3] === '1' ? 1 : 0
|
|
821
|
+
const index = 6 + (12 + satelliteInfo + jammingSate) * number
|
|
816
822
|
|
|
817
823
|
data = Object.assign(data, {
|
|
818
824
|
alarm: utils.getAlarm(command[1], parsedData[5], 'gv310lau'),
|
|
@@ -865,15 +871,17 @@ const parse = raw => {
|
|
|
865
871
|
lastSpeedStateDuration:
|
|
866
872
|
parseInt(parsedData[4], 10) === 2
|
|
867
873
|
? parsedData[index + 2]
|
|
868
|
-
: parseInt(parsedData[4], 10) === 3
|
|
874
|
+
: parseInt(parsedData[4], 10) === 3
|
|
875
|
+
? parsedData[index + 3]
|
|
876
|
+
: null,
|
|
869
877
|
hourmeter: null
|
|
870
878
|
})
|
|
871
879
|
} else if (command[1] === 'GTEPS' || command[1] === 'GTAIS') {
|
|
872
880
|
// External low battery and voltage for analog input
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
881
|
+
const number = parsedData[6] !== '' ? parseInt(parsedData[6], 10) : 1
|
|
882
|
+
const satelliteInfo = utils.includeSatellites(parsedData[18])
|
|
883
|
+
const jammingSate = utils.includeJammingSate(parsedData[18])
|
|
884
|
+
const index = 6 + (12 + satelliteInfo + jammingSate) * number // position append mask
|
|
877
885
|
|
|
878
886
|
data = Object.assign(data, {
|
|
879
887
|
alarm: utils.getAlarm(command[1], parsedData[5]),
|
|
@@ -923,10 +931,10 @@ const parse = raw => {
|
|
|
923
931
|
})
|
|
924
932
|
} else if (command[1] === 'GTTMP') {
|
|
925
933
|
// Temperature Alarm
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
934
|
+
const number = parsedData[7] !== '' ? parseInt(parsedData[7], 10) : 1
|
|
935
|
+
const satelliteInfo = utils.includeSatellites(parsedData[19])
|
|
936
|
+
const jammingSate = utils.includeJammingSate(parsedData[19])
|
|
937
|
+
const index = 7 + (12 + satelliteInfo + jammingSate) * number // position append mask
|
|
930
938
|
|
|
931
939
|
data = Object.assign(data, {
|
|
932
940
|
alarm: utils.getAlarm(command[1], parsedData[6], [
|
|
@@ -948,27 +956,27 @@ const parse = raw => {
|
|
|
948
956
|
raw: `${parsedData[index + 6]}${parsedData[index + 7]}`,
|
|
949
957
|
sos: false,
|
|
950
958
|
input: {
|
|
951
|
-
|
|
959
|
+
4:
|
|
952
960
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 6][1]), 4)[0] ===
|
|
953
961
|
'1',
|
|
954
|
-
|
|
962
|
+
3:
|
|
955
963
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 6][1]), 4)[1] ===
|
|
956
964
|
'1',
|
|
957
|
-
|
|
965
|
+
2:
|
|
958
966
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 6][1]), 4)[2] ===
|
|
959
967
|
'1',
|
|
960
|
-
|
|
968
|
+
1:
|
|
961
969
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 6][1]), 4)[3] ===
|
|
962
970
|
'1'
|
|
963
971
|
},
|
|
964
972
|
output: {
|
|
965
|
-
|
|
973
|
+
3:
|
|
966
974
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 7][1]), 4)[1] ===
|
|
967
975
|
'1',
|
|
968
|
-
|
|
976
|
+
2:
|
|
969
977
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 7][1]), 4)[2] ===
|
|
970
978
|
'1',
|
|
971
|
-
|
|
979
|
+
1:
|
|
972
980
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 7][1]), 4)[3] ===
|
|
973
981
|
'1'
|
|
974
982
|
},
|
|
@@ -1082,9 +1090,9 @@ const parse = raw => {
|
|
|
1082
1090
|
command[1] === 'GTMPF' ||
|
|
1083
1091
|
command[1] === 'GTBTC'
|
|
1084
1092
|
) {
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1093
|
+
const satelliteInfo = utils.includeSatellites(parsedData[15])
|
|
1094
|
+
const jammingSate = utils.includeJammingSate(parsedData[15])
|
|
1095
|
+
const index = 15 // position append mask
|
|
1088
1096
|
|
|
1089
1097
|
data = Object.assign(data, {
|
|
1090
1098
|
alarm: utils.getAlarm(command[1], null),
|
|
@@ -1141,9 +1149,9 @@ const parse = raw => {
|
|
|
1141
1149
|
command[1] === 'GTAVC' ||
|
|
1142
1150
|
command[1] === 'GTWPB'
|
|
1143
1151
|
) {
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1152
|
+
const satelliteInfo = utils.includeSatellites(parsedData[16])
|
|
1153
|
+
const jammingSate = utils.includeJammingSate(parsedData[16])
|
|
1154
|
+
const index = 16 // position append mask
|
|
1147
1155
|
|
|
1148
1156
|
data = Object.assign(data, {
|
|
1149
1157
|
alarm: utils.getAlarm(command[1], parsedData[4]),
|
|
@@ -1191,7 +1199,7 @@ const parse = raw => {
|
|
|
1191
1199
|
hourmeter: null
|
|
1192
1200
|
})
|
|
1193
1201
|
} else if (command[1] === 'GTCRG') {
|
|
1194
|
-
|
|
1202
|
+
const number = parsedData[5] !== '' ? parseInt(parsedData[5]) : 1
|
|
1195
1203
|
let start = 6
|
|
1196
1204
|
|
|
1197
1205
|
data = Object.assign(data, {
|
|
@@ -1205,7 +1213,7 @@ const parse = raw => {
|
|
|
1205
1213
|
}
|
|
1206
1214
|
})
|
|
1207
1215
|
|
|
1208
|
-
|
|
1216
|
+
const more = []
|
|
1209
1217
|
for (let i = 1; i <= number; i++) {
|
|
1210
1218
|
more.push({
|
|
1211
1219
|
id: parsedData[start] !== '' ? parseInt(parsedData[start]) : null,
|
|
@@ -1248,9 +1256,9 @@ const parse = raw => {
|
|
|
1248
1256
|
gnssData: more
|
|
1249
1257
|
})
|
|
1250
1258
|
} else if (command[1] === 'GTJDS') {
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1259
|
+
const index = 17 // position append mask
|
|
1260
|
+
const satelliteInfo = utils.includeSatellites(parsedData[17])
|
|
1261
|
+
const jammingSate = utils.includeJammingSate(parsedData[17])
|
|
1254
1262
|
|
|
1255
1263
|
data = Object.assign(data, {
|
|
1256
1264
|
alarm: utils.getAlarm(command[1], parsedData[4]),
|
|
@@ -1298,9 +1306,9 @@ const parse = raw => {
|
|
|
1298
1306
|
hourmeter: null
|
|
1299
1307
|
})
|
|
1300
1308
|
} else if (command[1] === 'GTIGN' || command[1] === 'GTIGF') {
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1309
|
+
const index = 16 // position append mask
|
|
1310
|
+
const satelliteInfo = utils.includeSatellites(parsedData[16])
|
|
1311
|
+
const jammingSate = utils.includeJammingSate(parsedData[16])
|
|
1304
1312
|
|
|
1305
1313
|
data = Object.assign(data, {
|
|
1306
1314
|
alarm: utils.getAlarm(command[1], parsedData[4]),
|
|
@@ -1352,9 +1360,9 @@ const parse = raw => {
|
|
|
1352
1360
|
: null
|
|
1353
1361
|
})
|
|
1354
1362
|
} else if (command[1] === 'GTIDN' || command[1] === 'GTIDF') {
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1363
|
+
const index = 17 // position append mask
|
|
1364
|
+
const satelliteInfo = utils.includeSatellites(parsedData[17])
|
|
1365
|
+
const jammingSate = utils.includeJammingSate(parsedData[17])
|
|
1358
1366
|
|
|
1359
1367
|
data = Object.assign(data, {
|
|
1360
1368
|
alarm: utils.getAlarm(command[1], parsedData[5]),
|
|
@@ -1407,9 +1415,9 @@ const parse = raw => {
|
|
|
1407
1415
|
command[1] === 'GTSTP' ||
|
|
1408
1416
|
command[1] === 'GTLSP'
|
|
1409
1417
|
) {
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1418
|
+
const satelliteInfo = utils.includeSatellites(parsedData[17])
|
|
1419
|
+
const jammingSate = utils.includeJammingSate(parsedData[17])
|
|
1420
|
+
const index = 17 + (satelliteInfo + jammingSate)
|
|
1413
1421
|
|
|
1414
1422
|
data = Object.assign(data, {
|
|
1415
1423
|
alarm: utils.getAlarm(command[1], null),
|
|
@@ -1459,9 +1467,9 @@ const parse = raw => {
|
|
|
1459
1467
|
})
|
|
1460
1468
|
} else if (command[1] === 'GTGSS') {
|
|
1461
1469
|
// GPS Status
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1470
|
+
const satelliteInfo = utils.includeSatellites(parsedData[19])
|
|
1471
|
+
const jammingSate = utils.includeJammingSate(parsedData[19])
|
|
1472
|
+
const index = 19 + (satelliteInfo + jammingSate)
|
|
1465
1473
|
|
|
1466
1474
|
data = Object.assign(data, {
|
|
1467
1475
|
alarm: utils.getAlarm(command[1], parsedData[4]),
|
|
@@ -1511,10 +1519,10 @@ const parse = raw => {
|
|
|
1511
1519
|
})
|
|
1512
1520
|
} else if (command[1] === 'GTIDA') {
|
|
1513
1521
|
// iButton
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1522
|
+
const number = parsedData[7] !== '' ? parseInt(parsedData[7], 10) : 1
|
|
1523
|
+
const satelliteInfo = utils.includeSatellites(parsedData[19])
|
|
1524
|
+
const jammingSate = utils.includeJammingSate(parsedData[19])
|
|
1525
|
+
const index = 7 + (12 + satelliteInfo + jammingSate) * number
|
|
1518
1526
|
|
|
1519
1527
|
data = Object.assign(data, {
|
|
1520
1528
|
alarm: utils.getAlarm(command[1], `${parsedData[5]},${parsedData[6]}`),
|
|
@@ -1563,12 +1571,12 @@ const parse = raw => {
|
|
|
1563
1571
|
hourmeter: null
|
|
1564
1572
|
})
|
|
1565
1573
|
} else if (command[1] === 'GTCAN') {
|
|
1566
|
-
|
|
1574
|
+
const canData = utils.getCanData(parsedData, 5, command[1], {
|
|
1567
1575
|
deviceType: 'GV350CEU'
|
|
1568
1576
|
})
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1577
|
+
const satelliteInfo = utils.includeSatellites(parsedData[canData[0]])
|
|
1578
|
+
const jammingSate = utils.includeJammingSate(parsedData[canData[0]])
|
|
1579
|
+
const index = canData[0] + (satelliteInfo ? 1 : 0) + (jammingSate ? 1 : 0)
|
|
1572
1580
|
|
|
1573
1581
|
data = Object.assign(data, {
|
|
1574
1582
|
alarm: utils.getAlarm(command[1], parsedData[4]),
|
|
@@ -1682,7 +1690,7 @@ const parse = raw => {
|
|
|
1682
1690
|
uartDeviceType: 'Camaleon',
|
|
1683
1691
|
fuelSensorData: null
|
|
1684
1692
|
}
|
|
1685
|
-
|
|
1693
|
+
const AC100Devices = [
|
|
1686
1694
|
{
|
|
1687
1695
|
deviceNumber: `${parsedData[2]}|1`,
|
|
1688
1696
|
deviceType: '1',
|
|
@@ -1699,11 +1707,11 @@ const parse = raw => {
|
|
|
1699
1707
|
})
|
|
1700
1708
|
}
|
|
1701
1709
|
externalData = Object.assign(externalData, {
|
|
1702
|
-
AC100Devices
|
|
1710
|
+
AC100Devices
|
|
1703
1711
|
})
|
|
1704
1712
|
data = Object.assign(data, {
|
|
1705
1713
|
alarm: utils.getAlarm('GTERI', null),
|
|
1706
|
-
externalData
|
|
1714
|
+
externalData
|
|
1707
1715
|
})
|
|
1708
1716
|
} else if (/^>ET/.test(parsedData[7])) {
|
|
1709
1717
|
// Temp Alarms
|
|
@@ -1715,7 +1723,7 @@ const parse = raw => {
|
|
|
1715
1723
|
parsedSerialData[4]
|
|
1716
1724
|
])
|
|
1717
1725
|
data = Object.assign(data, {
|
|
1718
|
-
alarm
|
|
1726
|
+
alarm
|
|
1719
1727
|
})
|
|
1720
1728
|
} else if (/^>ID/.test(parsedData[7])) {
|
|
1721
1729
|
// Checks if its a iButton GTDAT -> DT
|
|
@@ -1724,7 +1732,7 @@ const parse = raw => {
|
|
|
1724
1732
|
const driverID = parsedSerialData[2] ? parsedSerialData[2] : ''
|
|
1725
1733
|
const alarm = utils.getAlarm('GTIDA', `${driverID},1`)
|
|
1726
1734
|
data = Object.assign(data, {
|
|
1727
|
-
alarm
|
|
1735
|
+
alarm
|
|
1728
1736
|
})
|
|
1729
1737
|
} else {
|
|
1730
1738
|
// Normal GTDAT
|
|
@@ -1733,9 +1741,9 @@ const parse = raw => {
|
|
|
1733
1741
|
})
|
|
1734
1742
|
}
|
|
1735
1743
|
} else if (command[1] === 'GTDOS') {
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1744
|
+
const satelliteInfo = utils.includeSatellites(parsedData[17])
|
|
1745
|
+
const jammingSate = utils.includeJammingSate(parsedData[17])
|
|
1746
|
+
const index = 17 + (satelliteInfo ? 1 : 0) + (jammingSate ? 1 : 0)
|
|
1739
1747
|
|
|
1740
1748
|
data = Object.assign(data, {
|
|
1741
1749
|
alarm: utils.getAlarm(command[1], `${parsedData[4]},${parsedData[5]}`),
|
|
@@ -1818,9 +1826,9 @@ const parse = raw => {
|
|
|
1818
1826
|
})
|
|
1819
1827
|
} else if (command[1] === 'GTBCS' || command[1] === 'GTBDS') {
|
|
1820
1828
|
// Bluetooth connection/desconnection
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1829
|
+
const satelliteInfo = utils.includeSatellites(parsedData[16])
|
|
1830
|
+
const jammingSate = utils.includeJammingSate(parsedData[16])
|
|
1831
|
+
const index = 16 + (satelliteInfo ? 1 : 0) + (jammingSate ? 1 : 0)
|
|
1824
1832
|
|
|
1825
1833
|
data = Object.assign(data, {
|
|
1826
1834
|
alarm: utils.getAlarm(command[1], null, 'gv310lau'),
|
|
@@ -1930,34 +1938,34 @@ const parse = raw => {
|
|
|
1930
1938
|
// Bluetooth alarms
|
|
1931
1939
|
let satelliteInfo = false
|
|
1932
1940
|
let jammingSate = false
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1941
|
+
const appendIx = 8
|
|
1942
|
+
const appendMask = utils.nHexDigit(utils.hex2bin(parsedData[appendIx]), 16)
|
|
1943
|
+
const btAccessory = parsedData[5]
|
|
1944
|
+
const aNameIx = appendIx + parseInt(appendMask[15])
|
|
1945
|
+
const aMacIx = aNameIx + parseInt(appendMask[14])
|
|
1946
|
+
const aStatIx = aMacIx + parseInt(appendMask[13])
|
|
1947
|
+
const aBatIx = aStatIx + parseInt(appendMask[12])
|
|
1948
|
+
const aTmpIx = aBatIx + parseInt(appendMask[11])
|
|
1949
|
+
const aHumIx = aTmpIx + parseInt(appendMask[10])
|
|
1950
|
+
const ioIx = aHumIx + parseInt(appendMask[8])
|
|
1951
|
+
const aEvIx =
|
|
1944
1952
|
appendMask[8] === '1' && appendMask[7] === '1'
|
|
1945
1953
|
? ioIx + 3
|
|
1946
1954
|
: ioIx + parseInt(appendMask[7])
|
|
1947
|
-
|
|
1955
|
+
const pressIx =
|
|
1948
1956
|
appendMask[7] === '1' && appendMask[6] === '1'
|
|
1949
1957
|
? aEvIx + 2
|
|
1950
1958
|
: aEvIx + parseInt(appendMask[6])
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1959
|
+
const timeIx = pressIx + parseInt(appendMask[5])
|
|
1960
|
+
const eTmpIx = timeIx + parseInt(appendMask[4])
|
|
1961
|
+
const magIx = eTmpIx + parseInt(appendMask[3])
|
|
1962
|
+
const aBatpIx =
|
|
1955
1963
|
appendMask[3] === '1' && appendMask[2] === '1'
|
|
1956
1964
|
? magIx + 3
|
|
1957
1965
|
: magIx + parseInt(appendMask[2])
|
|
1958
|
-
|
|
1966
|
+
const relIx = aBatpIx + parseInt(appendMask[1])
|
|
1959
1967
|
|
|
1960
|
-
|
|
1968
|
+
const newIndex = relIx + 1 + parseInt(appendMask[1])
|
|
1961
1969
|
let satIndex = newIndex + 11
|
|
1962
1970
|
|
|
1963
1971
|
// If get satellites is configured
|
|
@@ -1972,7 +1980,7 @@ const parse = raw => {
|
|
|
1972
1980
|
jammingSate = true
|
|
1973
1981
|
}
|
|
1974
1982
|
|
|
1975
|
-
|
|
1983
|
+
const bleInfo = {
|
|
1976
1984
|
accesory:
|
|
1977
1985
|
btAccessory !== '' ? utils.bluetoothAccessories[btAccessory] : null,
|
|
1978
1986
|
model: parsedData[6] !== '' ? parseInt(parsedData[6]) : null,
|
|
@@ -2000,7 +2008,7 @@ const parse = raw => {
|
|
|
2000
2008
|
: null
|
|
2001
2009
|
}
|
|
2002
2010
|
|
|
2003
|
-
|
|
2011
|
+
const bleData = {
|
|
2004
2012
|
temperature:
|
|
2005
2013
|
parsedData[aTmpIx] !== '' && appendMask[11] === '1'
|
|
2006
2014
|
? parseInt(parsedData[aTmpIx])
|
|
@@ -2141,16 +2149,19 @@ const parse = raw => {
|
|
|
2141
2149
|
} else if (command[1] === 'GTBID') {
|
|
2142
2150
|
// Bluetooth beacon detection
|
|
2143
2151
|
let index = 4
|
|
2144
|
-
|
|
2152
|
+
const number = parsedData[index] !== '' ? parseInt(parsedData[index]) : 1
|
|
2145
2153
|
|
|
2146
|
-
|
|
2154
|
+
const btDevices = []
|
|
2147
2155
|
for (let i = 1; i <= number; i++) {
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2156
|
+
const appendMask = utils.nHexDigit(
|
|
2157
|
+
utils.hex2bin(parsedData[index + 2]),
|
|
2158
|
+
8
|
|
2159
|
+
)
|
|
2160
|
+
const nmIx = index + 2 + parseInt(appendMask[7])
|
|
2161
|
+
const macIx = nmIx + parseInt(appendMask[6])
|
|
2162
|
+
const batIx = macIx + parseInt(appendMask[4])
|
|
2163
|
+
const sigIx = batIx + parseInt(appendMask[1])
|
|
2164
|
+
const typeIx = sigIx + parseInt(appendMask[0])
|
|
2154
2165
|
btDevices.push({
|
|
2155
2166
|
model:
|
|
2156
2167
|
parsedData[index + 1] !== ''
|
|
@@ -2180,43 +2191,47 @@ const parse = raw => {
|
|
|
2180
2191
|
data:
|
|
2181
2192
|
appendMask[0] === '1' && parsedData[typeIx + 1] !== ''
|
|
2182
2193
|
? {
|
|
2183
|
-
|
|
2194
|
+
idMfrData:
|
|
2184
2195
|
parsedData[typeIx] === '0' && parsedData[typeIx + 1] !== ''
|
|
2185
2196
|
? parsedData[typeIx + 1]
|
|
2186
2197
|
: null,
|
|
2187
|
-
|
|
2198
|
+
uuid:
|
|
2188
2199
|
parsedData[typeIx] === '1' && parsedData[typeIx + 1] !== ''
|
|
2189
2200
|
? parsedData[typeIx + 1]
|
|
2190
2201
|
: null,
|
|
2191
|
-
|
|
2202
|
+
major:
|
|
2192
2203
|
parsedData[typeIx] === '1' && parsedData[typeIx + 2] !== ''
|
|
2193
2204
|
? parsedData[typeIx + 2]
|
|
2194
2205
|
: null,
|
|
2195
|
-
|
|
2206
|
+
minor:
|
|
2196
2207
|
parsedData[typeIx] === '1' && parsedData[typeIx + 3] !== ''
|
|
2197
2208
|
? parsedData[typeIx + 3]
|
|
2198
2209
|
: null,
|
|
2199
|
-
|
|
2210
|
+
nid:
|
|
2200
2211
|
parsedData[typeIx] === '2' && parsedData[typeIx + 1] !== ''
|
|
2201
2212
|
? parsedData[typeIx + 1]
|
|
2202
2213
|
: null,
|
|
2203
|
-
|
|
2214
|
+
bid:
|
|
2204
2215
|
parsedData[typeIx] === '2' && parsedData[typeIx + 2] !== ''
|
|
2205
2216
|
? parsedData[typeIx + 2]
|
|
2206
2217
|
: null
|
|
2207
|
-
|
|
2218
|
+
}
|
|
2208
2219
|
: null
|
|
2209
2220
|
})
|
|
2210
|
-
|
|
2221
|
+
const extra =
|
|
2211
2222
|
parsedData[typeIx] === '0'
|
|
2212
2223
|
? 1
|
|
2213
|
-
: parsedData[typeIx] === '1'
|
|
2224
|
+
: parsedData[typeIx] === '1'
|
|
2225
|
+
? 3
|
|
2226
|
+
: parsedData[typeIx] === '2'
|
|
2227
|
+
? 2
|
|
2228
|
+
: 0
|
|
2214
2229
|
index = typeIx + 1 + extra
|
|
2215
2230
|
}
|
|
2216
2231
|
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2232
|
+
const satelliteInfo = utils.includeSatellites(parsedData[index + 12])
|
|
2233
|
+
const jammingSate = utils.includeJammingSate(parsedData[index + 12])
|
|
2234
|
+
const satIndex = index + 12 + satelliteInfo + jammingSate
|
|
2220
2235
|
|
|
2221
2236
|
data = Object.assign(data, {
|
|
2222
2237
|
alarm: utils.getAlarm(command[1], null, 'gv310lau'),
|
|
@@ -2276,19 +2291,19 @@ const parse = raw => {
|
|
|
2276
2291
|
hourmeter: null
|
|
2277
2292
|
})
|
|
2278
2293
|
|
|
2279
|
-
|
|
2294
|
+
const bluetoothData = {
|
|
2280
2295
|
connectedDevices: number,
|
|
2281
|
-
btDevices
|
|
2296
|
+
btDevices
|
|
2282
2297
|
}
|
|
2283
2298
|
|
|
2284
2299
|
data = Object.assign(data, {
|
|
2285
|
-
bluetoothData
|
|
2300
|
+
bluetoothData
|
|
2286
2301
|
})
|
|
2287
2302
|
} else if (command[1] === 'GTVGN' || command[1] === 'GTVGF') {
|
|
2288
2303
|
// Virtual ignition
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2304
|
+
const satelliteInfo = utils.includeSatellites(parsedData[18])
|
|
2305
|
+
const jammingSate = utils.includeJammingSate(parsedData[18])
|
|
2306
|
+
const index = 18 + satelliteInfo + jammingSate
|
|
2292
2307
|
|
|
2293
2308
|
data = Object.assign(data, {
|
|
2294
2309
|
alarm: utils.getAlarm(command[1], [parsedData[6], parsedData[5]]),
|
|
@@ -2341,8 +2356,8 @@ const parse = raw => {
|
|
|
2341
2356
|
alarm: utils.getAlarm(command[1], null),
|
|
2342
2357
|
fixType: parsedData[3] !== '' ? parsedData[3] : null
|
|
2343
2358
|
})
|
|
2344
|
-
|
|
2345
|
-
|
|
2359
|
+
const antData = []
|
|
2360
|
+
let index = 4
|
|
2346
2361
|
for (let i = 0; i < 6; i++) {
|
|
2347
2362
|
antData.push({
|
|
2348
2363
|
mcc: parsedData[index] !== '' ? parseInt(parsedData[index], 10) : null,
|
|
@@ -2363,16 +2378,16 @@ const parse = raw => {
|
|
|
2363
2378
|
rxLevel:
|
|
2364
2379
|
parsedData[index + 4] !== ''
|
|
2365
2380
|
? utils.getSignalStrength(
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2381
|
+
'GSM',
|
|
2382
|
+
parseInt(parsedData[index + 4], 10)
|
|
2383
|
+
)
|
|
2369
2384
|
: null,
|
|
2370
2385
|
rxSignalPercentage:
|
|
2371
2386
|
parsedData[index + 4] !== ''
|
|
2372
2387
|
? utils.getSignalPercentage(
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2388
|
+
'GSM',
|
|
2389
|
+
parseInt(parsedData[index + 4], 10)
|
|
2390
|
+
)
|
|
2376
2391
|
: null
|
|
2377
2392
|
})
|
|
2378
2393
|
index += 6
|
|
@@ -2401,9 +2416,9 @@ const parse = raw => {
|
|
|
2401
2416
|
rxSignalPercentage:
|
|
2402
2417
|
parsedData[index + 4] !== ''
|
|
2403
2418
|
? utils.getSignalPercentage(
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2419
|
+
'GSM',
|
|
2420
|
+
parseInt(parsedData[index + 4], 10)
|
|
2421
|
+
)
|
|
2407
2422
|
: null
|
|
2408
2423
|
})
|
|
2409
2424
|
} else if (command[1] === 'GTCLT') {
|
|
@@ -2417,65 +2432,65 @@ const parse = raw => {
|
|
|
2417
2432
|
satelliteInfo = true
|
|
2418
2433
|
}
|
|
2419
2434
|
|
|
2420
|
-
|
|
2435
|
+
const alarmMask1 =
|
|
2421
2436
|
parsedData[5] !== ''
|
|
2422
2437
|
? utils
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
2438
|
+
.nHexDigit(utils.hex2bin(parsedData[5]), 32)
|
|
2439
|
+
.split('')
|
|
2440
|
+
.reverse()
|
|
2441
|
+
.join('')
|
|
2427
2442
|
: null
|
|
2428
|
-
|
|
2443
|
+
const alarmMask2 =
|
|
2429
2444
|
parsedData[6] !== ''
|
|
2430
2445
|
? utils
|
|
2431
|
-
|
|
2432
|
-
|
|
2433
|
-
|
|
2434
|
-
|
|
2446
|
+
.nHexDigit(utils.hex2bin(parsedData[6]), 32)
|
|
2447
|
+
.split('')
|
|
2448
|
+
.reverse()
|
|
2449
|
+
.join('')
|
|
2435
2450
|
: null
|
|
2436
|
-
|
|
2451
|
+
const alarmMask3 =
|
|
2437
2452
|
parsedData[7] !== ''
|
|
2438
2453
|
? utils
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2454
|
+
.nHexDigit(utils.hex2bin(parsedData[7]), 32)
|
|
2455
|
+
.split('')
|
|
2456
|
+
.reverse()
|
|
2457
|
+
.join('')
|
|
2443
2458
|
: null
|
|
2444
|
-
|
|
2459
|
+
const inicatorsBin =
|
|
2445
2460
|
parsedData[28] !== ''
|
|
2446
2461
|
? utils.nHexDigit(utils.hex2bin(parsedData[28]), 16)
|
|
2447
2462
|
: null
|
|
2448
|
-
|
|
2463
|
+
const lights =
|
|
2449
2464
|
parsedData[29] !== ''
|
|
2450
2465
|
? utils.nHexDigit(utils.hex2bin(parsedData[29]), 8)
|
|
2451
2466
|
: null
|
|
2452
|
-
|
|
2467
|
+
const doors =
|
|
2453
2468
|
parsedData[30] !== ''
|
|
2454
2469
|
? utils.nHexDigit(utils.hex2bin(parsedData[30]), 8)
|
|
2455
2470
|
: null
|
|
2456
|
-
|
|
2471
|
+
const canExpansionMask =
|
|
2457
2472
|
parsedData[33] !== ''
|
|
2458
2473
|
? utils
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2474
|
+
.nHexDigit(utils.hex2bin(parsedData[33]), 32)
|
|
2475
|
+
.split('')
|
|
2476
|
+
.reverse()
|
|
2477
|
+
.join('')
|
|
2463
2478
|
: null
|
|
2464
|
-
|
|
2479
|
+
const expansionBin =
|
|
2465
2480
|
parsedData[54] !== ''
|
|
2466
2481
|
? utils
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2482
|
+
.nHexDigit(utils.hex2bin(parsedData[54]), 16)
|
|
2483
|
+
.split('')
|
|
2484
|
+
.reverse()
|
|
2485
|
+
.join('')
|
|
2471
2486
|
: null
|
|
2472
|
-
|
|
2487
|
+
const tachographBin =
|
|
2473
2488
|
parsedData[27] !== ''
|
|
2474
2489
|
? utils
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2490
|
+
.nHexDigit(utils.hex2bin(parsedData[27]), 8)
|
|
2491
|
+
.split('')
|
|
2492
|
+
.reverse()
|
|
2493
|
+
.join('')
|
|
2479
2494
|
: null
|
|
2480
2495
|
data = Object.assign(data, {
|
|
2481
2496
|
alarm: utils.getAlarm(command[1], parsedData[6], [
|
|
@@ -2772,9 +2787,9 @@ const parse = raw => {
|
|
|
2772
2787
|
} else if (command[1] === 'GTSVR') {
|
|
2773
2788
|
// Primary Stolen Vehicle Recovery
|
|
2774
2789
|
// Primary: GV350CEU - Ghost: GV58LAU
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
|
|
2790
|
+
const satelliteInfo = utils.includeSatellites(parsedData[18])
|
|
2791
|
+
const jammingState = utils.includeJammingSate(parsedData[18])
|
|
2792
|
+
const index = 18 + satelliteInfo + jammingState
|
|
2778
2793
|
|
|
2779
2794
|
data = Object.assign(data, {
|
|
2780
2795
|
alarm: utils.getAlarm(command[1], parsedData[4]),
|
|
@@ -2828,9 +2843,9 @@ const parse = raw => {
|
|
|
2828
2843
|
})
|
|
2829
2844
|
} else if (command[1] === 'GTLBA') {
|
|
2830
2845
|
// Low Battery for FR433 devices
|
|
2831
|
-
|
|
2832
|
-
|
|
2833
|
-
|
|
2846
|
+
const satelliteInfo = utils.includeSatellites(parsedData[17])
|
|
2847
|
+
const jammingState = utils.includeJammingSate(parsedData[17])
|
|
2848
|
+
const index = 17 + satelliteInfo + jammingState
|
|
2834
2849
|
|
|
2835
2850
|
data = Object.assign(data, {
|
|
2836
2851
|
alarm: utils.getAlarm(command[1], [parsedData[4], parsedData[5]]),
|
|
@@ -2879,9 +2894,9 @@ const parse = raw => {
|
|
|
2879
2894
|
})
|
|
2880
2895
|
} else if (command[1] === 'GTASC') {
|
|
2881
2896
|
// Calibrarion data for XYZ-axis acceleration sensor
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2897
|
+
const satelliteInfo = utils.includeSatellites(parsedData[24])
|
|
2898
|
+
const jammingState = utils.includeJammingSate(parsedData[24])
|
|
2899
|
+
const index = 24 + satelliteInfo + jammingState
|
|
2885
2900
|
|
|
2886
2901
|
data = Object.assign(data, {
|
|
2887
2902
|
alarm: utils.getAlarm(command[1], null),
|
|
@@ -2942,13 +2957,13 @@ const parse = raw => {
|
|
|
2942
2957
|
} else if (command[1] === 'GTHBE') {
|
|
2943
2958
|
// Harsh Behavior Information
|
|
2944
2959
|
// Only works when GTHBM is in mode 5
|
|
2945
|
-
|
|
2946
|
-
|
|
2947
|
-
|
|
2960
|
+
const satelliteInfo = utils.includeSatellites(parsedData[18])
|
|
2961
|
+
const jammingState = utils.includeJammingSate(parsedData[18])
|
|
2962
|
+
const index = 18 + satelliteInfo + jammingState
|
|
2948
2963
|
|
|
2949
|
-
|
|
2950
|
-
|
|
2951
|
-
|
|
2964
|
+
const maxAcc = parsedData[index + 1] !== '' ? parsedData[index + 1] : null
|
|
2965
|
+
const avgAcc = parsedData[index + 2] !== '' ? parsedData[index + 2] : null
|
|
2966
|
+
const duration =
|
|
2952
2967
|
parsedData[index + 3] !== '' ? parseFloat(parsedData[index + 3]) : null
|
|
2953
2968
|
|
|
2954
2969
|
data = Object.assign(data, {
|
|
@@ -3023,7 +3038,7 @@ const parse = raw => {
|
|
|
3023
3038
|
? utils.getAccelerationMagnitude(avgAcc.substring(8, 12), 4)
|
|
3024
3039
|
: null
|
|
3025
3040
|
},
|
|
3026
|
-
duration
|
|
3041
|
+
duration,
|
|
3027
3042
|
odometer:
|
|
3028
3043
|
parsedData[index + 4] !== '' ? parseFloat(parsedData[index + 4]) : null,
|
|
3029
3044
|
hourmeter: null
|
|
@@ -3049,5 +3064,5 @@ const parse = raw => {
|
|
|
3049
3064
|
}
|
|
3050
3065
|
|
|
3051
3066
|
module.exports = {
|
|
3052
|
-
parse
|
|
3067
|
+
parse
|
|
3053
3068
|
}
|