Состоит из 2х файлов, я совсем не программист, поэтому правил чужой код методом научного тыка и возможно он совсем не оптимальный.
Файл 1
Код: Выделить всё
//var querystring = require('querystring');
var server = require ('./tk102.js');
var http = require('http');
var host = '127.0.0.1';
var port = 80;
var path = '/gps.php';
function sendGPSData (rHost, rPath, rPort, GPSData) {
rPath = rPath + '?latitude=' + GPSData.geo.latitude + '&longitude=' + GPSData.geo.longitude + '&deviceid=Tracker';
var options = {
host: rHost,
port: rPort,
path: rPath};
var req = http.request(options, function(res) {
var responseString = '';
res.on('data', function(data) {
responseString += data;
});
res.on('end', function() {
console.log('\nHTTP response code:' + res.statusCode);
console.log('\nResponse:' + responseString);
});
});
req.end();
req.on('error', function(e) {
console.log('\nERROR: ' + e.message);
});
}
function output (name, data) {
console.log ('\nEvent: ' + name);
console.dir (data, {
colors: String (process.env.TERM) .match (/color$/)
});
}
server.createServer ({
port: 1336,
timeout: 30
});
//debug log for all events
server.on ('log', output);
// incoming data received
server.on ('track', function (gpsData) {
sendGPSData (host, path, port, gpsData);
});
Файл 2
Код: Выделить всё
/*
Name: tk102
Description: TK102 GPS server for Node.js
Author: Franklin van de Meent (https://frankl.in)
Source: https://github.com/fvdm/nodejs-tk102
Feedback: https://github.com/fvdm/nodejs-tk102/issues
License: Unlicense / Public Domain (see UNLICENSE file)
(https://github.com/fvdm/nodejs-tk102/raw/master/UNLICENSE)
*/
var net = require ('net');
var http = require('http');
var EventEmitter = require ('events') .EventEmitter;
var tk102 = new EventEmitter ();
// HTTP GET settings
var options = {
host: 'www.google.com',
path: '/index.html'
};
// device data
var specs = [
function (raw) {
// 1203292316,0031698765432,GPRMC,211657.000,A,5213.0247,N,00516.7757,E,0.00,273.30,290312,,,A*62,F,imei:123456789012345,123
var result = null;
var lat1 = '';
var lat2 = '';
var lon1 = '';
var lon2 = '';
var gpsMsgType;
try {
result = {gpsMsgType: 'OTHER'};
//raw = raw.trim ().replace(/[)][(]/g,'):(').split(/[:]/);
var cmds = raw.trim ().replace(/[)][(]/g,'):(').split(/[:]/);
console.log('raw:'+raw+'raw.length:'+raw.length);
for (var msg = 0; msg < raw.length; ++msg) {
var command = cmds[msg].substr(13,4);
console.log('command:'+command);
if (command =='BR00') {
gpsMsgType = 'BR00';
lat1 = cmds[msg].substr(24,9);
lat2 = cmds[msg].substr(33,1);
lon1 = cmds[msg].substr(35,9);
lon2 = cmds[msg].substr(44,1);
result = {
raw: cmds[msg],
gpsMsgType: gpsMsgType,
lat1 : lat1,
lat2 : lat2,
lon1 : lon1,
lon2 : lon2,
geo: {
latitude: tk102.fixGeo (lat1, lat2),
longitude: tk102.fixGeo (lon1, lon2),
},
};
break;
}
}
} catch (e) {
result = null;
}
return result;
}
];
// defaults
tk102.settings = {
ip: '0.0.0.0',
port: 0,
connections: 10,
timeout: 10
};
// Emit event
tk102.event = function (name, value) {
tk102.emit (name, value);
tk102.emit ('log', name, value);
};
// Catch uncaught exceptions (server kill)
process.on ('uncaughtException', function (err) {
var error = new Error ('uncaught exception');
error.error = err;
console.log (error);
tk102.event ('error', error);
});
// Create server
tk102.createServer = function (vars) {
var key;
// override settings
if (typeof vars === 'object' && Object.keys (vars) .length >= 1) {
for (key in vars) {
tk102.settings [key] = vars [key];
}
}
// start server
tk102.server = net.createServer ();
// maximum number of slots
tk102.server.maxConnections = tk102.settings.connections;
// server started
tk102.server.on ('listening', function () {
tk102.event ('listening', tk102.server.address ());
});
// inbound connection
tk102.server.on ('connection', function (socket) {
var connection = tk102.server.address ();
connection.remoteAddress = socket.remoteAddress;
connection.remotePort = socket.remotePort;
tk102.event ('connection', connection);
socket.setEncoding ('utf8');
if (tk102.settings.timeout > 0) {
socket.setTimeout (parseInt (tk102.settings.timeout * 1000, 10));
}
socket.on ('timeout', function () {
tk102.event ('timeout', connection);
socket.destroy ();
});
socket.on ('data', function (data) {
var gps = {};
var err = null;
data = data.trim ();
tk102.event ('data', data);
if (data !== '') {
gps = tk102.parse (data);
if ((gps)&&(gps.gpsMsgType == 'BR00')) {
tk102.event ('track', gps);
//Send HTTP GET
} else {
err = new Error ('Cannot parse GPS data from the device');
err.reason = err.message;
err.input = data;
err.connection = connection;
tk102.event ('fail', err);
}
}
});
socket.on ('close', function (hadError) {
connection.hadError = hadError;
tk102.event ('disconnect', connection);
});
// error
socket.on ('error', function (error) {
var err = new Error ('Socket error');
err.reason = error.message;
err.socket = socket;
err.settings = tk102.settings;
tk102.event ('error', err);
});
});
tk102.server.on ('error', function (error) {
var err = new Error ('Server error');
if (error === 'EADDRNOTAVAIL') {
err = new Error ('IP or port not available');
}
err.reason = error.message;
err.input = tk102.settings;
tk102.event ('error', err);
});
// Start listening
tk102.server.listen (tk102.settings.port, tk102.settings.ip);
return tk102;
};
// Parse GPRMC string
tk102.parse = function (raw) {
var data = null;
var i = 0;
while (data === null && i < specs.length) {
data = specs [i] (raw);
i++;
}
return data;
};
// Clean geo positions, with 6 decimals
tk102.fixGeo = function (one, two) {
var minutes = one.substr (-7, 7);
var degrees = parseInt (one.replace (minutes, ''), 10);
one = degrees + (minutes / 60);
one = parseFloat ((two === 'S' || two === 'W' ? '-' : '') + one);
return Math.round (one * 1000000) / 1000000;
};
// Check checksum in raw string
tk102.checksum = function (raw) {
var str = raw.trim () .split (/[,*#]/);
var strsum = parseInt (str [15], 10);
var strchk = str.slice (2, 15) .join (',');
var check = 0;
var i;
for (i = 0; i < strchk.length; i++) {
check ^= strchk.charCodeAt (i);
}
check = parseInt (check.toString (16), 10);
return (check === strsum);
};
// ready
module.exports = tk102;