Skip to content

Commit

Permalink
Add parse command and ok
Browse files Browse the repository at this point in the history
  • Loading branch information
lgaticaq committed Mar 29, 2016
1 parent 30d4461 commit 914b22c
Show file tree
Hide file tree
Showing 2 changed files with 132 additions and 52 deletions.
71 changes: 68 additions & 3 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
'use strict';

import crc from 'crc';
import pad from 'pad';
import moment from 'moment';

const patterns = {
mvt380: /^\$\$([\x41-\x7A])(\d{1,3}),(\d{15}),([0-9A-F]{3}),(\d{1,3}),([-]?\d+\.\d+),([-]?\d+\.\d+),(\d{12}),([AV]),(\d{1,3}),(\d{1,2}),(\d+(\.\d+)?),(\d+(\.\d+)?),(\d+(\.\d+)?),(\d+(\.\d+)?),(\d+(\.\d+)?),(\d+),(\d{3})\|(\d{1,3})\|([0-9A-F]{4})\|([0-9A-F]{4}),([0-9A-F]{4}),([0-9A-F]{1,4})?\|([0-9A-F]{1,4})?\|([0-9A-F]{1,4})?\|([0-9A-F]{1,4})\|([0-9A-F]{1,4}),([0-9A-F]{8})?,?([0-9A-F]+)?,?(\d{1,2})?,?([0-9A-F]{4})?,?([0-9A-F]{6})?\|?([0-9A-F]{6})?\|?([0-9A-F]{6})?\|?\*([0-9A-F]{2})\r\n$/
mvt380: /^\$\$([\x41-\x7A])(\d{1,3}),(\d{15}),([0-9A-F]{3}),(\d{1,3}),([-]?\d+\.\d+),([-]?\d+\.\d+),(\d{12}),([AV]),(\d{1,3}),(\d{1,2}),(\d+(\.\d+)?),(\d+(\.\d+)?),(\d+(\.\d+)?),(\d+(\.\d+)?),(\d+(\.\d+)?),(\d+),(\d{3})\|(\d{1,3})\|([0-9A-F]{4})\|([0-9A-F]{4}),([0-9A-F]{4}),([0-9A-F]{1,4})?\|([0-9A-F]{1,4})?\|([0-9A-F]{1,4})?\|([0-9A-F]{1,4})\|([0-9A-F]{1,4}),([0-9A-F]{8})?,?([0-9A-F]+)?,?(\d{1,2})?,?([0-9A-F]{4})?,?([0-9A-F]{6})?\|?([0-9A-F]{6})?\|?([0-9A-F]{6})?\|?\*([0-9A-F]{2})\r\n$/,
ok: /^\$\$([\x41-\x7A])(\d{1,3}),(\d{15}),([0-9A-F]{3}),OK\*([0-9A-F]{2})\r\n$/
};

const getEvent = (event) => {
Expand Down Expand Up @@ -131,10 +133,28 @@ const getMvt380 = (raw) => {
return data;
};

const parseCode = (raw) => {
const match = patterns.ok.exec(raw);
const code = match[4];
const codes = {
C01: 'SETIOSWITCH',
F09: 'CLEARBUF',
A12: 'SETGPRSINTERVAL',
B07: 'SETOVERSPEEDALARM',
F01: 'RBOOT',
F02: 'RBOOT'
};
const data = {device: 'MEITRACK-COMMAND-OK', type: 'ok', code: code};
if (Object.keys(codes).indexOf(code) > -1) data.command = codes[code];
return data;
};

const parse = (raw) => {
let result = {type: 'UNKNOWN', raw: raw.toString()};
if (patterns.mvt380.test(raw.toString())) {
if (patterns.mvt380.test(raw)) {
result = getMvt380(raw);
} else if (patterns.ok.test(raw)) {
result = parseCode(raw);
}
return result;
};
Expand All @@ -143,9 +163,54 @@ const isMeitrack = (raw) => {
return patterns.mvt380.test(raw.toString());
};

// Random integer from 65 to 122 (41 to 7a in hex)
const getRandomDataIdentifier = () => {
const int = Math.floor(Math.random() * (122 - 65 + 1) + 65);
return String.fromCharCode(int);
};

const getCommand = (imei, command) => {
const raw1 = `,${imei},${command}*`;
const raw2 = `@@${getRandomDataIdentifier()}${raw1.length + 4}${raw1}`;
return `${raw2}${pad(2, crc.crc1(raw2).toString(16).toUpperCase(), '0')}\r\n`;
};

const parseCommand = (data) => {
let raw, state, port, speed, interval;
if (/^[1-5]{1}_(on|off|status)$/.test(data.instruction)) {
[port, state] = data.instruction.split('_');
let initial = [0, 0, 0, 0, 0];
const states = {off: 0, on: 1, status: 2};
initial[port - 1] = states[state];
speed = data.speed || 0;
raw = `C01,${speed},${initial.join('')}`;
} else if (data.instruction === 'clear_mem') {
raw = 'F09,3';
} else if (data.instruction === 'set_interval_gprs') {
interval = data.interval || 6 * 10;
if (interval < 12) interval = 12;
let mod = interval % 6;
if (mod > 0) interval -= mod;
raw = `A12,${interval}`;
} else if (/^set_speed_(on|off)(E)?$/.test(data.instruction)) {
speed = data.speed || 0;
state = data.instruction.split('_')[2];
if (state === 'off') speed = 0;
raw = `B07,${speed}`;
} else if(data.instruction === 'Custom'){
raw = data.command;
} else if (/^reboot_gsm$/.test(data.instruction)) {
raw = 'F01';
} else if (/^reboot_gps$/.test(data.instruction)) {
raw = 'F02';
}
return getCommand(data.imei, raw);
};

module.exports = {
parse: parse,
patterns: patterns,
getMvt380: getMvt380,
isMeitrack: isMeitrack
isMeitrack: isMeitrack,
parseCommand: parseCommand
};
113 changes: 64 additions & 49 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,55 +3,70 @@
import meitrack from '../lib';
import {expect} from 'chai';

describe('meitrack-parzer', () => {
describe('parse', () => {
it('should return the raw data parsed', () => {
const raw = new Buffer('$$A138,862170013556541,AAA,35,7.092076,79.960473,140412132808,A,10,9,57,275,1,14,5783799,7403612,413|1|F6E0|3933,0000,000B|0009||02D8|0122,*EE\r\n');
const data = meitrack.parse(raw);
expect(data.raw).to.eql(raw.toString());
expect(data.device).to.eql('MVT380');
expect(data.type).to.eql('data');
expect(data.imei).to.eql(862170013556541);
expect(data.command).to.eql('AAA');
expect(data.event).to.eql('timeIntervalTracking');
expect(data.loc.type).to.eql('Point');
expect(data.loc.coordinates).to.eql([79.960473, 7.092076]);
expect(data.datetime).to.eql(new Date('2014-04-12T13:28:08.000Z'));
expect(data.gpsSignal).to.eql('A');
expect(data.satellites).to.eql(10);
expect(data.gsmSignal).to.eql(9);
expect(data.speed).to.eql(57);
expect(data.direction).to.eql(275);
expect(data.hdop).to.eql(1);
expect(data.altitude).to.eql(14);
expect(data.odometer).to.eql(5783799);
expect(data.runtime).to.eql(7403612);
expect(data.mcc).to.eql('413');
expect(data.mnc).to.eql('1');
expect(data.lac).to.eql(63200);
expect(data.ci).to.eql(14643);
expect(data.status.input['1']).to.be.false;
expect(data.status.input['2']).to.be.false;
expect(data.status.input['3']).to.be.false;
expect(data.status.input['4']).to.be.false;
expect(data.status.input['5']).to.be.false;
expect(data.status.input['6']).to.be.false;
expect(data.status.input['7']).to.be.false;
expect(data.status.input['8']).to.be.false;
expect(data.status.output['1']).to.be.false;
expect(data.status.output['2']).to.be.false;
expect(data.status.output['3']).to.be.false;
expect(data.status.output['4']).to.be.false;
expect(data.status.output['5']).to.be.false;
expect(data.status.output['6']).to.be.false;
expect(data.status.output['7']).to.be.false;
expect(data.status.output['8']).to.be.false;
});
describe('meitrack-parser', () => {
it('should return the raw data parsed', () => {
const raw = new Buffer('$$A138,862170013556541,AAA,35,7.092076,79.960473,140412132808,A,10,9,57,275,1,14,5783799,7403612,413|1|F6E0|3933,0000,000B|0009||02D8|0122,*EE\r\n');
const data = meitrack.parse(raw);
expect(data.raw).to.eql(raw.toString());
expect(data.device).to.eql('MVT380');
expect(data.type).to.eql('data');
expect(data.imei).to.eql(862170013556541);
expect(data.command).to.eql('AAA');
expect(data.event).to.eql('timeIntervalTracking');
expect(data.loc.type).to.eql('Point');
expect(data.loc.coordinates).to.eql([79.960473, 7.092076]);
expect(data.datetime).to.eql(new Date('2014-04-12T13:28:08.000Z'));
expect(data.gpsSignal).to.eql('A');
expect(data.satellites).to.eql(10);
expect(data.gsmSignal).to.eql(9);
expect(data.speed).to.eql(57);
expect(data.direction).to.eql(275);
expect(data.hdop).to.eql(1);
expect(data.altitude).to.eql(14);
expect(data.odometer).to.eql(5783799);
expect(data.runtime).to.eql(7403612);
expect(data.mcc).to.eql('413');
expect(data.mnc).to.eql('1');
expect(data.lac).to.eql(63200);
expect(data.ci).to.eql(14643);
expect(data.status.input['1']).to.be.false;
expect(data.status.input['2']).to.be.false;
expect(data.status.input['3']).to.be.false;
expect(data.status.input['4']).to.be.false;
expect(data.status.input['5']).to.be.false;
expect(data.status.input['6']).to.be.false;
expect(data.status.input['7']).to.be.false;
expect(data.status.input['8']).to.be.false;
expect(data.status.output['1']).to.be.false;
expect(data.status.output['2']).to.be.false;
expect(data.status.output['3']).to.be.false;
expect(data.status.output['4']).to.be.false;
expect(data.status.output['5']).to.be.false;
expect(data.status.output['6']).to.be.false;
expect(data.status.output['7']).to.be.false;
expect(data.status.output['8']).to.be.false;
});

it('should return the true', () => {
const raw = new Buffer('$$A138,862170013556541,AAA,35,7.092076,79.960473,140412132808,A,10,9,57,275,1,14,5783799,7403612,413|1|F6E0|3933,0000,000B|0009||02D8|0122,*EE\r\n');
const data = meitrack.isMeitrack(raw);
expect(data).to.be.true;
});

it('should return ok data', () => {
const raw = new Buffer('$$j28,353358017784062,F01,OK*19\r\n');
const data = meitrack.parse(raw);
expect(data.device).to.eql('MEITRACK-COMMAND-OK');
expect(data.type).to.eql('ok');
expect(data.code).to.eql('F01');
});

it('should return the true', () => {
const raw = new Buffer('$$A138,862170013556541,AAA,35,7.092076,79.960473,140412132808,A,10,9,57,275,1,14,5783799,7403612,413|1|F6E0|3933,0000,000B|0009||02D8|0122,*EE\r\n');
const data = meitrack.isMeitrack(raw);
expect(data).to.be.true;
});
it('should return command data', () => {
const command = {
instruction: '1_on',
imei: 353358017784062
};
const data = meitrack.parseCommand(command);
expect(data).to.match(/^@@([\x41-\x7A])(\d{1,3}),353358017784062,C01,0,10000\*([0-9A-F]{2})\r\n$/);
});
});

0 comments on commit 914b22c

Please sign in to comment.