Comparing version 0.1.13 to 0.1.14
@@ -34,7 +34,7 @@ /* | ||
DevAdapter.prototype.ProcessDate = function (info) { | ||
DevAdapter.prototype.ProcessDate = function (info, utc) { | ||
var date; | ||
// Note: process is preset globaly for UTC in GpsDaemon | ||
if (info === undefined) { | ||
date = new Date(); | ||
date = new Date().getTime(); | ||
} else { | ||
@@ -45,6 +45,7 @@ // TK103 data.time format "1409152220" | ||
var d=info.substring (4,6); | ||
var h=info.substring (6,8); | ||
var n=info.substring (8,10); | ||
date = new Date (y,m,d,h,n); | ||
var h = info.substring(6, 8); | ||
var n = info.substring(8, 10); | ||
var s = info.substring(10, 12); | ||
} | ||
date = Date.UTC (y,m,d,h,n,s); | ||
return (date); | ||
@@ -63,3 +64,3 @@ }; | ||
if (uni === 'S' || uni === 'W') dec= dec * -1; | ||
if (uni === 'S' || uni === 'W' || uni === 'P') dec= dec * -1; | ||
return (dec); | ||
@@ -78,3 +79,3 @@ } | ||
{ cmd: cmd | ||
, gps : false | ||
, gps : false | ||
, valid: false | ||
@@ -88,3 +89,8 @@ , devid: args[1].split(':') [1] | ||
case 'F': // Full Gps Date | ||
console.log ("**** args length %s", args.length); | ||
// console.log ("**** args length %s", args.length); | ||
// Try to clean up obvious wrong data | ||
if (isNaN (args[7]) || isNaN (args[9]) || isNaN (args[11]) || isNaN (args[12])) { | ||
return ({cmd: cmd, valid: false}); | ||
} | ||
switch (args.length) { | ||
@@ -103,3 +109,3 @@ case 13: //old protocol [sms protocol 12] | ||
lon: ProcessCardinal(args[9], args[10]), | ||
sog: args[11], | ||
sog: parseInt (args[11] * 1853 / 360)/10, | ||
cog: args[12], | ||
@@ -121,3 +127,3 @@ alt: -1 | ||
lon: ProcessCardinal(args[9], args[10]), | ||
sog: args[11], | ||
sog: parseInt (args[11] * 1853 / 360)/10, | ||
cog: args[12], | ||
@@ -134,2 +140,4 @@ alt: CheckArg(args[13]), | ||
default: | ||
} | ||
@@ -167,3 +175,3 @@ return (data); | ||
DevAdapter.prototype.ParseData = function (line) { | ||
var cmd; | ||
var packetype; | ||
var data; | ||
@@ -177,6 +185,6 @@ | ||
case "#": // Login "##,imei:359710043551135,A;" | ||
cmd= 0; | ||
packetype= 0; | ||
break; | ||
case "i": // Track "imei:865328021048227,... | ||
cmd= 3; | ||
packetype= 3; | ||
break; | ||
@@ -187,3 +195,3 @@ case undefined: | ||
default: // Ping "359710043551135;" | ||
cmd= 2; | ||
packetype= 2; | ||
break; | ||
@@ -193,3 +201,3 @@ } | ||
switch (cmd) { | ||
switch (packetype) { | ||
case 0: // Login "##,imei:359710043551135,A;" | ||
@@ -200,3 +208,3 @@ if (args[2] !== 'A') return (null); | ||
data = | ||
{ cmd : TrackerCmd.GetFrom["LOGIN"] | ||
{ cmd : TrackerCmd.GetFrom.LOGIN | ||
, devid: info[1] | ||
@@ -230,2 +238,6 @@ }; | ||
case 'sp': // help me,1409050559,1234,F,215931.000,A,4737.1058,N,00245.6524,W,0.00,0;" | ||
data= this.ParseTrackerGps (TrackerCmd.GetFrom.ALARMSPEED, args); | ||
break; | ||
case 'lo': // low battery,0809231429,13554900601,F,062947.294,A,2234.4026,N,11354.3277,E,0.00,;" | ||
@@ -235,4 +247,4 @@ data= this.ParseTrackerGps (TrackerCmd.GetFrom.BATLOW, args); | ||
case 'st': // stockade,0809231429,13554900601,F,062947.294,A,2234.4026,N,11354.3277,E,0.00,;" | ||
data= this.ParseTrackerGps (TrackerCmd.GetFrom.SPEEDON, args); | ||
case 'st': // stokage,0809231429,13554900601,F,062947.294,A,2234.4026,N,11354.3277,E,0.00,;" | ||
data= this.ParseTrackerGps (TrackerCmd.GetFrom.STOCKADEON, args); | ||
break; | ||
@@ -315,9 +327,4 @@ | ||
break; | ||
// Set positioning by distance (tracker only sends position if vehicle has travelled XXXX meters) | ||
case TrackerCmd.SendTo.SET_BY_DISTANCE: // **,devid999999999999999,F,XXXXm; | ||
packet= util.format ("**,devid:%s,F,%s;", socket.device.devid, args); | ||
socket.write (packet); | ||
break; | ||
// Set multiple positions | ||
case TrackerCmd.SendTo.SET_TRACK_BY_TIME: // **,devid999999999999999,C,##x; | ||
case TrackerCmd.SendTo.SET_TRACK_BY_TIME: // **,devid999999999999999,C,##x; [15m,60s] | ||
packet= util.format ("**,devid:%s,C,%s;", socket.device.devid,args); | ||
@@ -336,9 +343,14 @@ socket.write (packet); | ||
break; | ||
// Activate movement alarm if move more than 200m | ||
// Set positioning by distance (tracker only sends position if vehicle has travelled XXXX meters) | ||
case TrackerCmd.SendTo.SET_BY_DISTANCE: // **,devid999999999999999,F,XXXXm; | ||
packet= util.format ("**,devid:%s,F,%s;", socket.device.devid, args); | ||
socket.write (packet); | ||
break; | ||
// Activate movement alarm if move more than 200m | ||
case TrackerCmd.SendTo.SET_MOVE_ALARM: // **,devid999999999999999,G; | ||
packet= util.format ("**,devid:%s,F,%s;", socket.device.devid, args); | ||
packet= util.format ("**,devid:%s,G,%s;", socket.device.devid, args); | ||
socket.write (packet); | ||
break; | ||
// Activate the speed alarm (send SMS if speed goes above XXX km/h) | ||
case TrackerCmd.SendTo.SET_SPEED_SMS: // **,devid999999999999999,H,XXX; | ||
case TrackerCmd.SendTo.SET_SPEED_ALARM: // **,devid999999999999999,H,XXX; | ||
packet= util.format ("**,devid:%s,H,%s", socket.device.devid, args); | ||
@@ -411,3 +423,3 @@ socket.write (packet); | ||
// return OK status | ||
this.Debug (5,"action=[%s] args=[%s] packet=%s", action, args, packet); | ||
this.Debug (4,"SendCommand action=[%s] args=[%s] packet=%s", action, args, packet); | ||
return (0); | ||
@@ -462,4 +474,4 @@ }; | ||
data = this.ParseData (line); // call jison parser | ||
if (data === null) { | ||
this.Debug (5,'Ignored data=[%s]', line); | ||
if (data === null || data.valid === false ) { | ||
this.Debug (5,'Invalid data=[%s]', line); | ||
socket.write ("GeoGate " + this.uid + " ignored=[" + line + "\n"); | ||
@@ -481,3 +493,3 @@ return; | ||
default: // provide a copy of parsed device.data to device | ||
this.Debug (3, 'Parsed Data=%j', data); | ||
this.Debug (7, 'Parsed Data=%j', data); | ||
break; | ||
@@ -495,5 +507,10 @@ }; | ||
var testParser = { "Start ": "##,devid:359710043551135,A" | ||
,"Bug Login ": "imei:865328021054936,tracker,150219091637,,F,091652.000,A,4738.2522,N,00256.7727,P,10.39,332.39,,1,0,0.0%,," | ||
,"Gps106b ": "imei:865328021048227,tracker,141111061820,,F,221824.000,A,4737.1076,N,00245.6550,W,0.04,0.00,,1,0,0.0%,," | ||
,"date ": "imei:865328021054936,tracker,16614828111646,,F,111649.000,A,4736.9955,N,00245.5026,W,24.50,294.23,,1,0,0.0%,," | ||
,"???? ": "imei:865328021054936,dt,1503082494102,,F,094104.000,A,4737.1657,N,00244.3707,W,0.00,296.93,,1,0,0.0%,," | ||
,'wrongdate ': "imei:865328021054936,tracker,1586190240145621,,F,145621.000,A,4737.1065,N,00245.6554,W,0.33,237.31,,1,0,0.0%,," | ||
,"ODBD ": "imei:865328021048227,OBD,141112020400,,,0.0,,000,0.0%,+,0.0%,00000,,,,," | ||
,"SPORT ": "imei:359710045716587,tracker,141123023317,,F,183317.000,A,4737.1233,N,00245.6569,W,0.00,0" | ||
,"NO-GPS ": "imei:865328021054936,tracker,150225200217,,L,,,2601,,CDF7,,,,,1,0,0.0%,," | ||
,"Ping ": "359710043551135" | ||
@@ -516,2 +533,3 @@ ,"Help-GPS1 ": "imei:359710043551135,help me,1409050559,1234,F,215931.000,A,4737.1058,N,00245.6524,W,0.00,0" | ||
,"Speed On ": "imei:012497000419790,ht,1010181032,00420777123456,F,093203.000,A,5004.5378,N,01426.7328,E,0.00," | ||
,"Speed two" : "imei:865328021054936,ht,150301045926, ,F,125926.000,A,4737.1061,N,00245.6529,W,0.03,148.34,,1,0,0.0%,," | ||
,"Park Off ": "imei:012497000419790,mt,1010181029,00420777123456,F,092913.000,A,5004.5392,N,01426.7344,E,0.00," | ||
@@ -518,0 +536,0 @@ ,"Park On ": "imei:012497000419790,lt,1010181025,00420777123456,F,092548.000,A,5004.5399,N,01426.7352,E,0.00," |
@@ -91,3 +91,2 @@ /* | ||
var device= this.gateway.activeClients [devid]; | ||
// if device is valid and log then doit | ||
@@ -102,3 +101,3 @@ // if (device !== undefined && device.logged) { | ||
{Device: devid | ||
,Timestamp : device.stamp.date.getTime() | ||
,Timestamp : device.stamp.acquired_at | ||
,StatusCode : 0 | ||
@@ -105,0 +104,0 @@ ,Speed : device.stamp.sog |
@@ -270,3 +270,3 @@ /* | ||
// sign or respond with a specifif servername header | ||
// sign or respond with a specific servername header | ||
response.setHeader("Server", "GeoGate-HttpAjax"); | ||
@@ -273,0 +273,0 @@ // provide a default search to index.html |
@@ -128,2 +128,3 @@ /* | ||
// send parsed data to unique device attached to NMEA adapter | ||
data.cmd = TrackerCmd.GetFrom.TRACK; | ||
socket.device.ProcessData (data); | ||
@@ -130,0 +131,0 @@ }; |
@@ -56,2 +56,3 @@ /* | ||
,['logout\\b' , "return 'OUT';" ] | ||
,['track\\b' , "return 'TRK';" ] | ||
,['info\\b' , "return 'INF';" ] | ||
@@ -326,4 +327,4 @@ ,['track\\b' , "return 'TRK';" ] | ||
posi.cog = posi.cog.toFixed (2); | ||
var info=util.format ("> -%d- Lat:%s Lon:%s Sog:%s Cog:%s Alt:%s Date:%s\n" | ||
, idx, posi.lat, posi.lon, posi.sog, posi.cog, posi.alt, posi.date); | ||
var info=util.format ("> -%d- Lat:%s Lon:%s Sog:%s Cog:%s Alt:%s Acquired:%s\n" | ||
, idx, posi.lat, posi.lon, posi.sog, posi.cog, posi.alt, posi.acquired_at); | ||
socket.write (info); | ||
@@ -360,3 +361,3 @@ } | ||
var info= util.format ("> --- devid/mmsi= %s Name= '%s' LastShow: %ss Adapter: %s\n" | ||
, devId, dev.name, elapse, dev.adapter.info); | ||
, data.devid, dev.name, elapse, dev.adapter.info); | ||
socket.write (info); | ||
@@ -363,0 +364,0 @@ info=util.format ("> Lat:%s Lon:%s Speed:%s Alt:%s Crs:%s Time:%s\n" |
@@ -29,3 +29,4 @@ /* | ||
var net = require('net'); | ||
var url = require("url"); | ||
var url = require("url"); | ||
var util = require("util"); | ||
@@ -32,0 +33,0 @@ |
@@ -22,2 +22,3 @@ /* | ||
var util = require("util"); | ||
var EventEmitter = require("events").EventEmitter; | ||
@@ -64,3 +65,3 @@ | ||
// prepare ourself to make debug possible | ||
this.debug=opts.debug; | ||
this.debug=opts.mysql.debug || opts.debug; | ||
this.gateway =gateway; | ||
@@ -76,5 +77,5 @@ this.count=0; // stat for connection retry | ||
this.uid ="mysql:" + opts.mysql.username + "@" + opts.mysql.hostname + "/" + opts.mysql.basename; | ||
this.event = new EventEmitter(); | ||
// create initial connection handler to database | ||
CreateConnection (this); | ||
CreateConnection (this); | ||
}; | ||
@@ -126,28 +127,18 @@ | ||
track: 'CREATE TABLE IF NOT EXISTS T_' + devid + ' (' | ||
+ 'id INT NOT NULL AUTO_INCREMENT,' | ||
+ 'lat FLOAT,' | ||
+ 'lon FLOAT,' | ||
+ 'alt FLOAT,' | ||
+ 'cog FLOAT,' | ||
+ 'sog FLOAT,' | ||
+ 'moved INT,' | ||
+ 'elapse INT,' | ||
+ 'date DATETIME,' | ||
+ 'valid INT,' | ||
+ 'INDEX (date),' | ||
+ 'msg INT,' | ||
+ 'id INT NOT NULL AUTO_INCREMENT,' | ||
+ 'lat FLOAT,' | ||
+ 'lon FLOAT,' | ||
+ 'alt FLOAT,' | ||
+ 'cog FLOAT,' | ||
+ 'sog FLOAT,' | ||
+ 'moved INT,' | ||
+ 'elapsed INT,' | ||
+ 'acquired_at BIGINT,' | ||
+ 'valid INT,' | ||
+ 'gpsdate DATETIME,' | ||
+ 'PRIMARY KEY (id )' | ||
+ ') DEFAULT CHARSET=utf8;' | ||
,alarm: 'CREATE TABLE IF NOT EXISTS A_' + devid + ' (' | ||
+ 'id INT NOT NULL AUTO_INCREMENT,' | ||
+ 'lat FLOAT,' | ||
+ 'lon FLOAT,' | ||
+ 'alarm INT,' | ||
+ 'arg INT,' | ||
+ 'date DATETIME,' | ||
+ 'INDEX (date),' | ||
+ 'PRIMARY KEY (id )' | ||
+ ') DEFAULT CHARSET=utf8;' | ||
,odb: 'CREATE TABLE IF NOT EXISTS O_' + devid + ' (' | ||
@@ -166,5 +157,4 @@ + 'id INT NOT NULL AUTO_INCREMENT,' | ||
+ 'diag INT,' | ||
+ 'date DATETIME,' | ||
+ 'INDEX (date),' | ||
+ 'gpsdate DATETIME,' | ||
+ 'acquired_at BIGINT,' | ||
+ 'PRIMARY KEY (id )' | ||
@@ -192,4 +182,4 @@ + ') DEFAULT CHARSET=utf8;' | ||
,track : 'T_' + devid | ||
,obd : 'O_' + devid | ||
,alarm : 'A_' + devid | ||
,obd : 'O_' + devid | ||
,date : new Date() | ||
@@ -220,3 +210,2 @@ }; | ||
track: 'DROP TABLE IF EXISTS T_' + devid + ';' | ||
,alarm: 'DROP TABLE IF EXISTS A_' + devid + ';' | ||
,odb: 'DROP TABLE IF EXISTS O_' + devid + ';' | ||
@@ -235,3 +224,3 @@ }; | ||
var queryString = "delete from ALL_Devices where uniqueId =" + devid; | ||
var queryString = "delete from ALL_Devices where devid =" + devid; | ||
sqlQuery = this.base.query(queryString); | ||
@@ -244,3 +233,3 @@ | ||
sqlQuery.on("error", function() { | ||
sqlQuery.on("error", function(err) { | ||
gateway.event.emit ("notice", "ERROR DEVICE", "from to remove MySQL", devid, err); | ||
@@ -263,2 +252,3 @@ }); | ||
self.Debug(9, "sqlQuery %j", result); | ||
self.event.emit ("dev-auth", device); | ||
@@ -269,3 +259,2 @@ // update active device pool [note device.devid is set by GpsdClient before SQL login] | ||
device.track = result.track; | ||
device.alarm = result.alarm; | ||
device.obd = result.obd; | ||
@@ -278,2 +267,3 @@ device.logged = true; // marked device as knowned from database | ||
}); | ||
}; | ||
@@ -287,2 +277,3 @@ | ||
device.logged = false; | ||
this.event.emit("dev-quit", device); | ||
}; | ||
@@ -305,2 +296,4 @@ | ||
}); | ||
this.event.emit ("dev-pos", device); | ||
}; | ||
@@ -328,3 +321,3 @@ | ||
// INSERT INTO positions (device_id, time, valid, latitude, longitude, altitude, speed, course, power) | ||
var queryString = "INSERT INTO " + device.alarm + " set ?"; | ||
var queryString = "INSERT INTO " + device.track + " set ?"; | ||
@@ -344,3 +337,3 @@ // launch insertion of new position asynchronously | ||
var sqlQuery= "Select lat,lon,sog,cog,alt,date from T_" + devid | ||
var sqlQuery= "Select lat,lon,sog,cog,alt,acquired_at from T_" + devid | ||
+ " ORDER BY DATE DESC LIMIT " + args; | ||
@@ -347,0 +340,0 @@ this.Debug (4, "sqlQuery=%s", sqlQuery); |
/* | ||
* Copyright 2014 Fulup Ar Foll | ||
* Copyright 2015 Fulup Ar Foll | ||
* | ||
@@ -17,10 +17,16 @@ * Licensed under the Apache License, Version 2.0 (the "License"); | ||
var util = require("util"); | ||
var path = require("path"); | ||
function TracePoint () { | ||
var saved = Error.prepareStackTrace; // save default prepareStack function | ||
Error.prepareStackTrace = function(_, stack){ return stack; }; // overload err stack handling | ||
Error.captureStackTrace(this, arguments.callee); // request a stack | ||
this.trace = this.stack; // effectively build trace | ||
Error.prepareStackTrace = saved; // restore original nodejs function | ||
} | ||
var traceback = require('traceback'); // https://www.npmjs.org/package/traceback | ||
var util = require("util"); | ||
// ------- Public Methods -------------- | ||
var Debug = function(level, format) { //+ arguments | ||
var dbgLevel = function(level, format) { //+ arguments | ||
if (this.debug >= level) { | ||
@@ -30,13 +36,18 @@ | ||
var message = util.format.apply(null, args); | ||
try { | ||
var trace = traceback()[1]; // get trace up to previous calling function | ||
if (this.debug > 5) console.log("-%d- %s/%s:%d [%s]", level, trace.file, trace.name, trace.line, message); | ||
else console.log("-- %s [%s] -- %j", level, trace.name, message); | ||
} catch (e) { | ||
console.log("-- %s [%s] -- %j", level, 'no trace', message); | ||
var trace = new TracePoint().trace; | ||
var info = { | ||
fullpath : trace[1].getFileName(), | ||
linenum : trace[1].getLineNumber(), | ||
basename : path.basename (trace[1].getFileName()) | ||
}; | ||
if (dbgLevel >= 5) { | ||
console.log("%s:%d", info.fullpath, info.linenum); | ||
console.log("\t[%d] %j", level, message); | ||
} | ||
else console.log("--%d-- [%s:%d] -- %j", level, info.basename, info.linenum, message); | ||
} | ||
}; | ||
module.exports = Debug; | ||
module.exports = dbgLevel; |
@@ -34,5 +34,5 @@ /* | ||
this.moved = parseInt(data.moved); | ||
this.elapse= parseInt(data.elapse); | ||
this.elapsed= parseInt(data.elapsed); | ||
this.valid = parseInt(+data.valid); | ||
this.date = data.date; | ||
this.acquired_at = data.acquired_at; | ||
} | ||
@@ -134,2 +134,3 @@ | ||
var update = true; // default is do the update | ||
data.acquired_at = new Date().getTime(); | ||
@@ -142,9 +143,9 @@ // compute distance only update backend is distance is greater than xxxm | ||
// compute elapse time since last update | ||
var elapse = parseInt ((data.date.getTime() - this.stamp.date.getTime()) / 1000); // in seconds | ||
var sogms = parseInt (moved/elapse); // NEED TO BE KNOWN: with short tic sog is quicky overestimated by 100% !!! | ||
// compute elapsed time since last update | ||
var elapsed = parseInt ((data.acquired_at - this.stamp.date) / 1000); // in seconds | ||
var sogms = parseInt (moved/elapsed); // NEED TO BE KNOWN: with short tic sog is quicky overestimated by 100% !!! | ||
// usefull human readable info for control console | ||
data.moved = moved; | ||
data.elapse = elapse; | ||
data.elapsed = elapsed; | ||
@@ -155,3 +156,3 @@ // if moved less than mindist or faster than maxsog check maxtime value | ||
// should we force a DB update because maxtime ? | ||
if (elapse < controller.svcopts.maxtime) update = false; | ||
if (elapsed < controller.svcopts.maxtime) update = false; | ||
} | ||
@@ -161,3 +162,3 @@ } else { | ||
data.moved = 0; | ||
data.elapse = 0; | ||
data.elapsed = 0; | ||
} | ||
@@ -167,3 +168,3 @@ | ||
if (update) { // update device last position in Ram/Database | ||
this.stamp = new PositionObj(data); | ||
this.stamp = new PositionObj(this.devid, data); | ||
gateway.backend.UpdatePosDev (this, this.stamp); | ||
@@ -170,0 +171,0 @@ } else { |
@@ -32,35 +32,28 @@ /* | ||
function PositionObj (data) { | ||
this.lat = parseFloat(data.lat); | ||
this.lon = parseFloat(data.lon); | ||
this.sog = parseFloat(data.sog); | ||
this.cog = parseFloat(data.cog); | ||
this.alt = parseFloat(data.alt); | ||
this.moved = parseInt(data.moved); | ||
this.elapse= parseInt(data.elapse); | ||
this.valid = parseInt(+data.valid); | ||
this.date = data.date; | ||
this.msg = parseInt (data.cmd); | ||
this.lat = parseFloat(data.lat); | ||
this.lon = parseFloat(data.lon); | ||
this.sog = parseFloat(data.sog) || 0; | ||
this.cog = parseFloat(data.cog) || 0; | ||
this.alt = parseFloat(data.alt) || 0; | ||
this.moved = parseInt(data.moved) || -1; | ||
this.elapsed= parseInt(data.elapsed) || -1; | ||
this.valid = parseInt(+data.valid); | ||
this.acquired_at = data.acquired_at; | ||
this.gpsdate= data.date; | ||
} | ||
function AlarmObj (data) { | ||
this.alarm= parseInt (data.cmd); | ||
this.arg = parseInt (data.arg); | ||
this.lat = parseFloat(data.lat); | ||
this.lon = parseFloat(data.lon); | ||
this.data = new Date(); | ||
} | ||
function ObdObj (data) { | ||
if (data.trip.length > 0) this.trip = parseInt (data.trip); | ||
if (data.rfuel.length > 0) this.rfuel= parseInt (data.rfuel); | ||
if (data.afuel.length > 0) this.afuel= parseFloat (data.afuel); | ||
if (data.dtime.length > 0) this.dtime= parseInt (data.dtime); | ||
if (data.speed.length > 0) this.speed= parseInt (data.speed); | ||
if (data.pload.length > 0) this.pload= parseFloat (data.pload); | ||
if (data.temp.length > 0) this.temp = parseInt (data.temp); | ||
if (data.atp.length > 0) this.atp = parseFloat (data.atp); | ||
if (data.rpm.length > 0) this.rpm = parseInt (data.rpm); | ||
if (data.bat.length > 0) this.bat = parseFloat (data.bat); | ||
if (data.diag.length > 0) this.diag = parseInt (data.diag); | ||
this.date = new Date(); | ||
this.trip = parseInt (data.trip) || 0; | ||
this.rfuel= parseInt (data.rfuel) || 0; | ||
this.afuel= parseFloat (data.afuel) || 0; | ||
this.dtime= parseInt (data.dtime) || 0; | ||
this.speed= parseInt (data.speed) || 0; | ||
this.pload= parseFloat (data.pload) || 0; | ||
this.temp = parseInt (data.temp) || 0; | ||
this.atp = parseFloat (data.atp) || 0; | ||
this.rpm = parseInt (data.rpm) || 0; | ||
//this.bat = parseFloat (data.bat) || 0; | ||
if (data.diag.length > 0) this.diag = parseInt (data.diag); else this.diag=0; | ||
this.acquired_at = new Date().getTime(); | ||
} | ||
@@ -77,5 +70,6 @@ | ||
this.name = false; | ||
this.logged = false; | ||
this.alarm = 0; // count alarm messages | ||
this.sensor = 0; | ||
this.logged = false; | ||
this.alarmcount= 0; // count alarm messages | ||
this.errorcount= 0; // number of ignore messages | ||
this.jobcount = 0; // Job commands send to gateway | ||
this.count = 0; // generic counter used by file backend | ||
@@ -86,3 +80,3 @@ | ||
} else { | ||
this.uid = "tcpclient://" + this.adapter.info + ":" + socket.port; | ||
this.uid = "tcpclient://" + this.adapter.info + ":" + socket.port; | ||
} | ||
@@ -138,2 +132,7 @@ }; | ||
TcpClient.prototype.ProcessData = function(data) { | ||
function JobCallback (job) { | ||
job.gateway.Debug (3,"Job Done job=%s", job); | ||
} | ||
// if not logged exit now except for login | ||
@@ -169,6 +168,19 @@ if (!this.logged && data.cmd !== TrackerCmd.GetFrom.LOGIN) { | ||
case TrackerCmd.GetFrom.BATLOW: | ||
case TrackerCmd.GetFrom.SPEEDON: | ||
case TrackerCmd.GetFrom.ALARMSPEED: | ||
case TrackerCmd.GetFrom.ALARMDOOR: | ||
case TrackerCmd.GetFrom.ALARMACC: | ||
this.gateway.backend.UpdateAlarmDev (this, new AlarmObj (data)); | ||
// after 5 validated Alarm let's clear device | ||
if (this.alarmcount ++ > 5) { | ||
this.alarmcount = 0; | ||
var job={command: TrackerCmd.SendTo.ALARM_OFF | ||
,gateway: this.gateway | ||
,devId : data.devid | ||
,request: this.jobcount++ | ||
}; | ||
this.gateway.queue.push (job, JobCallback); // push to queue | ||
} | ||
data.acquired_at = new Date().getTime(); | ||
this.gateway.backend.UpdateAlarmDev (this, new PositionObj (data)); | ||
break; | ||
@@ -180,25 +192,31 @@ | ||
var update = true; // default is do the update | ||
data.acquired_at = new Date().getTime(); | ||
// compute distance only update backend is distance is greater than xxxm | ||
if (this.stamp !== undefined) { | ||
var moved = parseInt (this.Distance (this.stamp, data)); | ||
// compute elapse time since last update | ||
var elapse = parseInt ((data.date.getTime() - this.stamp.date.getTime()) / 1000); // in seconds | ||
var speedms = parseInt (moved/elapse); // NEED TO BE KNOWN: with short tic speed is quicky overestimated by 100% !!! | ||
// compute elapsed time since last update | ||
var elapsed = parseInt((data.acquired_at - this.stamp.acquired_at)/1000) ; // in seconds | ||
var speedms = parseInt (moved/elapsed); // NEED TO BE KNOWN: with short tic speed is quicky overestimated by 100% !!! | ||
// usefull human readable info for control console | ||
data.moved = moved; | ||
data.elapse = elapse; | ||
data.moved = moved; | ||
data.elapsed = elapsed; | ||
// if moved less than mindist or faster than maxspeed check maxtime value | ||
if (moved < this.controller.svcopts.mindist || speedms > this.controller.svcopts.maxspeed) { | ||
this.Debug(2,"%s Dev %s Data ignored moved %dm<%dm ?", this.count, this.devid, moved, this.controller.svcopts.mindist); | ||
if (moved < this.controller.svcopts.mindist) { | ||
this.Debug(2,"%s Dev %s Data ignored moved %dm<%dm ?", this.errorcount, this.devid, moved, this.controller.svcopts.mindist); | ||
// should we force a DB update because maxtime ? | ||
if (elapse < this.controller.svcopts.maxtime) update = false; | ||
if (elapsed < this.controller.svcopts.maxtime) update = false; | ||
} | ||
// if moved less than mindist or faster than maxspeed check maxtime value | ||
if (speedms > this.controller.svcopts.maxspeed) { | ||
this.Debug(2,"%s Dev %s Data ignored speed %dm/s >%dm/s ?", this.errorcount, this.devid, speedms, this.controller.svcopts.maxspeed); | ||
// we only ignore maxErrorCount message, then we restart data acquisition | ||
if (this.errorcount++ < this.controller.svcopts.maxerrors) update = false; | ||
} | ||
} else { | ||
data.moved = 0; | ||
data.elapse = 0; | ||
data.elapsed = 0; | ||
} | ||
@@ -208,2 +226,3 @@ | ||
if (update) { // update device last position in Ram/Database | ||
this.errorcount = 0; | ||
this.stamp = new PositionObj(data); | ||
@@ -210,0 +229,0 @@ this.gateway.backend.UpdatePosDev (this, this.stamp); |
@@ -21,6 +21,7 @@ /* | ||
var FromTracker = | ||
{ LOGIN : 1 | ||
, TRACK : 2 | ||
{ TRACK : 0 | ||
, LOGIN : 1 | ||
, PING : 2 | ||
, OBD : 3 | ||
, PING : 4 | ||
, HELPME : 5 // help me,1409050559,1234,F,215931.000,A,4737.1058,N,00245.6524,W,0.00,0;" | ||
@@ -31,9 +32,11 @@ , HELPOFF : 6 // Stop SOS: et,1010181049,00420777123456,F,094922.000,A,5004.5335,N,01426.7305,E,0.00,;" | ||
, SPEEDON :11 // Speed on; ht,1010181032,00420777123456,F,093203.000,A,5004.5378,N,01426.7328,E,0.00,;" | ||
, STOCKAD :12 // stockade,0809231429,13554900601,F,062947.294,A,2234.4026,N,11354.3277,E,0.00,;" | ||
, BATTERY :13 | ||
, SENSOR :14 // sensor alarm,1409070008,,F,160844.000,A,4737.0465,N,00245.6099,W,21.21,306.75" | ||
, TIMEZONE :15 // TimeZone: it,141112230446,,F,110446.000,A,4737.1068,N,00245.6503,W,0.31,269.97,,1,0,0.0%,, | ||
, ALARMSPEED:12 // Alarm speed; speed,150301163002,,F,163002.000,A,4739.6799,N,00252.3197,W,55.70,280.89,,1,0,0.0%,," | ||
, STOCKAD :13 // stockade,0809231429,13554900601,F,062947.294,A,2234.4026,N,11354.3277,E,0.00,;" | ||
, BATTERY :15 | ||
, SENSOR :16 // sensor alarm,1409070008,,F,160844.000,A,4737.0465,N,00245.6099,W,21.21,306.75" | ||
, TIMEZONE :17 // TimeZone: it,141112230446,,F,110446.000,A,4737.1068,N,00245.6503,W,0.31,269.97,,1,0,0.0%,, | ||
, ALARMDOOR :20 // door alarm,1010181112,00420777123456,F,101216.000,A,5004.5502,N,01426.7268,E,0.00,;" | ||
, ALARMACC :21 // acc alarm,1010181112,00420777123456,F,101256.000,A,5004.5485,N,01426.7260,E,0.00,;" | ||
, ALARMACC :21 // ac alarm,1010181112,00420777123456,F,101256.000,A,5004.5485,N,01426.7260,E,0.00,;" | ||
, ALARMON :22 // Turn alarm: gt,1010181046,00420777123456,F,094657.000,A,5004.5251,N,01426.7298,E,0.00,; | ||
@@ -63,3 +66,3 @@ | ||
, SET_MOVE_ALARM: 24 | ||
, SET_SPEED_SMS: 25 | ||
, SET_SPEED_ALARM: 25 | ||
@@ -79,73 +82,8 @@ , ENGINE_OFF: 25 | ||
var SmsTracker= | ||
{ FULL_RESET : [1,'begin%pwd%' , "WARNING: erase any device's stored config"] | ||
, ADMIN_PWD : [1,'adminpassword13142324' , "WARNING: full reset of device, will break any exiting configuration"] | ||
, CHECK_IMEI : [1,'imei%pwd%' , "return device DEVID"] | ||
, GPRS_APN : [1,'apn%pwd% %apn%' , "configure APN ex: APN123456 FREE"] | ||
, GPRS_URI : [1,'adminip%pwd% %host% %port%' , "configure WEB plateform ex: adminip123456 103.10.1.2 1234"] | ||
, GPRS_MOD : [1,'gprs%pwd%' , "Set GPRS Mode"] | ||
, CHECK_GRPS : [1,'load%pwd%' , "Check GPRS"] | ||
, PWD_CHANGE : [1,'password%pwd% %newpwd%' , 'Change password'] | ||
, GPRS_LESS : [1,'less gprs%pwd% ON' , 'Less GPRS mod'] | ||
, GPRS_FULL : [1,'less gprs%pwd% OFF' , 'Reset Full GPRS mod'] | ||
, SMS_MOD : [1,'sms%pwd%' , "Set SMS Mode"] | ||
, LOCALTIME : [1,'time zone%pwd% %zone%' , "set localtime zone +0=UTC"] | ||
, ADMIN_SET : [1,'admin%pwd% %phone%' , "set admin phone: --cmd=admin_set --args='pwd:123456 phone:0033xxxxxxxxx'"] | ||
, ADMIN_OFF : [1,'noadmin%pwd% %phone%' , "remove phone from admin list"] | ||
, GPRS_PROTO : [1,'protocol%pwd% %proto%' , "set 12/18 OBD protocol: --cmd=gprs_proto --args:'pwd:123456 protocol:18'"] | ||
, OBD_STATUS : [1,'obdmsg%pwd%' , " Return ODB status information"] | ||
, OBD_MOD : [1,'obdii%pwd% %mod%' , " 0=no 2=with single tracking 1=with any tracking"] | ||
, OBD_MILEAGE : [1,'odo%pwd% %km%' , " set initial mileage"] | ||
, OBD_TANK : [1,'tank%pwd% %l%' , " tank capacity in litters"] | ||
, OBD_SVC : [1,'service%pwd% %day%d %km%', " service alarm after %day% or %km%"] | ||
, TRACK_ONE : [0,'fix001s001n%pwd%' , " single track location [SMS mode only] ex: [1,fix001s001n123456"] | ||
, TRACK_MANY : [0,'fix%delay%***n%pwd%' , " unlimited track location [SMS mode only] ex: [1,fix180s***n123456"] | ||
, TRACK_LIMIT : [0,'fix%delay%%replay%n%pwd%', " limited track --command=TRACK_LIMIT --args='delay:030s replay:005'"] | ||
, TRACK_DIST : [1,'distance%pwd% %dist%' , " Track on distance in meter ex: [1,distance123456 0300"] | ||
, TRACK_ANGLE : [1,'angle%pwd% %angle%' , " Track on distance in meter ex: [1,angle123456 030"] | ||
, TRACK_OFF : [1,'nofix%pwd%' , " Stop AUTO track"] | ||
, DRIFT_ON : [1,'nosuppress%pwd%' , " reset DRIFT [default mode] on"] | ||
, DRIFT_OFF : [1,'supress%pwd%' , " unset DRIFT [tracker sends position even when AC is OFF and GPS not moving]"] | ||
, ADDRESS : [1,'address%pwd%' , " request address by SMS [working ???]"] | ||
, MOD_VOICE : [1,'monitor%pwd%' , " set monitor voice mode"] | ||
, MOD_TRACK : [1,'tracker%pwd%' , " reset to tracker mode"] | ||
, SAVSD_ON : [1,'save%delay%***n%pwd%' , " Save on SD every xxxs if GPRS is down"] | ||
, SAVSD_OFF : [1,'clear%pwd%' , " Stop saving on SD"] | ||
, LOAD_SD : [1,'load%pwd% %date%' , " Load from SD card"] | ||
, LOWBAT_ON : [1,'lowbattery%pwd% on' , " set alarm for low battery"] | ||
, LOWBAT_OFF : [1,'lowbattery%pwd% off' , " remove low battery alarm"] | ||
, EXTPOW_ON : [1,'extpower%pwd% on' , " set external battery alarm"] | ||
, EXTPOW_OFF : [1,'extpower%pwd% off' , " clear external battery alarm"] | ||
, GPSBLIND_ON : [1,'gpssignal%pwd% on' , " alarm on lost of GPS signal"] | ||
, GPSBLIND_OFF: [1,'gpssignal%pwd% off' , " clear alarm on lost of GPS signal [default]"] | ||
, MOVE_ON : [1,'area%pwd% on' , " set movement alarm ON"] | ||
, MOVE_OFF : [1,'area%pwd% off' , " clear movement alarm ON [default]"] | ||
, SPEED_ON : [1,'speed%pwd% %km%' , " set max speed alarm"] | ||
, SPEED_OFF : [1,'nospeed%pwd%' , " clear max speed alarm"] | ||
, ARM_ON : [1,'arm%pwd%' , " arm tracker alarm"] | ||
, ARM_OFF : [1,'disarm%pwd%' , " disarm tracker alar"] | ||
, SHOCK_LVL : [1,'sensitivity%pwd% %level%', " set shock detection sensitivity level [1,2,3]"] | ||
, FORWARD : [1,'forward%pwd% %phone%' , " Forward alarm to this message"] | ||
, CHECK_STATUS: [1,'check%pwd%' , " Tracker status"] | ||
, SLEEP_ON : [1,'sleep%pwd% time' , " sleep mode [GSM off wait for call]"] | ||
, SLEEP_SHOCK : [1,'sleep%pwd% shock' , " sleep [GPS off]until shock is detected"] | ||
, SLEEP_DEEP : [1,'sleep%pwd% deepshock' , " deepsleep [GPS&GSM off] wait for shock"] | ||
, SLEEP_OFF : [1,'sleep%pwd% off' , " deepsleep [GPS&GSM off] wait for shock"] | ||
, AWAKE_ON : [1,'schedule%pwd% %delay%' , " awake and send possition every xxx ex: [1,schedule123456 1d"] | ||
, AWAKE_OFF : [1,'noschedule%pwd%' , " awake off"] | ||
}; | ||
var TrackerCmd = | ||
{ GetFrom: FromTracker | ||
, SendTo: ToTracker | ||
, SmsTo : SmsTracker | ||
}; | ||
module.exports = TrackerCmd; |
@@ -145,8 +145,10 @@ /* | ||
// take care or default adapter svcopts | ||
if (this.svcopts.mindist === undefined) this.svcopts.mindist =200; // in m | ||
if (this.svcopts.maxtime === undefined) this.svcopts.maxtime =3600;// in s == 1h | ||
if (this.svcopts.maxspeed === undefined) this.svcopts.maxspeed=100; // in 100m/s=~400km/h | ||
if (this.svcopts.debug === undefined) this.svcopts.debug =this.debug; | ||
if (svcopts.hostname === undefined) svcopts.hostname='localhost'; | ||
if (svcopts.timeout === undefined) svcopts.timeout=60; | ||
if (svcopts.mindist === undefined) this.svcopts.mindist =200; // in m | ||
if (svcopts.maxtime === undefined) this.svcopts.maxtime =3600;// in s == 1h | ||
if (svcopts.maxspeed === undefined) this.svcopts.maxspeed=100; // in 100m/s=~400km/h | ||
if (svcopts.debug === undefined) this.svcopts.debug =this.debug; | ||
if (svcopts.debug === undefined) this.svcopts.debug =this.debug; | ||
if (svcopts.hostname === undefined) this.svcopts.hostname='localhost'; | ||
if (svcopts.timeout === undefined) this.svcopts.timeout=60; | ||
if (svcopts.maxerrors=== undefined) this.svcopts.maxerrors=2; | ||
// load device adapter as described within svcopts option from user application | ||
@@ -153,0 +155,0 @@ try { |
@@ -79,3 +79,3 @@ /* | ||
gateway.Debug (5,"Queue Request=%s DevId=%s Command=%s Retry=%d", job.request, job.devId, job.command, job.retry); | ||
gateway.Debug (4,"Queue Request=%s DevId=%s Command=%s Retry=%d", job.request, job.devId, job.command, job.retry); | ||
@@ -87,3 +87,3 @@ // broadcast command loop on active device list to split commands | ||
// we only broadcast to device with a valid TCP session | ||
if (device.socket !== null) { | ||
if (device && device.socket !== null) { | ||
var request = { | ||
@@ -90,0 +90,0 @@ gateway : job.gateway, |
{ | ||
"name" : "ggserver", | ||
"description" : "GTSdtracking is an opensource GPS tracking server framework", | ||
"version" : "0.1.13", | ||
"version" : "0.1.14", | ||
"author" : { | ||
"name" : "Fulup Ar Foll", | ||
"email" : "fulup@fridu.net", | ||
"url" : "http://www.fridu.org/fulup" | ||
"email" : "fulup@breizhme.net", | ||
"url" : "http://www.breizhme.net/fulup" | ||
}, | ||
@@ -30,3 +30,2 @@ "keywords" : [ "GTS", "opengts", "GPS", "tracker", "AIS", "GeoJSON", "nmea", "gpx", "gps103", "tk102", "simulator", "gprmc" ], | ||
,"ggencoder": "*" | ||
,"ggsmsc" : "*" | ||
}, | ||
@@ -33,0 +32,0 @@ "repository" : { |
Wildcard dependency
QualityPackage has a dependency with a floating version range. This can cause issues if the dependency publishes a new major version.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
240886
9
34
4773
9
14
5
- Removedggsmsc@*
- Removedggsmsc@0.1.8(transitive)