queclink-parser 1.3.20

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/gl300.js ADDED
@@ -0,0 +1,378 @@
1
+ 'use strict'
2
+ const utils = require('./utils.js')
3
+
4
+ /*
5
+ Parses messages data from GL300 and GL300W devices
6
+ */
7
+ const parse = raw => {
8
+ raw = raw.substr(0, raw.length - 1)
9
+
10
+ const parsedData = raw.split(',')
11
+ const command = parsedData[0].split(':')
12
+
13
+ let history = false
14
+ if (utils.patterns.buffer.test(command[0])) {
15
+ history = true
16
+ }
17
+
18
+ let data = {
19
+ raw: `${raw.toString()}$`,
20
+ manufacturer: 'queclink',
21
+ device: 'Queclink-GL300',
22
+ type: 'data',
23
+ imei: parsedData[2],
24
+ protocolVersion: utils.getProtocolVersion(parsedData[1]),
25
+ temperature: null,
26
+ history: history,
27
+ sentTime: utils.parseDate(parsedData[parsedData.length - 2]),
28
+ serialId: parseInt(parsedData[parsedData.length - 1], 16),
29
+ hourmeter: null
30
+ }
31
+
32
+ // GPS
33
+ if (command[1] === 'GTFRI') {
34
+ data = Object.assign(data, {
35
+ alarm: utils.getAlarm(command[1], null),
36
+ loc: {
37
+ type: 'Point',
38
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
39
+ },
40
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
41
+ gpsStatus: utils.checkGps(
42
+ parseFloat(parsedData[11]),
43
+ parseFloat(parsedData[12])
44
+ ),
45
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
46
+ status: null,
47
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
48
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
49
+ datetime: parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
50
+ voltage: {
51
+ battery:
52
+ parsedData[parsedData.length - 3] !== ''
53
+ ? parseFloat(parsedData[parsedData.length - 3])
54
+ : null, // percentage
55
+ inputCharge: null
56
+ },
57
+ mcc:
58
+ parsedData[parsedData.length - 8] !== ''
59
+ ? parseInt(parsedData[parsedData.length - 8], 10)
60
+ : null,
61
+ mnc:
62
+ parsedData[parsedData.length - 7] !== ''
63
+ ? parseInt(parsedData[parsedData.length - 7], 10)
64
+ : null,
65
+ lac:
66
+ parsedData[parsedData.length - 6] !== ''
67
+ ? parseInt(parsedData[parsedData.length - 6], 16)
68
+ : null,
69
+ cid:
70
+ parsedData[parsedData.length - 5] !== ''
71
+ ? parseInt(parsedData[parsedData.length - 5], 16)
72
+ : null,
73
+ odometer:
74
+ parsedData[parsedData.length - 4] !== ''
75
+ ? parseFloat(parsedData[parsedData.length - 4])
76
+ : null
77
+ })
78
+ } else if (command[1] === 'GTHBD') {
79
+ // Heartbeat. It must response an ACK command
80
+ data = Object.assign(data, {
81
+ alarm: utils.getAlarm(command[1], null)
82
+ })
83
+ } else if (command[1] === 'GTINF') {
84
+ // General Info Report
85
+ data = Object.assign(data, {
86
+ alarm: utils.getAlarm(command[1], null),
87
+ state: utils.states[parsedData[4]],
88
+ gsmInfo: {
89
+ SIM_ICC: parsedData[5],
90
+ RSSI_dBm: parsedData[6],
91
+ RSSI_quality:
92
+ parsedData[7] !== ''
93
+ ? 100 * parseInt(parseFloat(parsedData[7]) / 7, 10)
94
+ : null // Percentage
95
+ },
96
+ backupBattery: {
97
+ using: parsedData[10] === '1',
98
+ voltage: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
99
+ charging: parsedData[12] === '1'
100
+ },
101
+ externalGPSAntenna: parsedData[15] === '0',
102
+ status: {
103
+ // parsedData[24]
104
+ raw: parsedData[18] + parsedData[19],
105
+ sos: false,
106
+ input: {
107
+ '1': utils.nHexDigit(utils.hex2bin(parsedData[20]), 2)[1] === '1',
108
+ '2': utils.nHexDigit(utils.hex2bin(parsedData[20]), 2)[0] === '1'
109
+ },
110
+ output: {
111
+ '1': utils.nHexDigit(utils.hex2bin(parsedData[21]), 2)[1] === '1',
112
+ '2': utils.nHexDigit(utils.hex2bin(parsedData[21]), 2)[0] === '1'
113
+ },
114
+ charge: parsedData[8] === '1'
115
+ },
116
+ voltage: {
117
+ battery: parsedData[18] !== '' ? parseInt(parsedData[18], 10) : null, // percentage
118
+ inputCharge: null
119
+ },
120
+ lastFixUTCTime:
121
+ parsedData[17] !== '' ? utils.parseDate(parsedData[16]) : null,
122
+ timezoneOffset: parsedData[22]
123
+ })
124
+ } else if (
125
+ command[1] === 'GTGEO' ||
126
+ command[1] === 'GTSPD' ||
127
+ command[1] === 'GTSOS' ||
128
+ command[1] === 'GTRTL' ||
129
+ command[1] === 'GTNMR' ||
130
+ command[1] === 'GTDIS' ||
131
+ command[1] === 'GTDOG' ||
132
+ command[1] === 'GTIGL' ||
133
+ command[1] === 'GTPNL' ||
134
+ command[1] === 'GTPFL'
135
+ ) {
136
+ // Common Alarms
137
+ data = Object.assign(data, {
138
+ alarm: utils.getAlarm(command[1], `${parsedData[4]}${parsedData[5]}`),
139
+ loc: {
140
+ type: 'Point',
141
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
142
+ },
143
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
144
+ gpsStatus: utils.checkGps(
145
+ parseFloat(parsedData[11]),
146
+ parseFloat(parsedData[12])
147
+ ),
148
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
149
+ status: null,
150
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
151
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
152
+ datetime: parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
153
+ voltage: {
154
+ battery: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null, // percentage
155
+ inputCharge:
156
+ parsedData[4] !== '' ? parseFloat(parsedData[4]) / 1000 : null
157
+ },
158
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
159
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
160
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
161
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
162
+ odometer: parsedData[18] !== '' ? parseFloat(parsedData[18]) : null
163
+ })
164
+ } else if (
165
+ command[1] === 'GTPNA' ||
166
+ command[1] === 'GTPFA' ||
167
+ command[1] === 'GTPDP'
168
+ ) {
169
+ // Event report (It uses the last GPS data and MCC info)
170
+ data = Object.assign(data, {
171
+ alarm: utils.getAlarm(command[1], null),
172
+ loc: null,
173
+ speed: null,
174
+ gpsStatus: null,
175
+ hdop: null,
176
+ status: null,
177
+ azimuth: null,
178
+ altitude: null,
179
+ datetime: parsedData[4] !== '' ? utils.parseDate(parsedData[4]) : null,
180
+ voltage: {
181
+ battery: null,
182
+ inputCharge: null
183
+ },
184
+ mcc: null,
185
+ mnc: null,
186
+ lac: null,
187
+ cid: null,
188
+ odometer: null
189
+ })
190
+ } else if (
191
+ command[1] === 'GTEPN' ||
192
+ command[1] === 'GTEPF' ||
193
+ command[1] === 'GTBTC'
194
+ ) {
195
+ data = Object.assign(data, {
196
+ alarm: utils.getAlarm(command[1], null),
197
+ loc: {
198
+ type: 'Point',
199
+ coordinates: [parseFloat(parsedData[8]), parseFloat(parsedData[9])]
200
+ },
201
+ speed: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
202
+ gpsStatus: utils.checkGps(
203
+ parseFloat(parsedData[8]),
204
+ parseFloat(parsedData[9])
205
+ ),
206
+ hdop: parsedData[4] !== '' ? parseFloat(parsedData[4]) : null,
207
+ status: null,
208
+ azimuth: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
209
+ altitude: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
210
+ datetime: parsedData[10] !== '' ? utils.parseDate(parsedData[10]) : null,
211
+ voltage: {
212
+ battery: null,
213
+ inputCharge: null
214
+ },
215
+ mcc: parsedData[11] !== '' ? parseInt(parsedData[11], 10) : null,
216
+ mnc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
217
+ lac: parsedData[13] !== '' ? parseInt(parsedData[13], 16) : null,
218
+ cid: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
219
+ odometer: parsedData[15] !== '' ? parseFloat(parsedData[15]) : null
220
+ })
221
+ } else if (command[1] === 'GTBPL' || command[1] === 'GTSTC') {
222
+ data = Object.assign(data, {
223
+ alarm: utils.getAlarm(command[1], null),
224
+ loc: {
225
+ type: 'Point',
226
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
227
+ },
228
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
229
+ gpsStatus: utils.checkGps(
230
+ parseFloat(parsedData[9]),
231
+ parseFloat(parsedData[10])
232
+ ),
233
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
234
+ status: null,
235
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
236
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
237
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
238
+ voltage: {
239
+ battery: parsedData[4] !== '' ? parseFloat(parsedData[4]) : null,
240
+ inputCharge: null
241
+ },
242
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
243
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
244
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
245
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
246
+ odometer: parsedData[16] !== '' ? parseFloat(parsedData[16]) : null
247
+ })
248
+ } else if (command[1] === 'GTSTT') {
249
+ // Motion State Changed
250
+ data = Object.assign(data, {
251
+ alarm: utils.getAlarm(command[1], parsedData[4]),
252
+ loc: {
253
+ type: 'Point',
254
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
255
+ },
256
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
257
+ gpsStatus: utils.checkGps(
258
+ parseFloat(parsedData[9]),
259
+ parseFloat(parsedData[10])
260
+ ),
261
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
262
+ status: null,
263
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
264
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
265
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
266
+ voltage: {
267
+ battery: null,
268
+ inputCharge: null
269
+ },
270
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
271
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
272
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
273
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
274
+ odometer: parsedData[16] !== '' ? parseFloat(parsedData[16]) : null
275
+ })
276
+ } else if (command[1] === 'GTIGN' || command[1] === 'GTIGF') {
277
+ data = Object.assign(data, {
278
+ alarm: utils.getAlarm(command[1], parsedData[4]),
279
+ loc: {
280
+ type: 'Point',
281
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
282
+ },
283
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
284
+ gpsStatus: utils.checkGps(
285
+ parseFloat(parsedData[9]),
286
+ parseFloat(parsedData[10])
287
+ ),
288
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
289
+ status: null,
290
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
291
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
292
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
293
+ voltage: {
294
+ battery: null,
295
+ inputCharge: null
296
+ },
297
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
298
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
299
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
300
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
301
+ odometer: parsedData[16] !== '' ? parseFloat(parsedData[16]) : null
302
+ })
303
+ } else if (command[1] === 'GTJDR') {
304
+ data = Object.assign(data, {
305
+ alarm: utils.getAlarm(command[1], null),
306
+ loc: {
307
+ type: 'Point',
308
+ coordinates: [parseFloat(parsedData[8]), parseFloat(parsedData[9])]
309
+ },
310
+ speed: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
311
+ gpsStatus: utils.checkGps(
312
+ parseFloat(parsedData[8]),
313
+ parseFloat(parsedData[9])
314
+ ),
315
+ hdop: parsedData[4] !== '' ? parseFloat(parsedData[4]) : null,
316
+ status: null,
317
+ azimuth: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
318
+ altitude: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
319
+ datetime: parsedData[10] !== '' ? utils.parseDate(parsedData[10]) : null,
320
+ voltage: {
321
+ battery: null,
322
+ inputCharge: null
323
+ },
324
+ mcc: parsedData[11] !== '' ? parseInt(parsedData[11], 10) : null,
325
+ mnc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
326
+ lac: parsedData[13] !== '' ? parseInt(parsedData[13], 16) : null,
327
+ cid: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
328
+ odometer: null
329
+ })
330
+ } else if (command[1] === 'GTJDS') {
331
+ data = Object.assign(data, {
332
+ alarm: utils.getAlarm(command[1], parsedData[4]),
333
+ loc: {
334
+ type: 'Point',
335
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
336
+ },
337
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
338
+ gpsStatus: utils.checkGps(
339
+ parseFloat(parsedData[9]),
340
+ parseFloat(parsedData[10])
341
+ ),
342
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
343
+ status: null,
344
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
345
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
346
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
347
+ voltage: {
348
+ battery: null,
349
+ inputCharge: null
350
+ },
351
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
352
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
353
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
354
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
355
+ odometer: null
356
+ })
357
+ } else {
358
+ data = Object.assign(data, {
359
+ alarm: utils.getAlarm(command[1], null)
360
+ })
361
+ }
362
+ // Check gps data
363
+ if (data.loc !== null && typeof data.loc !== 'undefined') {
364
+ if (
365
+ data.loc.coordinates[0] === 0 ||
366
+ isNaN(data.loc.coordinates[0]) ||
367
+ data.loc.coordinates[1] === 0 ||
368
+ isNaN(data.loc.coordinates[1])
369
+ ) {
370
+ data.loc = null
371
+ }
372
+ }
373
+ return data
374
+ }
375
+
376
+ module.exports = {
377
+ parse: parse
378
+ }
package/src/gl50.js ADDED
@@ -0,0 +1,224 @@
1
+ 'use strict'
2
+ const utils = require('./utils.js')
3
+
4
+ /*
5
+ Parses messages data from GL50 devices
6
+ */
7
+ const parse = raw => {
8
+ raw = raw.substr(0, raw.length - 1)
9
+
10
+ const parsedData = raw.split(',')
11
+ const command = parsedData[0].split(':')
12
+
13
+ let history = false
14
+ if (utils.patterns.buffer.test(command[0])) {
15
+ history = true
16
+ }
17
+
18
+ let data = {
19
+ raw: `${raw.toString()}$`,
20
+ manufacturer: 'queclink',
21
+ device: 'Queclink-GL50',
22
+ type: 'data',
23
+ imei: parsedData[2],
24
+ protocolVersion: utils.getProtocolVersion(parsedData[1]),
25
+ temperature: null,
26
+ history: history,
27
+ sentTime: utils.parseDate(parsedData[parsedData.length - 2]),
28
+ serialId: parseInt(parsedData[parsedData.length - 1], 16)
29
+ }
30
+
31
+ // GPS
32
+ if (
33
+ command[1] === 'GTCTN' ||
34
+ command[1] === 'GTRTL' ||
35
+ command[1] === 'GTSTR' ||
36
+ command[1] === 'GTDOG'
37
+ ) {
38
+ data = Object.assign(data, {
39
+ alarm: utils.getAlarm(command[1], parsedData[5]),
40
+ loc: {
41
+ type: 'Point',
42
+ coordinates: [parseFloat(parsedData[13]), parseFloat(parsedData[14])]
43
+ },
44
+ speed: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
45
+ gpsStatus: utils.checkGps(
46
+ parseFloat(parsedData[13]),
47
+ parseFloat(parsedData[14])
48
+ ),
49
+ hdop: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
50
+ status: null,
51
+ azimuth: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
52
+ altitude: parsedData[12] !== '' ? parseFloat(parsedData[12]) : null,
53
+ datetime: parsedData[15] !== '' ? utils.parseDate(parsedData[15]) : null,
54
+ voltage: {
55
+ battery: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
56
+ inputCharge: false
57
+ },
58
+ mcc: parsedData[16] !== '' ? parseInt(parsedData[16], 10) : null,
59
+ mnc: parsedData[17] !== '' ? parseInt(parsedData[17], 10) : null,
60
+ lac: parsedData[18] !== '' ? parseInt(parsedData[18], 16) : null,
61
+ cid: parsedData[19] !== '' ? parseInt(parsedData[19], 16) : null,
62
+ odometer: null,
63
+ hourmeter: null,
64
+ reportCount:
65
+ parsedData[parsedData.length - 4] !== ''
66
+ ? parseInt(parsedData[parsedData.length - 4], 10)
67
+ : null,
68
+ maxCount:
69
+ parsedData[parsedData.length - 3] !== ''
70
+ ? parseInt(parsedData[parsedData.length - 3], 10)
71
+ : null
72
+ })
73
+ } else if (command[1] === 'GTNMR') {
74
+ data = Object.assign(data, {
75
+ alarm: utils.getAlarm(command[1], `0${parsedData[5]}`),
76
+ loc: {
77
+ type: 'Point',
78
+ coordinates: [parseFloat(parsedData[13]), parseFloat(parsedData[14])]
79
+ },
80
+ speed: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
81
+ gpsStatus: utils.checkGps(
82
+ parseFloat(parsedData[13]),
83
+ parseFloat(parsedData[14])
84
+ ),
85
+ hdop: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
86
+ status: null,
87
+ azimuth: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
88
+ altitude: parsedData[12] !== '' ? parseFloat(parsedData[12]) : null,
89
+ datetime: parsedData[15] !== '' ? utils.parseDate(parsedData[15]) : null,
90
+ voltage: {
91
+ battery: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
92
+ inputCharge: false
93
+ },
94
+ mcc: parsedData[16] !== '' ? parseInt(parsedData[16], 10) : null,
95
+ mnc: parsedData[17] !== '' ? parseInt(parsedData[17], 10) : null,
96
+ lac: parsedData[18] !== '' ? parseInt(parsedData[18], 16) : null,
97
+ cid: parsedData[19] !== '' ? parseInt(parsedData[19], 16) : null,
98
+ odometer: null,
99
+ hourmeter: null,
100
+ reportCount:
101
+ parsedData[parsedData.length - 4] !== ''
102
+ ? parseInt(parsedData[parsedData.length - 4], 10)
103
+ : null,
104
+ maxCount:
105
+ parsedData[parsedData.length - 3] !== ''
106
+ ? parseInt(parsedData[parsedData.length - 3], 10)
107
+ : null
108
+ })
109
+ } else if (command[1] === 'GTLOC') {
110
+ data = Object.assign(data, {
111
+ alarm: utils.getAlarm(command[1], parsedData[5], true),
112
+ loc: {
113
+ type: 'Point',
114
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
115
+ },
116
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
117
+ gpsStatus: utils.checkGps(
118
+ parseFloat(parsedData[11]),
119
+ parseFloat(parsedData[12])
120
+ ),
121
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
122
+ status: null,
123
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
124
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
125
+ datetime: parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
126
+ voltage: {
127
+ battery: null,
128
+ inputCharge: null
129
+ },
130
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
131
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
132
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
133
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
134
+ odometer: null,
135
+ hourmeter: null,
136
+ reportCount: null,
137
+ maxCount: null
138
+ })
139
+ } else if (command[1] === 'GTPNA') {
140
+ // Event report (It uses the last GPS data and MCC info)
141
+ data = Object.assign(data, {
142
+ alarm: utils.getAlarm(command[1], null),
143
+ loc: null,
144
+ speed: null,
145
+ gpsStatus: null,
146
+ hdop: null,
147
+ status: null,
148
+ azimuth: null,
149
+ altitude: null,
150
+ datetime:
151
+ parsedData[parsedData.length - 2] !== ''
152
+ ? utils.parseDate(parsedData[parsedData.length - 2])
153
+ : null,
154
+ voltage: {
155
+ battery: null,
156
+ inputCharge: null
157
+ },
158
+ mcc: null,
159
+ mnc: null,
160
+ lac: null,
161
+ cid: null,
162
+ odometer: null,
163
+ hourmeter: null,
164
+ reportCount: null,
165
+ maxCount: null
166
+ })
167
+ } else if (command[1] === 'GTBPL') {
168
+ data = Object.assign(data, {
169
+ alarm: utils.getAlarm(command[1], parsedData[5]),
170
+ loc: {
171
+ type: 'Point',
172
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
173
+ },
174
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
175
+ gpsStatus: utils.checkGps(
176
+ parseFloat(parsedData[11]),
177
+ parseFloat(parsedData[12])
178
+ ),
179
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
180
+ status: null,
181
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
182
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
183
+ datetime: parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
184
+ voltage: {
185
+ battery: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
186
+ inputCharge: false
187
+ },
188
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
189
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
190
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
191
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
192
+ odometer: null,
193
+ hourmeter: null,
194
+ reportCount:
195
+ parsedData[parsedData.length - 4] !== ''
196
+ ? parseInt(parsedData[parsedData.length - 4], 10)
197
+ : null,
198
+ maxCount:
199
+ parsedData[parsedData.length - 3] !== ''
200
+ ? parseInt(parsedData[parsedData.length - 3], 10)
201
+ : null
202
+ })
203
+ } else {
204
+ data = Object.assign(data, {
205
+ alarm: utils.getAlarm(command[1], null)
206
+ })
207
+ }
208
+ // Check gps data
209
+ if (data.loc !== null && typeof data.loc !== 'undefined') {
210
+ if (
211
+ data.loc.coordinates[0] === 0 ||
212
+ isNaN(data.loc.coordinates[0]) ||
213
+ data.loc.coordinates[1] === 0 ||
214
+ isNaN(data.loc.coordinates[1])
215
+ ) {
216
+ data.loc = null
217
+ }
218
+ }
219
+ return data
220
+ }
221
+
222
+ module.exports = {
223
+ parse: parse
224
+ }