queclink-parser 1.8.3 → 1.9.1
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 +37 -0
- package/example.js +67 -51
- package/package.json +1 -1
- package/src/gv300w.js +149 -2
- package/src/gv310lau.js +264 -93
- package/src/gv58lau.js +3346 -0
- package/src/index.js +3 -0
- package/src/messages/es.json +26 -26
- package/src/utils.js +164 -48
package/src/gv310lau.js
CHANGED
|
@@ -32,12 +32,12 @@ const parse = raw => {
|
|
|
32
32
|
if (command[1] === 'GTFRI') {
|
|
33
33
|
try {
|
|
34
34
|
let number = parsedData[6] !== '' ? parseInt(parsedData[6], 10) : 1
|
|
35
|
-
let index = 6 + 12 * number
|
|
35
|
+
let index = 6 + 12 * number
|
|
36
36
|
let satelliteInfo = false
|
|
37
37
|
|
|
38
38
|
// If get satellites is configured
|
|
39
39
|
if (utils.includeSatellites(parsedData[18])) {
|
|
40
|
-
index
|
|
40
|
+
index = 6 + 13 * number
|
|
41
41
|
satelliteInfo = true
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -54,7 +54,6 @@ const parse = raw => {
|
|
|
54
54
|
),
|
|
55
55
|
hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
|
|
56
56
|
status: {
|
|
57
|
-
// parsedData[26]
|
|
58
57
|
raw: parsedData[index + 7],
|
|
59
58
|
sos: false,
|
|
60
59
|
input: {
|
|
@@ -130,22 +129,22 @@ const parse = raw => {
|
|
|
130
129
|
inputCharge:
|
|
131
130
|
parsedData[4] !== '' ? parseFloat(parsedData[4]) / 1000 : null,
|
|
132
131
|
ada:
|
|
133
|
-
parsedData[index +
|
|
132
|
+
parsedData[index + 3] !== ''
|
|
134
133
|
? parseFloat(parsedData[index + 3]) / 1000
|
|
135
134
|
: null,
|
|
136
135
|
adb:
|
|
137
|
-
parsedData[index +
|
|
136
|
+
parsedData[index + 4] !== ''
|
|
138
137
|
? parseFloat(parsedData[index + 4]) / 1000
|
|
139
138
|
: null,
|
|
140
139
|
adc:
|
|
141
|
-
parsedData[index +
|
|
140
|
+
parsedData[index + 5] !== ''
|
|
142
141
|
? parseFloat(parsedData[index + 5]) / 1000
|
|
143
142
|
: null
|
|
144
143
|
},
|
|
145
|
-
mcc: parsedData[
|
|
146
|
-
mnc: parsedData[
|
|
147
|
-
lac: parsedData[
|
|
148
|
-
cid: parsedData[
|
|
144
|
+
mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
|
|
145
|
+
mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
|
|
146
|
+
lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
|
|
147
|
+
cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
|
|
149
148
|
satellites:
|
|
150
149
|
satelliteInfo && parsedData[index] !== ''
|
|
151
150
|
? parseInt(parsedData[index], 10)
|
|
@@ -159,6 +158,68 @@ const parse = raw => {
|
|
|
159
158
|
? utils.getHoursForHourmeter(parsedData[index + 2])
|
|
160
159
|
: null
|
|
161
160
|
})
|
|
161
|
+
|
|
162
|
+
// More than 1 GNSS report in data
|
|
163
|
+
if (number > 1) {
|
|
164
|
+
let moreData = []
|
|
165
|
+
for (let i = 1; i < number; i++) {
|
|
166
|
+
let gnssIx = satelliteInfo ? 7 + 13 * i : 7 + 12 * i
|
|
167
|
+
moreData.push({
|
|
168
|
+
index: i,
|
|
169
|
+
loc: {
|
|
170
|
+
type: 'Point',
|
|
171
|
+
coordinates: [
|
|
172
|
+
parseFloat(parsedData[gnssIx + 4]),
|
|
173
|
+
parseFloat(parsedData[gnssIx + 5])
|
|
174
|
+
]
|
|
175
|
+
},
|
|
176
|
+
speed:
|
|
177
|
+
parsedData[gnssIx + 1] !== ''
|
|
178
|
+
? parseFloat(parsedData[gnssIx + 1])
|
|
179
|
+
: null,
|
|
180
|
+
gpsStatus: utils.checkGps(
|
|
181
|
+
parseFloat(parsedData[gnssIx + 4]),
|
|
182
|
+
parseFloat(parsedData[gnssIx + 5])
|
|
183
|
+
),
|
|
184
|
+
hdop:
|
|
185
|
+
parsedData[gnssIx] !== '' ? parseFloat(parsedData[gnssIx]) : null,
|
|
186
|
+
azimuth:
|
|
187
|
+
parsedData[gnssIx + 2] !== ''
|
|
188
|
+
? parseFloat(parsedData[gnssIx + 2])
|
|
189
|
+
: null,
|
|
190
|
+
altitude:
|
|
191
|
+
parsedData[gnssIx + 3] !== ''
|
|
192
|
+
? parseFloat(parsedData[gnssIx + 3])
|
|
193
|
+
: null,
|
|
194
|
+
datetime:
|
|
195
|
+
parsedData[gnssIx + 6] !== ''
|
|
196
|
+
? utils.parseDate(parsedData[gnssIx + 6])
|
|
197
|
+
: null,
|
|
198
|
+
mcc:
|
|
199
|
+
parsedData[gnssIx + 7] !== ''
|
|
200
|
+
? parseInt(parsedData[gnssIx + 7], 10)
|
|
201
|
+
: null,
|
|
202
|
+
mnc:
|
|
203
|
+
parsedData[gnssIx + 8] !== ''
|
|
204
|
+
? parseInt(parsedData[gnssIx + 8], 10)
|
|
205
|
+
: null,
|
|
206
|
+
lac:
|
|
207
|
+
parsedData[gnssIx + 9] !== ''
|
|
208
|
+
? parseInt(parsedData[gnssIx + 9], 16)
|
|
209
|
+
: null,
|
|
210
|
+
cid:
|
|
211
|
+
parsedData[gnssIx + 10] !== ''
|
|
212
|
+
? parseInt(parsedData[gnssIx + 10], 16)
|
|
213
|
+
: null,
|
|
214
|
+
satellites:
|
|
215
|
+
satelliteInfo && parsedData[gnssIx + 12] !== ''
|
|
216
|
+
? parseInt(parsedData[gnssIx + 12], 10)
|
|
217
|
+
: null
|
|
218
|
+
})
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
data = Object.assign(data, { moreData: moreData })
|
|
222
|
+
}
|
|
162
223
|
} catch (err) {
|
|
163
224
|
return { type: 'UNKNOWN', raw: data.raw.toString() }
|
|
164
225
|
}
|
|
@@ -169,8 +230,8 @@ const parse = raw => {
|
|
|
169
230
|
let satelliteInfo = false
|
|
170
231
|
|
|
171
232
|
// If get satellites is configured
|
|
172
|
-
if (utils.includeSatellites(parsedData[
|
|
173
|
-
index
|
|
233
|
+
if (utils.includeSatellites(parsedData[19])) {
|
|
234
|
+
index = 6 + 13 * number
|
|
174
235
|
satelliteInfo = true
|
|
175
236
|
}
|
|
176
237
|
|
|
@@ -586,6 +647,68 @@ const parse = raw => {
|
|
|
586
647
|
data = Object.assign(data, {
|
|
587
648
|
externalData: externalData
|
|
588
649
|
})
|
|
650
|
+
|
|
651
|
+
// More than 1 GNSS report in data
|
|
652
|
+
if (number > 1) {
|
|
653
|
+
let moreData = []
|
|
654
|
+
for (let i = 1; i < number; i++) {
|
|
655
|
+
let gnssIx = satelliteInfo ? 8 + 13 * i : 8 + 12 * i
|
|
656
|
+
moreData.push({
|
|
657
|
+
index: i,
|
|
658
|
+
loc: {
|
|
659
|
+
type: 'Point',
|
|
660
|
+
coordinates: [
|
|
661
|
+
parseFloat(parsedData[gnssIx + 4]),
|
|
662
|
+
parseFloat(parsedData[gnssIx + 5])
|
|
663
|
+
]
|
|
664
|
+
},
|
|
665
|
+
speed:
|
|
666
|
+
parsedData[gnssIx + 1] !== ''
|
|
667
|
+
? parseFloat(parsedData[gnssIx + 1])
|
|
668
|
+
: null,
|
|
669
|
+
gpsStatus: utils.checkGps(
|
|
670
|
+
parseFloat(parsedData[gnssIx + 4]),
|
|
671
|
+
parseFloat(parsedData[gnssIx + 5])
|
|
672
|
+
),
|
|
673
|
+
hdop:
|
|
674
|
+
parsedData[gnssIx] !== '' ? parseFloat(parsedData[gnssIx]) : null,
|
|
675
|
+
azimuth:
|
|
676
|
+
parsedData[gnssIx + 2] !== ''
|
|
677
|
+
? parseFloat(parsedData[gnssIx + 2])
|
|
678
|
+
: null,
|
|
679
|
+
altitude:
|
|
680
|
+
parsedData[gnssIx + 3] !== ''
|
|
681
|
+
? parseFloat(parsedData[gnssIx + 3])
|
|
682
|
+
: null,
|
|
683
|
+
datetime:
|
|
684
|
+
parsedData[gnssIx + 6] !== ''
|
|
685
|
+
? utils.parseDate(parsedData[gnssIx + 6])
|
|
686
|
+
: null,
|
|
687
|
+
mcc:
|
|
688
|
+
parsedData[gnssIx + 7] !== ''
|
|
689
|
+
? parseInt(parsedData[gnssIx + 7], 10)
|
|
690
|
+
: null,
|
|
691
|
+
mnc:
|
|
692
|
+
parsedData[gnssIx + 8] !== ''
|
|
693
|
+
? parseInt(parsedData[gnssIx + 8], 10)
|
|
694
|
+
: null,
|
|
695
|
+
lac:
|
|
696
|
+
parsedData[gnssIx + 9] !== ''
|
|
697
|
+
? parseInt(parsedData[gnssIx + 9], 16)
|
|
698
|
+
: null,
|
|
699
|
+
cid:
|
|
700
|
+
parsedData[gnssIx + 10] !== ''
|
|
701
|
+
? parseInt(parsedData[gnssIx + 10], 16)
|
|
702
|
+
: null,
|
|
703
|
+
satellites:
|
|
704
|
+
satelliteInfo && parsedData[gnssIx + 12] !== ''
|
|
705
|
+
? parseInt(parsedData[gnssIx + 12], 10)
|
|
706
|
+
: null
|
|
707
|
+
})
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
data = Object.assign(data, { moreData: moreData })
|
|
711
|
+
}
|
|
589
712
|
} else if (command[1] === 'GTHBD') {
|
|
590
713
|
// Heartbeat. It must response an ACK command
|
|
591
714
|
data = Object.assign(data, {
|
|
@@ -597,17 +720,24 @@ const parse = raw => {
|
|
|
597
720
|
alarm: utils.getAlarm(command[1], null),
|
|
598
721
|
state: utils.states[parsedData[4]],
|
|
599
722
|
gsmInfo: {
|
|
600
|
-
SIM_ICC: parsedData[5],
|
|
601
|
-
networkType:
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
723
|
+
SIM_ICC: parsedData[5] !== '' ? parsedData[5] : null,
|
|
724
|
+
networkType:
|
|
725
|
+
parsedData[10] !== '' ? utils.networkTypes[parsedData[10]] : null,
|
|
726
|
+
RSSI: parsedData[6] !== '' ? parseInt(parsedData[6], 10) : null,
|
|
727
|
+
RSSI_quality:
|
|
728
|
+
parsedData[10] !== ''
|
|
729
|
+
? utils.getSignalStrength(
|
|
730
|
+
utils.networkTypes[parsedData[10]],
|
|
731
|
+
parseInt(parsedData[6], 10)
|
|
732
|
+
)
|
|
733
|
+
: null, // Signal Strength
|
|
734
|
+
RSSI_percentage:
|
|
735
|
+
parsedData[10] !== ''
|
|
736
|
+
? utils.getSignalPercentage(
|
|
737
|
+
utils.networkTypes[parsedData[10]],
|
|
738
|
+
parseInt(parsedData[6], 10)
|
|
739
|
+
)
|
|
740
|
+
: null, // Signal Percetange
|
|
611
741
|
GSM_quality:
|
|
612
742
|
parsedData[7] !== ''
|
|
613
743
|
? 100 * parseInt(parseFloat(parsedData[7]) / 7, 10)
|
|
@@ -1298,8 +1428,8 @@ const parse = raw => {
|
|
|
1298
1428
|
let satelliteInfo = false
|
|
1299
1429
|
|
|
1300
1430
|
// If get satellites is configured
|
|
1301
|
-
if (utils.includeSatellites(parsedData[
|
|
1302
|
-
index
|
|
1431
|
+
if (utils.includeSatellites(parsedData[19])) {
|
|
1432
|
+
index = 7 + 13 * number
|
|
1303
1433
|
satelliteInfo = true
|
|
1304
1434
|
}
|
|
1305
1435
|
|
|
@@ -1918,64 +2048,64 @@ const parse = raw => {
|
|
|
1918
2048
|
odometer: null,
|
|
1919
2049
|
hourmeter: null
|
|
1920
2050
|
})
|
|
1921
|
-
|
|
1922
|
-
data = Object.assign(data, {
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
})
|
|
1950
|
-
|
|
1951
|
-
data = Object.assign(data, {
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
})
|
|
2051
|
+
// } else if (command[1] === 'GTCID') {
|
|
2052
|
+
// data = Object.assign(data, {
|
|
2053
|
+
// alarm: utils.getAlarm(command[1], parsedData[4], 'gv310lau'),
|
|
2054
|
+
// loc: {
|
|
2055
|
+
// type: 'Point',
|
|
2056
|
+
// coordinates: [null, null]
|
|
2057
|
+
// },
|
|
2058
|
+
// speed: null,
|
|
2059
|
+
// gpsStatus: null,
|
|
2060
|
+
// hdop: null,
|
|
2061
|
+
// status: null,
|
|
2062
|
+
// azimuth: null,
|
|
2063
|
+
// altitude: null,
|
|
2064
|
+
// datetime: parsedData[5] !== '' ? utils.parseDate(parsedData[5]) : null,
|
|
2065
|
+
// voltage: {
|
|
2066
|
+
// battery: null,
|
|
2067
|
+
// inputCharge: null,
|
|
2068
|
+
// ada: null,
|
|
2069
|
+
// adb: null,
|
|
2070
|
+
// adc: null
|
|
2071
|
+
// },
|
|
2072
|
+
// mcc: null,
|
|
2073
|
+
// mnc: null,
|
|
2074
|
+
// lac: null,
|
|
2075
|
+
// cid: null,
|
|
2076
|
+
// satellites: null,
|
|
2077
|
+
// odometer: null,
|
|
2078
|
+
// hourmeter: null
|
|
2079
|
+
// })
|
|
2080
|
+
// } else if (command[1] === 'GTCSQ') {
|
|
2081
|
+
// data = Object.assign(data, {
|
|
2082
|
+
// alarm: utils.getAlarm(command[1], parsedData[5]),
|
|
2083
|
+
// loc: {
|
|
2084
|
+
// type: 'Point',
|
|
2085
|
+
// coordinates: [null, null]
|
|
2086
|
+
// },
|
|
2087
|
+
// speed: null,
|
|
2088
|
+
// gpsStatus: null,
|
|
2089
|
+
// hdop: null,
|
|
2090
|
+
// status: null,
|
|
2091
|
+
// azimuth: null,
|
|
2092
|
+
// altitude: null,
|
|
2093
|
+
// datetime: parsedData[6] !== '' ? utils.parseDate(parsedData[6]) : null,
|
|
2094
|
+
// voltage: {
|
|
2095
|
+
// battery: null,
|
|
2096
|
+
// inputCharge: null,
|
|
2097
|
+
// ada: null,
|
|
2098
|
+
// adb: null,
|
|
2099
|
+
// adc: null
|
|
2100
|
+
// },
|
|
2101
|
+
// mcc: null,
|
|
2102
|
+
// mnc: null,
|
|
2103
|
+
// lac: null,
|
|
2104
|
+
// cid: null,
|
|
2105
|
+
// satellites: null,
|
|
2106
|
+
// odometer: null,
|
|
2107
|
+
// hourmeter: null
|
|
2108
|
+
// })
|
|
1979
2109
|
} else if (command[1] === 'GTVER') {
|
|
1980
2110
|
data = Object.assign(data, {
|
|
1981
2111
|
alarm: utils.getAlarm(
|
|
@@ -2024,12 +2154,12 @@ const parse = raw => {
|
|
|
2024
2154
|
alarm: utils.getAlarm(command[1], null, 'gv310lau'),
|
|
2025
2155
|
loc: {
|
|
2026
2156
|
type: 'Point',
|
|
2027
|
-
coordinates: [parseFloat(parsedData[
|
|
2157
|
+
coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
|
|
2028
2158
|
},
|
|
2029
2159
|
speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
|
|
2030
2160
|
gpsStatus: utils.checkGps(
|
|
2031
|
-
parseFloat(parsedData[
|
|
2032
|
-
parseFloat(parsedData[
|
|
2161
|
+
parseFloat(parsedData[9]),
|
|
2162
|
+
parseFloat(parsedData[10])
|
|
2033
2163
|
),
|
|
2034
2164
|
hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
|
|
2035
2165
|
status: null,
|
|
@@ -2210,10 +2340,16 @@ const parse = raw => {
|
|
|
2210
2340
|
hourmeter: null,
|
|
2211
2341
|
bluetooth: {
|
|
2212
2342
|
raw: null,
|
|
2213
|
-
connected:
|
|
2343
|
+
connected: btAccessory !== '',
|
|
2214
2344
|
bluetoothInfo: {
|
|
2215
|
-
name:
|
|
2216
|
-
|
|
2345
|
+
name:
|
|
2346
|
+
parsedData[aNameIx] !== '' && appendMask[15] === '1'
|
|
2347
|
+
? parsedData[aNameIx]
|
|
2348
|
+
: null,
|
|
2349
|
+
mac:
|
|
2350
|
+
parsedData[aMacIx] !== '' && appendMask[14] === '1'
|
|
2351
|
+
? parsedData[aMacIx]
|
|
2352
|
+
: null
|
|
2217
2353
|
},
|
|
2218
2354
|
accessoryInfo: {
|
|
2219
2355
|
accesory:
|
|
@@ -2302,10 +2438,16 @@ const parse = raw => {
|
|
|
2302
2438
|
// Bluetooth beacon detection
|
|
2303
2439
|
let number = parsedData[4] !== '' ? parseInt(parsedData[4]) : 1
|
|
2304
2440
|
let index = 4
|
|
2305
|
-
let appMk
|
|
2441
|
+
let appMk, extra
|
|
2306
2442
|
for (let i = 1; i <= number; i++) {
|
|
2307
2443
|
appMk = utils.sumOnes(parsedData[index + 2])
|
|
2308
|
-
|
|
2444
|
+
extra =
|
|
2445
|
+
parsedData[index + 5] === '0'
|
|
2446
|
+
? 1
|
|
2447
|
+
: parsedData[index + 5] === '1'
|
|
2448
|
+
? 3
|
|
2449
|
+
: parsedData[index + 5] === '2' ? 2 : 0
|
|
2450
|
+
index += 2 + appMk + extra
|
|
2309
2451
|
}
|
|
2310
2452
|
let satelliteInfo = false
|
|
2311
2453
|
let satIndex = index + 12
|
|
@@ -2409,10 +2551,39 @@ const parse = raw => {
|
|
|
2409
2551
|
: null,
|
|
2410
2552
|
data:
|
|
2411
2553
|
appendMask[0] === '1' && parsedData[typeIx + 1] !== ''
|
|
2412
|
-
?
|
|
2554
|
+
? {
|
|
2555
|
+
idMfrData:
|
|
2556
|
+
parsedData[typeIx] === '0' && parsedData[typeIx + 1] !== ''
|
|
2557
|
+
? parsedData[typeIx + 1]
|
|
2558
|
+
: null,
|
|
2559
|
+
uuid:
|
|
2560
|
+
parsedData[typeIx] === '1' && parsedData[typeIx + 1] !== ''
|
|
2561
|
+
? parsedData[typeIx + 1]
|
|
2562
|
+
: null,
|
|
2563
|
+
major:
|
|
2564
|
+
parsedData[typeIx] === '1' && parsedData[typeIx + 2] !== ''
|
|
2565
|
+
? parsedData[typeIx + 2]
|
|
2566
|
+
: null,
|
|
2567
|
+
minor:
|
|
2568
|
+
parsedData[typeIx] === '1' && parsedData[typeIx + 3] !== ''
|
|
2569
|
+
? parsedData[typeIx + 3]
|
|
2570
|
+
: null,
|
|
2571
|
+
nid:
|
|
2572
|
+
parsedData[typeIx] === '2' && parsedData[typeIx + 1] !== ''
|
|
2573
|
+
? parsedData[typeIx + 1]
|
|
2574
|
+
: null,
|
|
2575
|
+
bid:
|
|
2576
|
+
parsedData[typeIx] === '2' && parsedData[typeIx + 2] !== ''
|
|
2577
|
+
? parsedData[typeIx + 2]
|
|
2578
|
+
: null
|
|
2579
|
+
}
|
|
2413
2580
|
: null
|
|
2414
2581
|
})
|
|
2415
|
-
|
|
2582
|
+
let extra =
|
|
2583
|
+
parsedData[typeIx] === '0'
|
|
2584
|
+
? 1
|
|
2585
|
+
: parsedData[typeIx] === '1' ? 3 : parsedData[typeIx] === '2' ? 2 : 0
|
|
2586
|
+
btIndex = typeIx + 1 + extra
|
|
2416
2587
|
}
|
|
2417
2588
|
|
|
2418
2589
|
let bluetoothData = {
|