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/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
#### 1.9.31 (2026-05-07)
|
|
2
|
+
|
|
3
|
+
##### Chores
|
|
4
|
+
|
|
5
|
+
* **dev:** upgrade dev dependencies and fix vulnerabilities ([625a66a5](https://github.com/jaayesta/queclink-parser/commit/625a66a5a84a076527e3f5c773d2711336e8ab36))
|
|
6
|
+
|
|
7
|
+
##### New Features
|
|
8
|
+
|
|
9
|
+
* **node22:** se actualiza el proyecto a node 22 ([a07c3c42](https://github.com/jaayesta/queclink-parser/commit/a07c3c423aa8c671ddc4f521ded7d8c5bb785117))
|
|
10
|
+
* **pnr:** se agrega motivo del reinicio. ([225f5fce](https://github.com/jaayesta/queclink-parser/commit/225f5fce94f0618cf99ad7b3fe56a1bdfe18877e))
|
|
11
|
+
|
|
12
|
+
##### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* **readme:** se actualiza documentación ([08f5e033](https://github.com/jaayesta/queclink-parser/commit/08f5e033464827d7f6b6becad59077331e78a39a))
|
|
15
|
+
|
|
16
|
+
#### 1.9.29 (2026-03-20)
|
|
17
|
+
|
|
18
|
+
##### Bug Fixes
|
|
19
|
+
|
|
20
|
+
* **config:** se corrige status en consulta de configuración. ([75e29aa1](https://github.com/jaayesta/queclink-parser/commit/75e29aa185dd6002b0d2fd5c6fb3e1dadbbe6dd8))
|
|
21
|
+
|
|
1
22
|
#### 1.9.28 (2026-03-17)
|
|
2
23
|
|
|
3
24
|
##### Bug Fixes
|
package/README.md
CHANGED
|
@@ -2,29 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/queclink-parser)
|
|
4
4
|
[](https://www.npmjs.com/package/queclink-parser)
|
|
5
|
-
[](https://libraries.io/npm/queclink-parser)
|
|
6
|
+
[](https://snyk.io/test/npm/queclink-parser)
|
|
7
7
|
|
|
8
|
-
> Parses raw data from Queclink devices (TCP).
|
|
8
|
+
> Parses raw data from Queclink devices (TCP).
|
|
9
|
+
|
|
10
|
+
## Supported Devices
|
|
11
|
+
GV55, GV55W, GV200, GV300, GV75W, GV300W, GV500, GV500MAP, GV600W, GV800W, GMT100, GL50, GL50B, GL300, GL300W, GV50P, GV310LAU, GV350CEU, GV58LAU, GV57CG, GL533CG.
|
|
12
|
+
|
|
13
|
+
## Requirements
|
|
14
|
+
- **Node.js**: >= 22
|
|
9
15
|
|
|
10
16
|
## Installation
|
|
11
17
|
|
|
12
18
|
```bash
|
|
13
|
-
npm
|
|
19
|
+
npm install queclink-parser
|
|
14
20
|
```
|
|
15
21
|
|
|
16
|
-
##
|
|
17
|
-
|
|
18
|
-
[Try on Tonic](https://tonicdev.com/npm/queclink-parser)
|
|
19
|
-
```js
|
|
22
|
+
## Usage
|
|
20
23
|
|
|
24
|
+
```javascript
|
|
21
25
|
const queclink = require('queclink-parser');
|
|
22
26
|
|
|
23
|
-
const raw =
|
|
27
|
+
const raw = Buffer.from('+RESP:GTFRI,350302,867844003012625,,12372,10,1,0,0.0,0,820.8,-70.514872,-33.361021,20160811154617,0730,0002,7410,C789,00,0.0,00000:15:30,2788,705,164,0D,00,,,20160811154651,061D$');
|
|
24
28
|
const data = queclink.parse(raw);
|
|
25
29
|
|
|
30
|
+
console.log(data);
|
|
26
31
|
/*
|
|
27
|
-
{
|
|
32
|
+
{
|
|
33
|
+
raw: '+RESP:GTFRI,350302,867844003012625,,12372,10,1,0,0.0,0,820.8,-70.514872,-33.361021,20160811154617,0730,0002,7410,C789,00,0.0,00000:15:30,2788,705,164,0D,00,,,20160811154651,061D$',
|
|
28
34
|
manufacturer: 'queclink',
|
|
29
35
|
device: 'Queclink-GV200',
|
|
30
36
|
type: 'data',
|
|
@@ -39,21 +45,23 @@ const data = queclink.parse(raw);
|
|
|
39
45
|
speed: 0,
|
|
40
46
|
gpsStatus: true,
|
|
41
47
|
hdop: 0,
|
|
42
|
-
status:
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
status: {
|
|
49
|
+
raw: '0D00',
|
|
50
|
+
sos: false,
|
|
51
|
+
input: { '1': true, '2': false, '3': true, '4': true },
|
|
52
|
+
output: { '1': false, '2': false, '3': false, '4': false },
|
|
53
|
+
charge: true
|
|
54
|
+
},
|
|
48
55
|
azimuth: 0,
|
|
49
56
|
altitude: 820.8,
|
|
50
57
|
datetime: 2016-08-11T15:46:17.000Z,
|
|
51
|
-
voltage:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
voltage: {
|
|
59
|
+
battery: null,
|
|
60
|
+
inputCharge: 12.372,
|
|
61
|
+
ada: 2.788,
|
|
62
|
+
adb: 0.705,
|
|
63
|
+
adc: 0.164
|
|
64
|
+
},
|
|
57
65
|
mcc: 730,
|
|
58
66
|
mnc: 2,
|
|
59
67
|
lac: 29712,
|
|
@@ -62,7 +70,6 @@ const data = queclink.parse(raw);
|
|
|
62
70
|
hourmeter: 0.25833333333333336
|
|
63
71
|
}
|
|
64
72
|
*/
|
|
65
|
-
|
|
66
73
|
```
|
|
67
74
|
|
|
68
75
|
## License
|
package/package.json
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "queclink-parser",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.31",
|
|
4
4
|
"description": "Parse raw data from Queclink devices",
|
|
5
5
|
"main": "src",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"lint": "eslint . --fix",
|
|
8
|
-
"format": "prettier
|
|
9
|
-
"
|
|
8
|
+
"format": "prettier --write 'src/**/*.js' 'test/**/*.js'",
|
|
9
|
+
"audit:critical": "npm audit --audit-level=critical",
|
|
10
10
|
"pretest": "npm run lint -s && npm run format -s",
|
|
11
|
-
"test": "
|
|
11
|
+
"test": "nyc mocha",
|
|
12
12
|
"release:major": "changelog -M && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version major && git push origin && git push origin --tags && npm publish",
|
|
13
13
|
"release:minor": "changelog -m && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version minor && git push origin && git push origin --tags && npm publish",
|
|
14
|
-
"release:patch": "changelog -p && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version patch && git push origin && git push origin --tags && npm publish"
|
|
14
|
+
"release:patch": "changelog -p && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version patch && git push origin && git push origin --tags && npm publish",
|
|
15
|
+
"prepare": "husky"
|
|
15
16
|
},
|
|
16
17
|
"engines": {
|
|
17
|
-
"node": ">=
|
|
18
|
+
"node": ">=22"
|
|
18
19
|
},
|
|
19
20
|
"repository": {
|
|
20
21
|
"type": "git",
|
|
@@ -40,29 +41,34 @@
|
|
|
40
41
|
"url": "https://github.com/jaayesta/queclink-parser/issues"
|
|
41
42
|
},
|
|
42
43
|
"homepage": "https://github.com/jaayesta/queclink-parser#readme",
|
|
43
|
-
"
|
|
44
|
+
"overrides": {
|
|
45
|
+
"diff": "^8.0.3",
|
|
46
|
+
"serialize-javascript": "^7.0.5"
|
|
47
|
+
},
|
|
44
48
|
"devDependencies": {
|
|
45
|
-
"chai": "4.
|
|
46
|
-
"eslint": "
|
|
47
|
-
"eslint-config-
|
|
48
|
-
"eslint-
|
|
49
|
-
"eslint-plugin-
|
|
50
|
-
"eslint-plugin-
|
|
51
|
-
"eslint-plugin-
|
|
52
|
-
"generate-changelog": "1.
|
|
53
|
-
"husky": "
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"prettier
|
|
49
|
+
"chai": "^4.5.0",
|
|
50
|
+
"eslint": "^8.57.1",
|
|
51
|
+
"eslint-config-prettier": "^10.0.1",
|
|
52
|
+
"eslint-config-standard": "^17.1.0",
|
|
53
|
+
"eslint-plugin-import": "^2.32.0",
|
|
54
|
+
"eslint-plugin-n": "^16.6.2",
|
|
55
|
+
"eslint-plugin-promise": "^6.6.0",
|
|
56
|
+
"generate-changelog": "^1.8.0",
|
|
57
|
+
"husky": "^9.1.7",
|
|
58
|
+
"lint-staged": "^15.4.3",
|
|
59
|
+
"mocha": "^11.1.0",
|
|
60
|
+
"nyc": "^17.1.0",
|
|
61
|
+
"prettier": "^3.5.0"
|
|
58
62
|
},
|
|
59
63
|
"eslintConfig": {
|
|
60
|
-
"extends":
|
|
64
|
+
"extends": [
|
|
65
|
+
"standard",
|
|
66
|
+
"prettier"
|
|
67
|
+
],
|
|
61
68
|
"rules": {
|
|
62
69
|
"no-console": [
|
|
63
70
|
"error"
|
|
64
|
-
]
|
|
65
|
-
"standard/computed-property-even-spacing": "off"
|
|
71
|
+
]
|
|
66
72
|
}
|
|
67
73
|
},
|
|
68
74
|
"eslintIgnore": [
|
|
@@ -70,18 +76,14 @@
|
|
|
70
76
|
"example.js"
|
|
71
77
|
],
|
|
72
78
|
"lint-staged": {
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
"prettier-standard",
|
|
82
|
-
"git add"
|
|
83
|
-
]
|
|
84
|
-
}
|
|
79
|
+
"src/**/*.js": [
|
|
80
|
+
"eslint --fix",
|
|
81
|
+
"prettier --write"
|
|
82
|
+
],
|
|
83
|
+
"test/**/*.js": [
|
|
84
|
+
"eslint --fix",
|
|
85
|
+
"prettier --write"
|
|
86
|
+
]
|
|
85
87
|
},
|
|
86
88
|
"tonicExampleFilename": "example.js",
|
|
87
89
|
"renovate": {
|
package/src/gl300.js
CHANGED
|
@@ -23,7 +23,7 @@ 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
|
hourmeter: null
|
|
@@ -104,12 +104,12 @@ const parse = raw => {
|
|
|
104
104
|
raw: parsedData[18] + parsedData[19],
|
|
105
105
|
sos: false,
|
|
106
106
|
input: {
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[20]), 2)[1] === '1',
|
|
108
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[20]), 2)[0] === '1'
|
|
109
109
|
},
|
|
110
110
|
output: {
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[21]), 2)[1] === '1',
|
|
112
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[21]), 2)[0] === '1'
|
|
113
113
|
},
|
|
114
114
|
charge: parsedData[8] === '1'
|
|
115
115
|
},
|
|
@@ -416,5 +416,5 @@ const parse = raw => {
|
|
|
416
416
|
}
|
|
417
417
|
|
|
418
418
|
module.exports = {
|
|
419
|
-
parse
|
|
419
|
+
parse
|
|
420
420
|
}
|
package/src/gl50.js
CHANGED
|
@@ -23,7 +23,7 @@ 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
|
}
|
|
@@ -244,5 +244,5 @@ const parse = raw => {
|
|
|
244
244
|
}
|
|
245
245
|
|
|
246
246
|
module.exports = {
|
|
247
|
-
parse
|
|
247
|
+
parse
|
|
248
248
|
}
|
package/src/gl533cg.js
CHANGED
|
@@ -53,12 +53,12 @@ const parse = raw => {
|
|
|
53
53
|
const reservedLen = buf.readUInt8(offset)
|
|
54
54
|
offset += 1 + reservedLen
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
const data = {
|
|
57
57
|
raw: typeof raw === 'string' ? raw : raw.toString('hex').toUpperCase(),
|
|
58
58
|
manufacturer: 'queclink',
|
|
59
59
|
device: 'Queclink-GL533CG',
|
|
60
60
|
type: 'data',
|
|
61
|
-
imei
|
|
61
|
+
imei,
|
|
62
62
|
protocolVersion: utils.getProtocolVersion(
|
|
63
63
|
`${deviceTypeStr}${protocolVersionStr}`
|
|
64
64
|
),
|
|
@@ -188,7 +188,9 @@ const parse = raw => {
|
|
|
188
188
|
data.connectionMode =
|
|
189
189
|
mode === 0x00
|
|
190
190
|
? 'Power saving'
|
|
191
|
-
: mode === 0x01
|
|
191
|
+
: mode === 0x01
|
|
192
|
+
? 'Continuous'
|
|
193
|
+
: 'Unknown'
|
|
192
194
|
} else if (dataId === 0x0a) {
|
|
193
195
|
// Internal Battery Percentage
|
|
194
196
|
data.voltage = data.voltage || {}
|
|
@@ -202,7 +204,9 @@ const parse = raw => {
|
|
|
202
204
|
? 'Normal'
|
|
203
205
|
: rfState === 1
|
|
204
206
|
? 'Module abnormal'
|
|
205
|
-
: rfState === 2
|
|
207
|
+
: rfState === 2
|
|
208
|
+
? 'Antenna abnormal'
|
|
209
|
+
: 'Unknown'
|
|
206
210
|
} else if (dataId === 0x13) {
|
|
207
211
|
// Triggered Time
|
|
208
212
|
const triggeredTime = dataContent.readUInt32BE(0)
|
|
@@ -217,7 +221,9 @@ const parse = raw => {
|
|
|
217
221
|
data.status.motion =
|
|
218
222
|
motion === 0x00
|
|
219
223
|
? 'Motionless'
|
|
220
|
-
: motion === 0x01
|
|
224
|
+
: motion === 0x01
|
|
225
|
+
? 'Moving'
|
|
226
|
+
: 'Unknown'
|
|
221
227
|
data.alarm = utils.getAlarm('GSENSOR', parseInt(motion).toString(2))
|
|
222
228
|
// } else if (dataId === 0x22) { // Real-time Customization
|
|
223
229
|
// data.alarm = utils.getAlarm('GTINFO', null)
|
|
@@ -259,7 +265,11 @@ const parse = raw => {
|
|
|
259
265
|
data.fixState =
|
|
260
266
|
fixState === 0
|
|
261
267
|
? 'Off'
|
|
262
|
-
: fixState === 1
|
|
268
|
+
: fixState === 1
|
|
269
|
+
? 'No fix'
|
|
270
|
+
: fixState === 2
|
|
271
|
+
? 'Fix'
|
|
272
|
+
: 'Unknown'
|
|
263
273
|
data.fixMode = fixMode === 0 ? '2D' : fixMode === 1 ? '3D' : 'Unknown'
|
|
264
274
|
} else if (dataId === 0x52) {
|
|
265
275
|
// 82 Full Location
|
|
@@ -311,7 +321,11 @@ const parse = raw => {
|
|
|
311
321
|
data.fixState =
|
|
312
322
|
fixState === 0
|
|
313
323
|
? 'Off'
|
|
314
|
-
: fixState === 1
|
|
324
|
+
: fixState === 1
|
|
325
|
+
? 'No fix'
|
|
326
|
+
: fixState === 2
|
|
327
|
+
? 'Fix'
|
|
328
|
+
: 'Unknown'
|
|
315
329
|
data.fixMode = fixMode === 0 ? '2D' : fixMode === 1 ? '3D' : 'Unknown'
|
|
316
330
|
data.satellites = satellites
|
|
317
331
|
} else if (dataId === 0x55) {
|
|
@@ -442,7 +456,9 @@ const parse = raw => {
|
|
|
442
456
|
const fieldName =
|
|
443
457
|
dataId === 0x65
|
|
444
458
|
? 'upgradeInfo'
|
|
445
|
-
: dataId === 0x66
|
|
459
|
+
: dataId === 0x66
|
|
460
|
+
? 'updateConfig'
|
|
461
|
+
: 'getConfig'
|
|
446
462
|
data[fieldName] = {
|
|
447
463
|
status: status.code,
|
|
448
464
|
reason: status.subcode,
|
|
@@ -520,5 +536,5 @@ const parse = raw => {
|
|
|
520
536
|
}
|
|
521
537
|
|
|
522
538
|
module.exports = {
|
|
523
|
-
parse
|
|
539
|
+
parse
|
|
524
540
|
}
|
package/src/gmt100.js
CHANGED
|
@@ -23,7 +23,7 @@ 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
|
hourmeter: null
|
|
@@ -48,12 +48,12 @@ const parse = raw => {
|
|
|
48
48
|
raw: parsedData[24] + parsedData[25],
|
|
49
49
|
sos: false,
|
|
50
50
|
input: {
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[24]), 2)[1] === '1',
|
|
52
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[24]), 2)[0] === '1'
|
|
53
53
|
},
|
|
54
54
|
output: {
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[25]), 2)[1] === '1',
|
|
56
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[25]), 2)[0] === '1'
|
|
57
57
|
},
|
|
58
58
|
charge: parseFloat(parsedData[4]) > 5
|
|
59
59
|
},
|
|
@@ -107,12 +107,12 @@ const parse = raw => {
|
|
|
107
107
|
raw: parsedData[18] + parsedData[19],
|
|
108
108
|
sos: false,
|
|
109
109
|
input: {
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[20]), 2)[1] === '1',
|
|
111
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[20]), 2)[0] === '1'
|
|
112
112
|
},
|
|
113
113
|
output: {
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[21]), 2)[1] === '1',
|
|
115
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[21]), 2)[0] === '1'
|
|
116
116
|
},
|
|
117
117
|
charge: parsedData[8] === '1'
|
|
118
118
|
},
|
|
@@ -548,5 +548,5 @@ const parse = raw => {
|
|
|
548
548
|
}
|
|
549
549
|
|
|
550
550
|
module.exports = {
|
|
551
|
-
parse
|
|
551
|
+
parse
|
|
552
552
|
}
|
package/src/gv200.js
CHANGED
|
@@ -23,7 +23,7 @@ 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
|
}
|
|
@@ -48,22 +48,16 @@ const parse = raw => {
|
|
|
48
48
|
raw: parsedData[24] + parsedData[25],
|
|
49
49
|
sos: false,
|
|
50
50
|
input: {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
'
|
|
54
|
-
|
|
55
|
-
'2':
|
|
56
|
-
utils.nHexDigit(utils.hex2bin(parsedData[24][1]), 4)[2] === '1',
|
|
57
|
-
'1': utils.nHexDigit(utils.hex2bin(parsedData[24][1]), 4)[3] === '1'
|
|
51
|
+
4: utils.nHexDigit(utils.hex2bin(parsedData[24][1]), 4)[0] === '1',
|
|
52
|
+
3: utils.nHexDigit(utils.hex2bin(parsedData[24][1]), 4)[1] === '1',
|
|
53
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[24][1]), 4)[2] === '1',
|
|
54
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[24][1]), 4)[3] === '1'
|
|
58
55
|
},
|
|
59
56
|
output: {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
'
|
|
63
|
-
|
|
64
|
-
'2':
|
|
65
|
-
utils.nHexDigit(utils.hex2bin(parsedData[25][1]), 4)[2] === '1',
|
|
66
|
-
'1': utils.nHexDigit(utils.hex2bin(parsedData[25][1]), 4)[3] === '1'
|
|
57
|
+
4: utils.nHexDigit(utils.hex2bin(parsedData[25][1]), 4)[0] === '1',
|
|
58
|
+
3: utils.nHexDigit(utils.hex2bin(parsedData[25][1]), 4)[1] === '1',
|
|
59
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[25][1]), 4)[2] === '1',
|
|
60
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[25][1]), 4)[3] === '1'
|
|
67
61
|
},
|
|
68
62
|
charge: parseFloat(parsedData[4]) > 5
|
|
69
63
|
},
|
|
@@ -117,16 +111,16 @@ const parse = raw => {
|
|
|
117
111
|
raw: parsedData[25] + parsedData[26],
|
|
118
112
|
sos: false,
|
|
119
113
|
input: {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
114
|
+
4: utils.nHexDigit(utils.hex2bin(parsedData[25][1]), 4)[0] === '1',
|
|
115
|
+
3: utils.nHexDigit(utils.hex2bin(parsedData[25][1]), 4)[1] === '1',
|
|
116
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[25][1]), 4)[2] === '1',
|
|
117
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[25][1]), 4)[3] === '1'
|
|
124
118
|
},
|
|
125
119
|
output: {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
120
|
+
4: utils.nHexDigit(utils.hex2bin(parsedData[26][1]), 4)[0] === '1',
|
|
121
|
+
3: utils.nHexDigit(utils.hex2bin(parsedData[26][1]), 4)[1] === '1',
|
|
122
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[26][1]), 4)[2] === '1',
|
|
123
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[26][1]), 4)[3] === '1'
|
|
130
124
|
},
|
|
131
125
|
charge: parseFloat(parsedData[5]) > 5
|
|
132
126
|
},
|
|
@@ -171,16 +165,18 @@ const parse = raw => {
|
|
|
171
165
|
const ac100DevicesConnected =
|
|
172
166
|
AC100 && digitFuelSensor
|
|
173
167
|
? parseInt(parsedData[29], 10)
|
|
174
|
-
: AC100 && !digitFuelSensor
|
|
168
|
+
: AC100 && !digitFuelSensor
|
|
169
|
+
? parseInt(parsedData[28], 10)
|
|
170
|
+
: 0
|
|
175
171
|
|
|
176
172
|
let externalData = {
|
|
177
173
|
eriMask: {
|
|
178
174
|
raw: parsedData[4],
|
|
179
|
-
digitFuelSensor
|
|
180
|
-
AC100
|
|
181
|
-
reserved
|
|
182
|
-
fuelLevelPercentage
|
|
183
|
-
fuelVolume
|
|
175
|
+
digitFuelSensor,
|
|
176
|
+
AC100,
|
|
177
|
+
reserved,
|
|
178
|
+
fuelLevelPercentage,
|
|
179
|
+
fuelVolume
|
|
184
180
|
},
|
|
185
181
|
uartDeviceType: utils.uartDeviceTypes[parsedData[27]]
|
|
186
182
|
}
|
|
@@ -206,9 +202,9 @@ const parse = raw => {
|
|
|
206
202
|
AC100Devices: null
|
|
207
203
|
})
|
|
208
204
|
} else if (!digitFuelSensor && AC100) {
|
|
209
|
-
|
|
205
|
+
const ac100Devices = []
|
|
210
206
|
let count = 29
|
|
211
|
-
for (
|
|
207
|
+
for (let i = 0; i < ac100DevicesConnected; i++) {
|
|
212
208
|
ac100Devices.push({
|
|
213
209
|
deviceNumber: parsedData[count],
|
|
214
210
|
deviceType: parsedData[count + 1],
|
|
@@ -223,12 +219,14 @@ const parse = raw => {
|
|
|
223
219
|
AC100Devices: ac100Devices
|
|
224
220
|
})
|
|
225
221
|
} else if (digitFuelSensor && AC100) {
|
|
226
|
-
|
|
222
|
+
const ac100Devices = []
|
|
227
223
|
let count =
|
|
228
224
|
fuelVolume && fuelLevelPercentage
|
|
229
225
|
? 33
|
|
230
|
-
: fuelVolume && !fuelLevelPercentage
|
|
231
|
-
|
|
226
|
+
: fuelVolume && !fuelLevelPercentage
|
|
227
|
+
? 32
|
|
228
|
+
: 31
|
|
229
|
+
for (let j = 0; j < ac100DevicesConnected; j++) {
|
|
232
230
|
ac100Devices.push({
|
|
233
231
|
deviceNumber: parsedData[count],
|
|
234
232
|
deviceType: parsedData[count + 1],
|
|
@@ -259,9 +257,9 @@ const parse = raw => {
|
|
|
259
257
|
} else if (parsedData[27] === '2') {
|
|
260
258
|
// AC100 1 Wire Bus
|
|
261
259
|
if (!digitFuelSensor && AC100) {
|
|
262
|
-
|
|
260
|
+
const ac100Devices = []
|
|
263
261
|
let count = 29
|
|
264
|
-
for (
|
|
262
|
+
for (let k = 0; k < ac100DevicesConnected; k++) {
|
|
265
263
|
ac100Devices.push({
|
|
266
264
|
deviceNumber: parsedData[count],
|
|
267
265
|
deviceType: parsedData[count + 1],
|
|
@@ -286,9 +284,9 @@ const parse = raw => {
|
|
|
286
284
|
AC100Devices: null
|
|
287
285
|
})
|
|
288
286
|
} else if (digitFuelSensor && AC100) {
|
|
289
|
-
|
|
287
|
+
const ac100Devices = []
|
|
290
288
|
let count = 29
|
|
291
|
-
for (
|
|
289
|
+
for (let l = 0; l < ac100DevicesConnected; l++) {
|
|
292
290
|
ac100Devices.push({
|
|
293
291
|
deviceNumber: parsedData[count],
|
|
294
292
|
deviceType: parsedData[count + 1],
|
|
@@ -310,7 +308,7 @@ const parse = raw => {
|
|
|
310
308
|
}
|
|
311
309
|
}
|
|
312
310
|
data = Object.assign(data, {
|
|
313
|
-
externalData
|
|
311
|
+
externalData
|
|
314
312
|
})
|
|
315
313
|
} else if (command[1] === 'GTHBD') {
|
|
316
314
|
// Heartbeat. It must response an ACK command
|
|
@@ -326,16 +324,16 @@ const parse = raw => {
|
|
|
326
324
|
raw: parsedData[18] + parsedData[19],
|
|
327
325
|
sos: false,
|
|
328
326
|
input: {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
327
|
+
4: utils.nHexDigit(utils.hex2bin(parsedData[18][1]), 4)[0] === '1',
|
|
328
|
+
3: utils.nHexDigit(utils.hex2bin(parsedData[18][1]), 4)[1] === '1',
|
|
329
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[18][1]), 4)[2] === '1',
|
|
330
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[18][1]), 4)[3] === '1'
|
|
333
331
|
},
|
|
334
332
|
output: {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
333
|
+
4: utils.nHexDigit(utils.hex2bin(parsedData[19][1]), 4)[0] === '1',
|
|
334
|
+
3: utils.nHexDigit(utils.hex2bin(parsedData[19][1]), 4)[1] === '1',
|
|
335
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[19][1]), 4)[2] === '1',
|
|
336
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[19][1]), 4)[3] === '1'
|
|
339
337
|
},
|
|
340
338
|
charge: parsedData[8] === '1'
|
|
341
339
|
}
|
|
@@ -359,7 +357,7 @@ const parse = raw => {
|
|
|
359
357
|
charging: parsedData[12] === '1'
|
|
360
358
|
},
|
|
361
359
|
externalGPSAntenna: parsedData[15] === '0',
|
|
362
|
-
status
|
|
360
|
+
status,
|
|
363
361
|
voltage: {
|
|
364
362
|
battery:
|
|
365
363
|
parsedData[11] !== ''
|
|
@@ -427,7 +425,7 @@ const parse = raw => {
|
|
|
427
425
|
// Low voltage for analog input
|
|
428
426
|
const alarm = utils.getAlarm(command[1], parsedData[5])
|
|
429
427
|
data = Object.assign(data, {
|
|
430
|
-
alarm
|
|
428
|
+
alarm,
|
|
431
429
|
loc: {
|
|
432
430
|
type: 'Point',
|
|
433
431
|
coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
|
|
@@ -879,16 +877,16 @@ const parse = raw => {
|
|
|
879
877
|
raw: parsedData[24] + parsedData[25],
|
|
880
878
|
sos: utils.hex2bin(parsedData[24][1])[1] === '1',
|
|
881
879
|
input: {
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
880
|
+
4: utils.hex2bin(parsedData[25][1])[3] === '1',
|
|
881
|
+
3: utils.hex2bin(parsedData[25][1])[2] === '1',
|
|
882
|
+
2: utils.hex2bin(parsedData[25][1])[1] === '1',
|
|
883
|
+
1: utils.hex2bin(parsedData[25][1])[0] === '1'
|
|
886
884
|
},
|
|
887
885
|
output: {
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
886
|
+
4: utils.hex2bin(parsedData[26][1])[3] === '1',
|
|
887
|
+
3: utils.hex2bin(parsedData[26][1])[2] === '1',
|
|
888
|
+
2: utils.hex2bin(parsedData[26][1])[1] === '1',
|
|
889
|
+
1: utils.hex2bin(parsedData[26][1])[0] === '1'
|
|
892
890
|
},
|
|
893
891
|
charge: parseFloat(parsedData[4]) > 5
|
|
894
892
|
},
|
|
@@ -1220,5 +1218,5 @@ const parse = raw => {
|
|
|
1220
1218
|
}
|
|
1221
1219
|
|
|
1222
1220
|
module.exports = {
|
|
1223
|
-
parse
|
|
1221
|
+
parse
|
|
1224
1222
|
}
|