gpschamp-tracker
Version:
Let you work with some GPS trackers that connects through tcp.
192 lines (170 loc) • 6.92 kB
JavaScript
/* Original code: https://github.com/cnberg/gps-tracking-nodejs/blob/master/lib/adapters/gt06.js */
f = require('../functions');
exports.protocol = 'LKGPS';
exports.model_name = 'LKGPS';
exports.compatible_hardware = ['LKGPS/supplier'];
var adapter = function (device) {
if (!(this instanceof adapter)) {
return new adapter(device);
}
this.format = {'start': '(', 'end': ')', 'separator': ''};
this.device = device;
this.__count = 1;
/*******************************************
PARSE THE INCOMING STRING FROM THE DECIVE
You must return an object with a least: device_id, cmd and type.
return device_id: The device_id
return cmd: command from the device.
return type: login_request, ping, etc.
*******************************************/
this.parse_data = function (data) {
data = this.bufferToHexString(data);
console.log(data);
console.log(data.substr(2, 10));
var parts = {
'start': data.substr(0, 2)
};
if (parts['start'] == '24') {
parts['data'] = data;
parts['device_id'] = data.substr(2, 10);
parts.cmd = 'login_request';
parts.action = 'login_request';
} else {
parts['device_id'] = '';
parts.cmd = 'noop';
parts.action = 'noop';
}
return parts;
};
this.authorize = function () {
//this.device.send("\u0078\u0078\u0005\u0001\u0000\u0001\u00d9\u00dc\u000d\u000a");
//return ;
var length = '05';
var protocal_id = '01';
var serial = f.str_pad(this.__count, 4, 0);
var str = length + protocal_id + serial;
this.__count++;
//this.get_ping_data();
//var crc = require('/usr/lib/node_modules/crc/lib/index.js');
//var crcResult = f.str_pad(crc.crc16(str).toString(16), 4, '0');
//var buff = new Buffer('7878' + str + crcResult + '0d0a', 'hex');
var buff = new Buffer('787805010001d9dc0d0a', 'hex');
//发送原始数据
this.device.send(buff);
};
this.zeroPad = function (nNum, nPad) {
return ('' + (Math.pow(10, nPad) + nNum)).slice(1);
};
this.bufferToHexString = function (buffer) {
var str = '';
for (var i = 0; i < buffer.length; i++) {
if (buffer[i] < 16) {
str += '0';
}
str += buffer[i].toString(16);
}
return str;
};
this.synchronous_clock = function (msg_parts) {
};
this.receive_heartbeat = function (msg_parts) {
var buff = new Buffer('787805130001d9dc0d0a', 'hex');
this.device.send(buff);
};
this.run_other = function (cmd, msg_parts) {
};
this.request_login_to_device = function () {
//@TODO: Implement this.
};
this.receive_alarm = function (msg_parts) {
console.log(msg_parts);
var str = msg_parts.data;
var data = {
'date': str.substr(0, 12),
'set_count': str.substr(12, 2),
'latitude_raw': str.substr(14, 8),
'longitude_raw': str.substr(22, 8),
'latitude': this.dex_to_degrees(str.substr(14, 8)),
'longitude': this.dex_to_degrees(str.substr(22, 8)),
'speed': parseInt(str.substr(30, 2), 16),
'orientation': str.substr(32, 4),
'lbs': str.substr(36, 18),
'device_info': f.str_pad(parseInt(str.substr(54, 2)).toString(2), 8, 0),
'power': str.substr(56, 2),
'gsm': str.substr(58, 2),
'alert': str.substr(60, 4),
};
data['power_status'] = data['device_info'][0];
data['gps_status'] = data['device_info'][1];
data['charge_status'] = data['device_info'][5];
data['acc_status'] = data['device_info'][6];
data['defence_status'] = data['device_info'][7];
console.log('alert');
console.log(data);
};
this.dex_to_degrees = function (dex) {
return parseInt(dex, 16) / 1800000;
};
this.get_ping_data = function (msg_parts) {
var str = msg_parts.data;
var data = {
'imei': str.substr(2,10),
'date': this.hex_to_date(str.substr(12, 12)),
'latitude_raw': str.substr(24, 8),
'btry_power': str.substr(32, 2),
'longitude_raw': str.substr(34, 9),
'neav_raw': str.substr(43, 1),
'speed': str.substr(44, 3),
'direction': str.substr(47, 3),
'vehicle_status_raw': str.substr(50, 8),
"Usr_alarm" : str.substr(58, 4),
"gsm" : str.substr(62,2),
"gps" : str.substr(64,2),
"gps_millage" : str.substr(66,8),
"country_code" : str.substr(74,4),
"operaters_number" : str.substr(78,2),
"station_number" : str.substr(80,4),
"cell_id" : str.substr(84,4),
"operater_number" : str.substr(88,2),
};
/*
"device_info" : f.str_pad(parseInt(str.substr(54,2)).toString(2), 8, 0),
"power" : str.substr(56,2),
"gsm" : str.substr(58,2),
"alert" : str.substr(60,4),
data['power_status'] = data['device_info'][0];
data['gps_status'] = data['device_info'][1];
data['charge_status'] = data['device_info'][5];
data['acc_status']= data['device_info'][6];
data['defence_status'] = data['device_info'][7];
data['power_status'] = data['device_info'][0];
data['gps_status'] = data['device_info'][1];
data['charge_status'] = data['device_info'][5];
data['acc_status']= data['device_info'][6];
data['defence_status'] = data['device_info'][7]; */
console.log(data);
console.log(str);
res = {
latitude: data.latitude,
longitude: data.longitude,
speed: data.speed,
imei: data.imei
};
return res;
};
/* SET REFRESH TIME */
this.set_refresh_time = function (interval, duration) {
};
this.hex_to_date =function (str) {
datestr=str;
//console.log(parseInt(str.substr(0, 2),16));
hour = parseInt(str.substr(0, 2),16);
minute = parseInt(str.substr(2, 2),16);
second = parseInt(str.substr(4, 2),16);
day = parseInt(str.substr(6, 2),16);
month = parseInt(str.substr(8, 2),16);
year = parseInt(str.substr(10, 2),16);
return '20'+year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;
};
};
exports.adapter = adapter;