Skip to content

Commit d0ed06a

Browse files
committed
feat(parser): Add queclink-parser
1 parent bfa78c7 commit d0ed06a

File tree

5 files changed

+99
-1
lines changed

5 files changed

+99
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Parser availables:
1515
* [tz-parser](https://www.npmjs.com/package/tz-parser)
1616
* [meitrack-parser](https://www.npmjs.com/package/meitrack-parser)
1717
* [cellocator-parser](https://www.npmjs.com/package/cellocator-parser)
18+
* [queclink-parser](https://www.npmjs.com/package/queclink-parser)
1819

1920
## Installation
2021

example.js

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"tz-avl",
2424
"meitrack",
2525
"cellocator",
26+
"queclink",
2627
"avl",
2728
"gps",
2829
"tracking",
@@ -39,6 +40,7 @@
3940
"bscoords": "^0.0.1",
4041
"cellocator-parser": "^2.1.0",
4142
"meitrack-parser": "^0.3.4",
43+
"queclink-parser": "^0.1.3",
4244
"simple-reverse-geocoder": "^1.2.2",
4345
"tz-parser": "^2.4.4"
4446
},

src/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const bscoords = require('bscoords');
44
const meitrack = require('meitrack-parser');
55
const cellocator = require('cellocator-parser');
6+
const queclink = require('queclink-parser');
67
const Promise = require('bluebird');
78
const rg = require('simple-reverse-geocoder');
89
const tz = require('tz-parser');
@@ -26,6 +27,8 @@ const getImei = raw => {
2627
imei = meitrack.patterns.mvt380.exec(data)[3];
2728
} else if (cellocator.patterns.data.test(raw.toString('hex'))) {
2829
imei = cellocator.getImei(raw).toString();
30+
} else if (queclink.isQueclink(raw)) {
31+
imei = queclink.getImei(raw).toString();
2932
}
3033
return imei;
3134
};
@@ -87,6 +90,8 @@ const parse = (raw, options) => {
8790
data = meitrack.parse(raw);
8891
} else if (cellocator.isCello(raw)) {
8992
data = cellocator.parse(raw);
93+
} else if (queclink.isQueclink(raw)) {
94+
data = queclink.parse(raw);
9095
}
9196
if (Object.prototype.toString.call(data) === '[object Array]') {
9297
return Promise.all(data.map(x => enableLoc(x, options)));
@@ -101,6 +106,8 @@ const parseCommand = data => {
101106
command = tz.parseCommand(data);
102107
} else if (data.device === 'meitrack') {
103108
command = meitrack.parseCommand(data);
109+
} else if (data.device === 'queclink') {
110+
command = queclink.parseCommand(data);
104111
}
105112
return command;
106113
};
@@ -111,6 +118,8 @@ const getRebootCommand = data => {
111118
command = tz.getRebootCommand(data.password || '000000');
112119
} else if (data.device === 'meitrack') {
113120
command = meitrack.getRebootCommand(data.imei);
121+
} else if (data.device === 'queclink') {
122+
command = queclink.getRebootCommand(data.password, data.serial);
114123
}
115124
return command;
116125
};

test/test.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ describe('tracking-parser', () => {
2222
expect(imei).to.eql('357247050053442');
2323
});
2424

25+
it('should return imei from queclink data', () => {
26+
const raw = new Buffer('+RESP:GTFRI,250504,135790246811220,,,00,1,1,4.3,92,70.0,121.354335,31.222073,20090214013254,0460,0000,18d8,6141,00,2000.0,12345:12:34,,,80,210100,,,,20090214093254,11F0$');
27+
const imei = tracking.getImei(raw);
28+
expect(imei).to.eql('135790246811220');
29+
});
30+
2531
it('should return TZ-AVL05 data parsed', done => {
2632
const raw = new Buffer('$$B6869444005480041|AA$GPRMC,194329.000,A,3321.6735,S,07030.7640,W,0.00,0.00,090216,,,A*6C|02.1|01.3|01.7|000000000000|20160209194326|13981188|00000000|32D3A03F|0000|0.6376|0100|995F\r\n');
2733
tracking.parse(raw).then(data => {
@@ -160,6 +166,58 @@ describe('tracking-parser', () => {
160166
});
161167
});
162168

169+
it('should return queclink raw data parsed', done => {
170+
const raw = new Buffer('+RESP:GTFRI,350302,867844003012625,,12401,10,1,0,0.0,0,816.1,-70.514613,-33.361280,20160811170821,0730,0002,7410,C789,00,0.0,00001:33:08,2788,702,137,08,00,,,20160811180025,07B8$');
171+
tracking.parse(raw).then(data => {
172+
expect(data.raw).to.eql(raw.toString());
173+
expect(data.raw).to.eql(raw.toString());
174+
expect(data.device).to.eql('Queclink-GV200');
175+
expect(data.type).to.eql('data');
176+
expect(data.imei).to.eql('867844003012625');
177+
expect(data.protocolVersion.raw).to.eql('350302');
178+
expect(data.protocolVersion.deviceType).to.eql('GV200');
179+
expect(data.protocolVersion.version).to.eql('3.2');
180+
expect(data.temperature).to.be.null;
181+
expect(data.history).to.be.false;
182+
expect(data.sentTime).to.eql(new Date('2016-08-11T18:00:25.000Z'));
183+
expect(data.serialId).to.eql(7);
184+
expect(data.alarm.type).to.eql('Gps');
185+
expect(data.loc.type).to.eql('Point');
186+
expect(data.loc.coordinates).to.eql([-70.514613, -33.36128]);
187+
expect(data.speed).to.eql(0);
188+
expect(data.gpsStatus).to.be.a.true;
189+
expect(data.hdop).to.eql(0);
190+
expect(data.status.raw).to.eql('0800');
191+
expect(data.status.sos).to.be.false;
192+
expect(data.status.input[1]).to.be.true;
193+
expect(data.status.input[2]).to.be.false;
194+
expect(data.status.input[3]).to.be.false;
195+
expect(data.status.input[4]).to.be.false;
196+
expect(data.status.output[1]).to.be.false;
197+
expect(data.status.output[2]).to.be.false;
198+
expect(data.status.output[3]).to.be.false;
199+
expect(data.status.output[4]).to.be.false;
200+
expect(data.status.charge).to.be.true;
201+
expect(data.azimuth).to.eql(0);
202+
expect(data.altitude).to.eql(816.1);
203+
expect(data.datetime).to.eql(new Date('2016-08-11T17:08:21.000Z'));
204+
expect(data.voltage.battery).to.be.null;
205+
expect(data.voltage.inputCharge).to.eql(12.401);
206+
expect(data.voltage.ada).to.eql(2.788);
207+
expect(data.voltage.adb).to.eql(0.702);
208+
expect(data.voltage.adc).to.eql(0.137);
209+
expect(data.mcc).to.eql(730);
210+
expect(data.mnc).to.eql(2);
211+
expect(data.lac).to.eql(29712);
212+
expect(data.cid).to.eql(51081);
213+
expect(data.odometer).to.eql(0);
214+
expect(data.hourmeter).to.eql('00001:33:08');
215+
done();
216+
}).catch(err => {
217+
done(err);
218+
});
219+
});
220+
163221
it('should return TZ raw command', () => {
164222
const data = {
165223
instruction: 'reboot',
@@ -180,6 +238,23 @@ describe('tracking-parser', () => {
180238
expect(raw).to.match(/^@@([\x41-\x7A])(\d{1,3}),353358017784062,C01,0,12222\*([0-9A-F]{2})\r\n$/);
181239
});
182240

241+
it('should return queclink raw command', () => {
242+
const data = {
243+
password: '101010',
244+
serial: '1010',
245+
instruction: '2_on',
246+
previousOutput: {
247+
'1': true,
248+
'2': false,
249+
'3': false,
250+
'4': true
251+
},
252+
device: 'queclink'
253+
};
254+
const raw = tracking.parseCommand(data);
255+
expect(raw).to.eql('AT+GTOUT=101010,1,0,0,1,0,0,0,0,0,1,0,0,0,1111,1010$');
256+
});
257+
183258
it('should return TZ raw command reboot', () => {
184259
const data = {
185260
password: 897463,
@@ -198,6 +273,16 @@ describe('tracking-parser', () => {
198273
expect(raw).to.match(/^@@([\x41-\x7A])(\d{1,3}),353358017784062,F02\*([0-9A-F]{2})\r\n$/);
199274
});
200275

276+
it('should return queclink raw command reboot', () => {
277+
const data = {
278+
password: '000000',
279+
serial: 32,
280+
device: 'queclink'
281+
};
282+
const raw = tracking.getRebootCommand(data);
283+
expect(raw).to.eql('AT+GTRTO=000000,3,,,,,,32$');
284+
});
285+
201286
it('should return a cellocator ACK command', () => {
202287
const unitId = 836522;
203288
const commandNumerator = 1;

0 commit comments

Comments
 (0)