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/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 // position append mask
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 += 1
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 + 4] !== ''
132
+ parsedData[index + 3] !== ''
134
133
  ? parseFloat(parsedData[index + 3]) / 1000
135
134
  : null,
136
135
  adb:
137
- parsedData[index + 5] !== ''
136
+ parsedData[index + 4] !== ''
138
137
  ? parseFloat(parsedData[index + 4]) / 1000
139
138
  : null,
140
139
  adc:
141
- parsedData[index + 6] !== ''
140
+ parsedData[index + 5] !== ''
142
141
  ? parseFloat(parsedData[index + 5]) / 1000
143
142
  : null
144
143
  },
145
- mcc: parsedData[13] !== '' ? parseInt(parsedData[14], 10) : null,
146
- mnc: parsedData[14] !== '' ? parseInt(parsedData[15], 10) : null,
147
- lac: parsedData[15] !== '' ? parseInt(parsedData[16], 16) : null,
148
- cid: parsedData[16] !== '' ? parseInt(parsedData[17], 16) : null,
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[index])) {
173
- index += 1
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: utils.networkTypes[parsedData[10]],
602
- RSSI: parseInt(parsedData[6], 10),
603
- RSSI_quality: utils.getSignalStrength(
604
- utils.networkTypes[parsedData[10]],
605
- parseInt(parsedData[6], 10)
606
- ), // Signal Strength
607
- RSSI_percentage: utils.getSignalPercentage(
608
- utils.networkTypes[parsedData[10]],
609
- parseInt(parsedData[6], 10)
610
- ), // Signal Percetange
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[index])) {
1302
- index += 1
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
- } else if (command[1] === 'GTCID') {
1922
- data = Object.assign(data, {
1923
- alarm: utils.getAlarm(command[1], parsedData[4], 'gv310lau'),
1924
- loc: {
1925
- type: 'Point',
1926
- coordinates: [null, null]
1927
- },
1928
- speed: null,
1929
- gpsStatus: null,
1930
- hdop: null,
1931
- status: null,
1932
- azimuth: null,
1933
- altitude: null,
1934
- datetime: parsedData[5] !== '' ? utils.parseDate(parsedData[5]) : null,
1935
- voltage: {
1936
- battery: null,
1937
- inputCharge: null,
1938
- ada: null,
1939
- adb: null,
1940
- adc: null
1941
- },
1942
- mcc: null,
1943
- mnc: null,
1944
- lac: null,
1945
- cid: null,
1946
- satellites: null,
1947
- odometer: null,
1948
- hourmeter: null
1949
- })
1950
- } else if (command[1] === 'GTCSQ') {
1951
- data = Object.assign(data, {
1952
- alarm: utils.getAlarm(command[1], parsedData[5], 'gv310lau'),
1953
- loc: {
1954
- type: 'Point',
1955
- coordinates: [null, null]
1956
- },
1957
- speed: null,
1958
- gpsStatus: null,
1959
- hdop: null,
1960
- status: null,
1961
- azimuth: null,
1962
- altitude: null,
1963
- datetime: parsedData[6] !== '' ? utils.parseDate(parsedData[6]) : null,
1964
- voltage: {
1965
- battery: null,
1966
- inputCharge: null,
1967
- ada: null,
1968
- adb: null,
1969
- adc: null
1970
- },
1971
- mcc: null,
1972
- mnc: null,
1973
- lac: null,
1974
- cid: null,
1975
- satellites: null,
1976
- odometer: null,
1977
- hourmeter: null
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[11]), parseFloat(parsedData[12])]
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[11]),
2032
- parseFloat(parsedData[12])
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: null,
2343
+ connected: btAccessory !== '',
2214
2344
  bluetoothInfo: {
2215
- name: null,
2216
- mac: null
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
- index += 2 + appMk
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
- ? parsedData[typeIx + 1]
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
- btIndex = typeIx + 1
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 = {