gps-tracking-ext
Version:
Let you work with some GPS trackers that connects through tcp.
142 lines (127 loc) • 4.71 kB
JavaScript
/*****************************************
FUNCTIONS
******************************************/
exports.rad = function (x) {
return x * Math.PI / 180;
};
/*
@param p1: {lat:X,lng:Y}
@param p2: {lat:X,lng:Y}
*/
exports.get_distance = function (p1, p2) {
var R = 6378137; // Earth’s mean radius in meter
var dLat = exports.rad(p2.lat - p1.lat);
var dLong = exports.rad(p2.lng - p1.lng);
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(exports.rad(p1.lat)) * Math.cos(exports.rad(p2.lat)) *
Math.sin(dLong / 2) * Math.sin(dLong / 2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var d = R * c;
return d; // returns the distance in meter
};
exports.send = function (socket, msg) {
socket.write(msg);
//console.log('Sending to ' + socket.name + ': ' + msg);
};
exports.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;
}
exports.parse_data = function (data) {
data = data.replace(/(\r\n|\n|\r)/gm, ''); //Remove 3 type of break lines
var cmd_start = data.indexOf('B'); //al the incomming messages has a cmd starting with 'B'
if (cmd_start > 13) throw 'Device ID is longer than 12 chars!';
var parts = {
'start': data.substr(0, 1),
'device_id': data.substring(1, cmd_start),
'cmd': data.substr(cmd_start, 4),
'data': data.substring(cmd_start + 4, data.length - 1),
'finish': data.substr(data.length - 1, 1)
};
return parts;
};
exports.parse_gps_data = function (str) {
var data = {
'date': str.substr(0, 6),
'availability': str.substr(6, 1),
'latitude': gps_minute_to_decimal(parseFloat(str.substr(7, 9))),
'latitude_i': str.substr(16, 1),
'longitude': gps_minute_to_decimal(parseFloat(str.substr(17, 9))),
'longitude_i': str.substr(27, 1),
'speed': str.substr(28, 5),
'time': str.substr(33, 6),
'orientation': str.substr(39, 6),
'io_state': str.substr(45, 8),
'mile_post': str.substr(53, 1),
'mile_data': parseInt(str.substr(54, 8), 16)
};
return data;
};
exports.send_to = function (socket, cmd, data) {
if (typeof (socket.device_id) == 'undefined') throw 'The socket is not paired with a device_id yet';
var str = gps_format.start;
str += socket.device_id + gps_format.separator + cmd;
if (typeof (data) != 'undefined') str += gps_format.separator + data;
str += gps_format.end;
send(socket, str);
//Example: (<DEVICE_ID>|<CMD>|<DATA>) - separator: | ,start: (, end: )
};
exports.minute_to_decimal = function (pos, pos_i) {
if (typeof (pos_i) === 'undefined') pos_i = 'N';
var dg = parseInt(pos / 100);
var minutes = pos - (dg * 100);
var res = (minutes / 60) + dg;
return (pos_i.toUpperCase() === 'S' || pos_i.toUpperCase() === 'W') ? res * -1 : res;
};
// Send a message to all clients
exports.broadcast = function (message, sender) {
clients.forEach(function (client) {
if (client === sender) return;
client.write(message);
});
process.stdout.write(message + '\n');
};
exports.data_to_hex_array = function (data) {
var arr = [];
for (var i = 0; i < data.length; i++)arr.push(data[i].toString(16));
return arr;
};
/* RETRUN AN INTEGER FROM A HEX CHAR OR integer */
exports.hex_to_int = function (hex_char) {
return parseInt(hex_char, 16);
};
exports.sum_hex_array = function (hex_array) {
var sum = 0;
for (var i in hex_array) sum += exports.hex_to_int(hex_array[i]);
return sum;
};
exports.hex_array_to_hex_str = function (hex_array) {
var str = '';
for (var i in hex_array) {
var char;
if (typeof (hex_array[i]) === 'number') char = hex_array[i].toString(16);
else char = hex_array[i].toString();
str += exports.str_pad(char, 2, '0');
}
return str;
};
exports.str_pad = function (input, length, string) {
string = string || '0';
input = input + '';
return input.length >= length ? input : new Array(length - input.length + 1).join(string) + input;
};
exports.crc_itu_get_verification = function (hex_data) {
var crc16 = require('crc-itu').crc16;
if (typeof (hex_data) === 'String') str = hex_data;
else str = exports.hex_array_to_hex_str(hex_data);
return crc16(str, 'hex');
};
exports.hex_gps_time = function (hex) {
return '20' + parseInt(hex.substr(0, 2), 16) + '-' + parseInt(hex.substr(2, 2), 16) + '-' + parseInt(hex.substr(4, 2), 16) + ' ' + parseInt(hex.substr(6, 2), 16) + ':' + parseInt(hex.substr(8, 2), 16) + ':' + parseInt(hex.substr(10, 2), 16)
}