teltonika

This commit is contained in:
Pringgosutono
2025-10-30 10:33:55 +07:00
parent 84a9ce3f4c
commit fd304e1f61
7 changed files with 1355 additions and 492 deletions

525
app.js
View File

@ -1,141 +1,158 @@
require("dotenv").config({ path: ".env" });
require("events").EventEmitter.prototype._maxListeners = 30;
const morgan = require("morgan");
require("dotenv").config({ path: ".env" })
require("events").EventEmitter.prototype._maxListeners = 30
const morgan = require("morgan")
const net = require("net");
const dgram = require("dgram");
const crc = require("crc");
const moment = require("moment");
const LibDevice = require("./library/LibDevice");
const GpsTracksModels = require("./models/GpsTracksModels");
const ZoneModels = require("./models/ZoneModels");
const VhcModels = require("./models/VhcModels");
const LibMail = require("./library/LibMail");
const LibHelper = require("./library/LibHelper");
const nanoid = require("nanoid").nanoid;
const express = require("express");
const routes = require("./routes/routes");
const app = express();
const LibWinston = require("./library/LibWinston");
const net = require("net")
const dgram = require("dgram")
const crc = require("crc")
const moment = require("moment")
const LibDevice = require("./library/LibDevice")
const GpsTracksModels = require("./models/GpsTracksModels")
const ZoneModels = require("./models/ZoneModels")
const VhcModels = require("./models/VhcModels")
const LibMail = require("./library/LibMail")
const LibHelper = require("./library/LibHelper")
const nanoid = require("nanoid").nanoid
const LibWinston = require("./library/LibWinston")
const express = require("express")
// const routes = require("./routes/routes")
const listen = require("./routes/listen")
const app = express()
const logName = "libUdp"
const Logger = LibWinston.initialize(logName)
const logName = "libUdp";
const Logger = LibWinston.initialize(logName);
async function commitMessage(now, logDevice) {
try {
if (!logDevice.original_hex) {
return false;
return false
}
const vhc = await VhcModels.getVhcByDeviceId(logDevice.device_id);
const lastTrack = await GpsTracksModels.get2LastLocByDeviceId(logDevice.device_id);
const vhc = await VhcModels.getVhcByDeviceId(logDevice.device_id)
const lastTrack = await GpsTracksModels.get2LastLocByDeviceId(logDevice.device_id)
if (["heartbeat", "alarm"].includes(logDevice.action)) {
if (logDevice.ignition == GpsTracksModels.STTS_IGNITION_HIGH) {
if (logDevice.speed) {
logDevice.stts_engine = GpsTracksModels.STTS_EN_MOVING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_MOVING
} else {
if (lastTrack.length > 0) {
const checkLastHeartbeat = await GpsTracksModels.getLastHeartbeatToDeterminIdling(logDevice.device_id, lastTrack[0].crt, now);
const checkLastHeartbeat = await GpsTracksModels.getLastHeartbeatToDeterminIdling(
logDevice.device_id,
lastTrack[0].crt,
now
)
if (checkLastHeartbeat.length >= 3) {
logDevice.stts_engine = GpsTracksModels.STTS_EN_IDLING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_IDLING
} else {
logDevice.stts_engine = lastTrack[0].stts_engine;
logDevice.stts_engine = lastTrack[0].stts_engine
}
}
}
} else {
logDevice.stts_engine = GpsTracksModels.STTS_EN_STOPING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_STOPING
}
}
if (["location"].includes(logDevice.action)) {
const lastHeartbeatOrAlarm = await GpsTracksModels.get2LastHeartbeatOrAlarm(logDevice.device_id);
const lastHeartbeatOrAlarm = await GpsTracksModels.get2LastHeartbeatOrAlarm(logDevice.device_id)
if (lastHeartbeatOrAlarm.length > 0) {
logDevice.ignition = lastHeartbeatOrAlarm[0].ignition;
logDevice.stts_gps = lastHeartbeatOrAlarm[0].stts_gps;
logDevice.stts_gsm = lastHeartbeatOrAlarm[0].stts_gsm;
logDevice.ignition = lastHeartbeatOrAlarm[0].ignition
logDevice.stts_gps = lastHeartbeatOrAlarm[0].stts_gps
logDevice.stts_gsm = lastHeartbeatOrAlarm[0].stts_gsm
} else {
logDevice.ignition = lastHeartbeatOrAlarm[0].ignition;
logDevice.stts_gps = lastHeartbeatOrAlarm[0].stts_gps;
logDevice.stts_gsm = lastHeartbeatOrAlarm[0].stts_gsm;
logDevice.ignition = lastHeartbeatOrAlarm[0].ignition
logDevice.stts_gps = lastHeartbeatOrAlarm[0].stts_gps
logDevice.stts_gsm = lastHeartbeatOrAlarm[0].stts_gsm
}
if (logDevice.ignition == GpsTracksModels.STTS_IGNITION_HIGH) {
if (logDevice.speed) {
logDevice.stts_engine = GpsTracksModels.STTS_EN_MOVING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_MOVING
} else {
if (lastTrack.length > 0) {
const checkLastHeartbeat = await GpsTracksModels.getLastHeartbeatToDeterminIdling(logDevice.device_id, lastTrack[0].crt, now);
const checkLastHeartbeat = await GpsTracksModels.getLastHeartbeatToDeterminIdling(
logDevice.device_id,
lastTrack[0].crt,
now
)
if (checkLastHeartbeat.length >= 3) {
logDevice.stts_engine = GpsTracksModels.STTS_EN_IDLING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_IDLING
} else {
logDevice.stts_engine = lastTrack[0].stts_engine;
logDevice.stts_engine = lastTrack[0].stts_engine
}
}
}
} else {
logDevice.stts_engine = GpsTracksModels.STTS_EN_STOPING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_STOPING
}
logDevice.stts_oil_electricity = lastHeartbeatOrAlarm[0]?.stts_oil_electricity ?? 0;
logDevice.stts_alarm = lastHeartbeatOrAlarm[0].stts_alarm;
logDevice.stts_charge = lastHeartbeatOrAlarm[0].stts_charge;
logDevice.stts_acc = lastHeartbeatOrAlarm[0].stts_acc;
logDevice.stts_volt = lastHeartbeatOrAlarm[0].stts_volt;
logDevice.stts_switch = lastHeartbeatOrAlarm[0].stts_switch;
logDevice.stts_oil_electricity = lastHeartbeatOrAlarm[0]?.stts_oil_electricity ?? 0
logDevice.stts_alarm = lastHeartbeatOrAlarm[0].stts_alarm
logDevice.stts_charge = lastHeartbeatOrAlarm[0].stts_charge
logDevice.stts_acc = lastHeartbeatOrAlarm[0].stts_acc
logDevice.stts_volt = lastHeartbeatOrAlarm[0].stts_volt
logDevice.stts_switch = lastHeartbeatOrAlarm[0].stts_switch
}
if (["heartbeat"].includes(logDevice.action)) {
if (lastTrack.length > 0) {
logDevice.latitude = lastTrack[0].latitude;
logDevice.longitude = lastTrack[0].longitude;
logDevice.speed = lastTrack[0].speed;
logDevice.orientation = lastTrack[0].orientation;
logDevice.latitude = lastTrack[0].latitude
logDevice.longitude = lastTrack[0].longitude
logDevice.speed = lastTrack[0].speed
logDevice.orientation = lastTrack[0].orientation
if (logDevice.latitude) {
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT;
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT
}
logDevice.length_gps = lastTrack[0].length_gps;
logDevice.pos_stlt_gps = lastTrack[0].pos_stlt_gps;
logDevice.pos_type_gps = lastTrack[0].pos_type_gps;
logDevice.is_pos_gps = lastTrack[0].is_pos_gps;
logDevice.length_gps = lastTrack[0].length_gps
logDevice.pos_stlt_gps = lastTrack[0].pos_stlt_gps
logDevice.pos_type_gps = lastTrack[0].pos_type_gps
logDevice.is_pos_gps = lastTrack[0].is_pos_gps
logDevice.crt = now;
logDevice.crt_format = moment.unix(now).format("YYYY-MM-DD HH:mm:ss");
logDevice.crt_d = now;
logDevice.crt_d_format = moment.unix(now).format("YYYY-MM-DD HH:mm:ss");
logDevice.crt = now
logDevice.crt_format = moment.unix(now).format("YYYY-MM-DD HH:mm:ss")
logDevice.crt_d = now
logDevice.crt_d_format = moment.unix(now).format("YYYY-MM-DD HH:mm:ss")
}
}
// ================= UPDATE SUM MILEAGE DARI t_vehicle ====================
if (logDevice.latitude != null && logDevice.longitude != null && lastTrack.length > 0) {
const distance = LibHelper.haversineGreatCircleDistance(lastTrack[0].latitude, lastTrack[0].longitude, logDevice.latitude, logDevice.longitude, LibHelper.EARTH_RADIUS_KM);
const distance = LibHelper.haversineGreatCircleDistance(
lastTrack[0].latitude,
lastTrack[0].longitude,
logDevice.latitude,
logDevice.longitude,
LibHelper.EARTH_RADIUS_KM
)
const distance_km = LibHelper.kmToKm(distance, 100000000);
const distance_km = LibHelper.kmToKm(distance, 100000000)
if (distance_km >= 3) {
GpsTracksModels.bundleCreate2(logDevice, logDevice);
return false;
GpsTracksModels.bundleCreate2(logDevice, logDevice)
return false
}
logDevice.pre_milleage = distance_km;
logDevice.pre_milleage = distance_km
// 1. Hitung sum_milleage dari log sebelumnya
const logBaseMileage = lastTrack[0]?.sum_milleage ?? 0;
logDevice.sum_milleage = (logBaseMileage + logDevice.pre_milleage).toFixed(8);
const logBaseMileage = lastTrack[0]?.sum_milleage ?? 0
logDevice.sum_milleage = (logBaseMileage + logDevice.pre_milleage).toFixed(8)
// 2. Hitung vhc_milleage dari master vehicle
if (vhc.length > 0) {
const vhcBaseMileage = vhc[0]?.sum_milleage ?? 0;
logDevice.vhc_id = vhc[0]?.vid ?? 0;
logDevice.vhc_milleage = (vhcBaseMileage + logDevice.pre_milleage).toFixed(8);
const vhcBaseMileage = vhc[0]?.sum_milleage ?? 0
logDevice.vhc_id = vhc[0]?.vid ?? 0
logDevice.vhc_milleage = (vhcBaseMileage + logDevice.pre_milleage).toFixed(8)
VhcModels.update(logDevice.vhc_id, {
sum_milleage: logDevice.vhc_milleage,
});
})
}
// 4. Simpan ke DB
GpsTracksModels.bundleCreate2(logDevice, logDevice);
GpsTracksModels.bundleCreate2(logDevice, logDevice)
}
// V1
@ -178,16 +195,16 @@ async function commitMessage(now, logDevice) {
// }
if (logDevice.latitude != null && logDevice.longitude != null) {
const currTrack = await GpsTracksModels.bundleCreate2(logDevice, logDevice);
const currTrack = await GpsTracksModels.bundleCreate2(logDevice, logDevice)
const inCircle = await ZoneModels.getInCircle(logDevice.latitude, logDevice.longitude);
const inShape = await ZoneModels.getInShape(logDevice.latitude, logDevice.longitude);
const insideSpawnZone = [];
const inCircle = await ZoneModels.getInCircle(logDevice.latitude, logDevice.longitude)
const inShape = await ZoneModels.getInShape(logDevice.latitude, logDevice.longitude)
const insideSpawnZone = []
for (let zone of inCircle) {
insideSpawnZone.push(zone);
insideSpawnZone.push(zone)
}
for (let zone of inShape) {
insideSpawnZone.push(zone);
insideSpawnZone.push(zone)
}
/**
@ -202,12 +219,12 @@ async function commitMessage(now, logDevice) {
leave_at_d: 0,
order_by: "ORDER BY id DESC",
limit: 1,
});
})
if (lastSpawn.length > 0) {
let is_leave_zone = 1;
let is_leave_zone = 1
for (const insideZone of insideSpawnZone) {
if (insideZone.zid === lastSpawn[0].zone_id) is_leave_zone = 0;
if (insideZone.zid === lastSpawn[0].zone_id) is_leave_zone = 0
}
if (is_leave_zone === 1 && lastSpawn[0].device_id == logDevice.device_id) {
GpsTracksModels.updt2SpawnZone(
@ -222,7 +239,7 @@ async function commitMessage(now, logDevice) {
updt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
},
lastSpawn[0].id
);
)
}
} else {
for (let zone of insideSpawnZone) {
@ -234,12 +251,16 @@ async function commitMessage(now, logDevice) {
z_workflow_name: zone.workflow_type_name,
shiptocode: zone.shiptocode,
z_fulladdress: zone.fulladdress,
v_nopol: (vhc[0] ? vhc[0].nopol1 : 0 || "") + (vhc[0] ? vhc[0].nopol2 : 0 || "") + (vhc[0] ? vhc[0].nopol3 : 0 || ""),
v_nopol:
(vhc[0] ? vhc[0].nopol1 : 0 || "") +
(vhc[0] ? vhc[0].nopol2 : 0 || "") +
(vhc[0] ? vhc[0].nopol3 : 0 || ""),
da_name: vhc[0] ? vhc[0].da_name : 0 || "",
da_phone: "+" + (vhc[0] ? vhc[0].da_phone_code : 0 || "") + (vhc[0] ? vhc[0].da_phone : 0 || ""),
};
da_phone:
"+" + (vhc[0] ? vhc[0].da_phone_code : 0 || "") + (vhc[0] ? vhc[0].da_phone : 0 || ""),
}
if (logDevice.device_id === "0865784052395871") console.log(1234567890);
if (logDevice.device_id === "0865784052395871") console.log(1234567890)
GpsTracksModels.create2SpawnZone({
device_id: logDevice.device_id,
master_id: Number(currTrack.result.insertId),
@ -255,20 +276,20 @@ async function commitMessage(now, logDevice) {
source: GpsTracksModels.SOURCE_GPS_TRACKER,
crt: now,
crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
});
if (logDevice.device_id === "0865784052395871") console.log("DISINI");
})
if (logDevice.device_id === "0865784052395871") console.log("DISINI")
}
}
} else {
GpsTracksModels.bundleCreate2(logDevice, logDevice);
GpsTracksModels.bundleCreate2(logDevice, logDevice)
}
} catch (e) {
console.error(e);
console.error(e)
}
}
const devices = [];
const netConn = require("./config/netConn");
const devices = []
const netConn = require("./config/netConn")
/**
* uniquely identify a socket with Node.js
* https://stackoverflow.com/questions/6805432/how-to-uniquely-identify-a-socket-with-node-js
@ -278,13 +299,13 @@ net.createServer(
allowHalfOpen: true,
},
function (c) {
c.id = nanoid();
c.id = nanoid()
c.pipe(c);
c.pipe(c)
c.on("data", async (buffer_req) => {
const now = moment().unix();
const me = LibDevice.identifyProtocolFromBuffer(buffer_req);
const now = moment().unix()
const me = LibDevice.identifyProtocolFromBuffer(buffer_req)
const logDevice = {
original_hex: me.ori_string,
@ -320,198 +341,240 @@ net.createServer(
crt_d_format: null,
crt_s: now,
crt_s_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
};
}
if (me.protocol_name == "gt06") {
let dvc_id = devices[c.id];
const act = LibDevice.gt06Action(me, dvc_id || null);
let dvc_id = devices[c.id]
const act = LibDevice.gt06Action(me, dvc_id || null)
if (act.action_type == "login") {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
devices[c.id] = act.device_id;
netConn[act.device_id] = c;
devices[c.id] = act.device_id
netConn[act.device_id] = c
if (typeof act.buffer_resp != "undefined") {
c.write(act.buffer_resp);
c.write(act.buffer_resp)
}
} else if (act.action_type == "location") {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
logDevice.latitude = act.gps_data.latitude || null;
logDevice.longitude = act.gps_data.longitude || null;
logDevice.speed = act.gps_data.speed;
logDevice.orientation = act.gps_data.orientation;
logDevice.latitude = act.gps_data.latitude || null
logDevice.longitude = act.gps_data.longitude || null
logDevice.speed = act.gps_data.speed
logDevice.orientation = act.gps_data.orientation
if (logDevice.latitude) {
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT;
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT
}
logDevice.length_gps = act.gps_data.quantity_pos_satellites_c;
logDevice.pos_stlt_gps = act.gps_data.quantity_pos_satellites_b;
logDevice.pos_type_gps = Number(act.gps_data.realtime_dif_gps) === 0 ? GpsTracksModels.STTS_POS_TYPE_GPS_RLTM : GpsTracksModels.STTS_POS_TYPE_GPS_DIFF;
logDevice.is_pos_gps = Number(act.gps_data.positioning_gps) ? GpsTracksModels.STTS_IS_POS_GPS_HAS : GpsTracksModels.STTS_IS_POS_GPS_NOT;
logDevice.length_gps = act.gps_data.quantity_pos_satellites_c
logDevice.pos_stlt_gps = act.gps_data.quantity_pos_satellites_b
logDevice.pos_type_gps =
Number(act.gps_data.realtime_dif_gps) === 0
? GpsTracksModels.STTS_POS_TYPE_GPS_RLTM
: GpsTracksModels.STTS_POS_TYPE_GPS_DIFF
logDevice.is_pos_gps = Number(act.gps_data.positioning_gps)
? GpsTracksModels.STTS_IS_POS_GPS_HAS
: GpsTracksModels.STTS_IS_POS_GPS_NOT
// logDevice.crt = moment(act.gps_data.date).unix();
// logDevice.crt_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss");
// logDevice.crt_d = moment(act.gps_data.date).unix();
// logDevice.crt_d_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss");
let deviceTime = moment(act.gps_data.date).unix();
let now = moment().unix();
let diff = Math.abs(deviceTime - now);
let deviceTime = moment(act.gps_data.date).unix()
let now = moment().unix()
let diff = Math.abs(deviceTime - now)
// Jika beda waktu terlalu besar (> 300 detik atau 5 menit), pakai waktu server
if (diff > 300) {
console.warn(`[WAKTU TIDAK VALID] Device ${logDevice.device_id} mengirim waktu tidak sinkron, pakai waktu server.`);
deviceTime = now;
console.warn(
`[WAKTU TIDAK VALID] Device ${logDevice.device_id} mengirim waktu tidak sinkron, pakai waktu server.`
)
deviceTime = now
}
logDevice.crt = deviceTime;
logDevice.crt_format = moment.unix(deviceTime).format("YYYY-MM-DD HH:mm:ss");
logDevice.crt_d = deviceTime;
logDevice.crt_d_format = moment.unix(deviceTime).format("YYYY-MM-DD HH:mm:ss");
logDevice.crt_device_raw = moment(act.gps_data.date).unix(); // waktu asli dari device (sebelum validasi)
logDevice.crt = deviceTime
logDevice.crt_format = moment.unix(deviceTime).format("YYYY-MM-DD HH:mm:ss")
logDevice.crt_d = deviceTime
logDevice.crt_d_format = moment.unix(deviceTime).format("YYYY-MM-DD HH:mm:ss")
logDevice.crt_device_raw = moment(act.gps_data.date).unix() // waktu asli dari device (sebelum validasi)
} else if (act.action_type == "heartbeat") {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
logDevice.ignition = Number(act.stts_data.terminal_info.acc) ? GpsTracksModels.STTS_IGNITION_HIGH : GpsTracksModels.STTS_IGNITION_LOW;
logDevice.stts_gps = act.stts_data.terminal_info.gps_tracking ? GpsTracksModels.STTS_GPS_ON : GpsTracksModels.STTS_GPS_OFF;
logDevice.stts_gsm = Number(act.stts_data.gsm_signal_strength) + 1;
logDevice.ignition = Number(act.stts_data.terminal_info.acc)
? GpsTracksModels.STTS_IGNITION_HIGH
: GpsTracksModels.STTS_IGNITION_LOW
logDevice.stts_gps = act.stts_data.terminal_info.gps_tracking
? GpsTracksModels.STTS_GPS_ON
: GpsTracksModels.STTS_GPS_OFF
logDevice.stts_gsm = Number(act.stts_data.gsm_signal_strength) + 1
logDevice.stts_oil_electricity = Number(act.stts_data.terminal_info.oil_electricity) === 0 ? GpsTracksModels.STTS_OIL_ELECTRIC_ON : GpsTracksModels.STTS_OIL_ELECTRIC_OFF;
logDevice.stts_oil_electricity =
Number(act.stts_data.terminal_info.oil_electricity) === 0
? GpsTracksModels.STTS_OIL_ELECTRIC_ON
: GpsTracksModels.STTS_OIL_ELECTRIC_OFF
let stts_alarm = Number(act.stts_data.terminal_info.stts);
let stts_alarm = Number(act.stts_data.terminal_info.stts)
if (stts_alarm == 0) {
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_NORMAL;
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_NORMAL
} else if (stts_alarm == 1) {
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_SHOCK;
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_SHOCK
} else if (stts_alarm == 2) {
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_POWER_CUT;
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_POWER_CUT
} else if (stts_alarm == 3) {
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_LOW_BATTERY;
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_LOW_BATTERY
} else if (stts_alarm == 4) {
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_SOS;
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_SOS
}
logDevice.stts_charge = Number(act.stts_data.terminal_info.charge) ? GpsTracksModels.STTS_CHARGE_ON : GpsTracksModels.STTS_CHARGE_OFF;
logDevice.stts_acc = Number(act.stts_data.terminal_info.acc) ? GpsTracksModels.STTS_ACC_HIGH : GpsTracksModels.STTS_ACC_LOW;
logDevice.stts_switch = Number(act.stts_data.terminal_info.is_active) ? GpsTracksModels.STTS_SWITCH_ON : GpsTracksModels.STTS_SWITCH_OFF;
logDevice.stts_volt = Number(act.stts_data.voltage_level) + 1;
logDevice.stts_charge = Number(act.stts_data.terminal_info.charge)
? GpsTracksModels.STTS_CHARGE_ON
: GpsTracksModels.STTS_CHARGE_OFF
logDevice.stts_acc = Number(act.stts_data.terminal_info.acc)
? GpsTracksModels.STTS_ACC_HIGH
: GpsTracksModels.STTS_ACC_LOW
logDevice.stts_switch = Number(act.stts_data.terminal_info.is_active)
? GpsTracksModels.STTS_SWITCH_ON
: GpsTracksModels.STTS_SWITCH_OFF
logDevice.stts_volt = Number(act.stts_data.voltage_level) + 1
if (typeof act.buffer_resp != "undefined") {
c.write(act.buffer_resp);
c.write(act.buffer_resp)
}
} else if (act.action_type == "alarm") {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
logDevice.latitude = act.gps_data.latitude || null;
logDevice.longitude = act.gps_data.longitude || null;
logDevice.speed = act.gps_data.speed;
logDevice.orientation = act.gps_data.orientation;
logDevice.latitude = act.gps_data.latitude || null
logDevice.longitude = act.gps_data.longitude || null
logDevice.speed = act.gps_data.speed
logDevice.orientation = act.gps_data.orientation
if (logDevice.latitude) {
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT;
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT
}
logDevice.length_gps = act.gps_data.quantity_pos_satellites_c;
logDevice.pos_stlt_gps = act.gps_data.quantity_pos_satellites_b;
logDevice.pos_type_gps = Number(act.gps_data.realtime_dif_gps) === 0 ? GpsTracksModels.STTS_POS_TYPE_GPS_RLTM : GpsTracksModels.STTS_POS_TYPE_GPS_DIFF;
logDevice.is_pos_gps = Number(act.gps_data.positioning_gps) ? GpsTracksModels.STTS_IS_POS_GPS_HAS : GpsTracksModels.STTS_IS_POS_GPS_NOT;
logDevice.length_gps = act.gps_data.quantity_pos_satellites_c
logDevice.pos_stlt_gps = act.gps_data.quantity_pos_satellites_b
logDevice.pos_type_gps =
Number(act.gps_data.realtime_dif_gps) === 0
? GpsTracksModels.STTS_POS_TYPE_GPS_RLTM
: GpsTracksModels.STTS_POS_TYPE_GPS_DIFF
logDevice.is_pos_gps = Number(act.gps_data.positioning_gps)
? GpsTracksModels.STTS_IS_POS_GPS_HAS
: GpsTracksModels.STTS_IS_POS_GPS_NOT
logDevice.ignition = Number(act.stts_data.terminal_info.acc) ? GpsTracksModels.STTS_IGNITION_HIGH : GpsTracksModels.STTS_IGNITION_LOW;
logDevice.stts_gps = act.stts_data.terminal_info.gps_tracking ? GpsTracksModels.STTS_GPS_ON : GpsTracksModels.STTS_GPS_OFF;
logDevice.stts_gsm = Number(act.stts_data.gsm_signal_strength) + 1;
logDevice.ignition = Number(act.stts_data.terminal_info.acc)
? GpsTracksModels.STTS_IGNITION_HIGH
: GpsTracksModels.STTS_IGNITION_LOW
logDevice.stts_gps = act.stts_data.terminal_info.gps_tracking
? GpsTracksModels.STTS_GPS_ON
: GpsTracksModels.STTS_GPS_OFF
logDevice.stts_gsm = Number(act.stts_data.gsm_signal_strength) + 1
logDevice.stts_oil_electricity = Number(act.stts_data.terminal_info.oil_electricity) === 0 ? GpsTracksModels.STTS_OIL_ELECTRIC_ON : GpsTracksModels.STTS_OIL_ELECTRIC_OFF;
logDevice.stts_oil_electricity =
Number(act.stts_data.terminal_info.oil_electricity) === 0
? GpsTracksModels.STTS_OIL_ELECTRIC_ON
: GpsTracksModels.STTS_OIL_ELECTRIC_OFF
let stts_alarm = Number(act.stts_data.terminal_info.stts);
let stts_alarm = Number(act.stts_data.terminal_info.stts)
if (stts_alarm == 0) {
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_NORMAL;
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_NORMAL
} else if (stts_alarm == 1) {
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_SHOCK;
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_SHOCK
} else if (stts_alarm == 2) {
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_POWER_CUT;
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_POWER_CUT
} else if (stts_alarm == 3) {
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_LOW_BATTERY;
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_LOW_BATTERY
} else if (stts_alarm == 4) {
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_SOS;
logDevice.stts_alarm = GpsTracksModels.STTS_ALARM_SOS
}
logDevice.stts_charge = Number(act.stts_data.terminal_info.charge) ? GpsTracksModels.STTS_CHARGE_ON : GpsTracksModels.STTS_CHARGE_OFF;
logDevice.stts_acc = Number(act.stts_data.terminal_info.acc) ? GpsTracksModels.STTS_ACC_HIGH : GpsTracksModels.STTS_ACC_LOW;
logDevice.stts_switch = Number(act.stts_data.terminal_info.is_active) ? GpsTracksModels.STTS_SWITCH_ON : GpsTracksModels.STTS_SWITCH_OFF;
logDevice.stts_volt = Number(act.stts_data.voltage_level) + 1;
logDevice.stts_charge = Number(act.stts_data.terminal_info.charge)
? GpsTracksModels.STTS_CHARGE_ON
: GpsTracksModels.STTS_CHARGE_OFF
logDevice.stts_acc = Number(act.stts_data.terminal_info.acc)
? GpsTracksModels.STTS_ACC_HIGH
: GpsTracksModels.STTS_ACC_LOW
logDevice.stts_switch = Number(act.stts_data.terminal_info.is_active)
? GpsTracksModels.STTS_SWITCH_ON
: GpsTracksModels.STTS_SWITCH_OFF
logDevice.stts_volt = Number(act.stts_data.voltage_level) + 1
logDevice.crt = moment(act.gps_data.date).unix();
logDevice.crt_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss");
logDevice.crt_d = moment(act.gps_data.date).unix();
logDevice.crt_d_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss");
logDevice.crt = moment(act.gps_data.date).unix()
logDevice.crt_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss")
logDevice.crt_d = moment(act.gps_data.date).unix()
logDevice.crt_d_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss")
if (typeof act.buffer_resp != "undefined") {
c.write(act.buffer_resp);
c.write(act.buffer_resp)
}
} else {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
}
}
commitMessage(now, logDevice);
});
c.on("end", () => {});
c.on("close", () => {});
commitMessage(now, logDevice)
})
c.on("end", () => {})
c.on("close", () => {})
c.on("drain", (a) => {
console.log("client drain", a);
});
console.log("client drain", a)
})
c.on("error", (a) => {
console.error("client error", a);
});
console.error("client error", a)
})
c.on("lookup", (a) => {
console.log("client lookup", a);
});
console.log("client lookup", a)
})
c.on("ready", (a) => {
console.log("client ready", a);
});
console.log("client ready", a)
})
c.on("timeout", (a) => {
console.log("client timeout", a);
});
console.log("client timeout", a)
})
c.pipe(c);
c.pipe(c)
}
).listen(process.env.PORT, () => {
console.log("Server gps tracker running at port " + process.env.PORT);
});
console.log("Server gps tracker running at port " + process.env.PORT)
})
app.use(morgan("combined"));
app.use(express.json({ limit: "10mb" }));
app.use(express.urlencoded({ extended: true, limit: "10mb" }));
// ========= server express =========
app.use(morgan("combined"))
app.use(express.json({ limit: "10mb" }))
app.use(express.urlencoded({ extended: true, limit: "10mb" }))
app.use(async function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "OPTIONS,GET,HEAD,PUT,PATCH,POST,DELETE");
res.header("Access-Control-Allow-Headers", "Accept, Authorization, Content-Type, X-Requested-With, Range, x-api-key, x-forwarded-for");
next();
});
res.header("Access-Control-Allow-Origin", "*")
res.header("Access-Control-Allow-Methods", "OPTIONS,GET,HEAD,PUT,PATCH,POST,DELETE")
res.header(
"Access-Control-Allow-Headers",
"Accept, Authorization, Content-Type, X-Requested-With, Range, x-api-key, x-forwarded-for"
)
next()
})
routes.use(app);
listen.use(app)
app.listen(process.env.PORT_EXPRESS, () => {
console.log("Express server running at port " + process.env.PORT_EXPRESS);
});
console.log("Express server running at port " + process.env.PORT_EXPRESS)
})
const udp = dgram.createSocket("udp4");
const udp = dgram.createSocket("udp4")
const devices1 = [];
const devices1 = []
udp.on("message", (msg, rinfo) => {
const buffer_req = Buffer.from(msg, "utf8");
console.log("20203", buffer_req);
console.log("20203", rinfo);
Logger.log("info", buffer_req.toString("hex"));
const buffer_req = Buffer.from(msg, "utf8")
console.log("20203", buffer_req)
console.log("20203", rinfo)
Logger.log("info", buffer_req.toString("hex"))
const now = moment().unix();
const me = LibDevice.identifyProtocolFromBuffer(buffer_req, { isEelinkCustom: 1 });
console.log("port 20203 ", me);
const now = moment().unix()
const me = LibDevice.identifyProtocolFromBuffer(buffer_req, { isEelinkCustom: 1 })
console.log("port 20203 ", me)
const logDevice = {
original_hex: me.ori_buffer,
@ -545,38 +608,38 @@ udp.on("message", (msg, rinfo) => {
crt_d_format: null,
crt_s: now,
crt_s_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
};
}
if (me.protocol_name === "eelinkCustom") {
let dvc_id = devices1[`${rinfo.address}:${rinfo.port}`];
const act = LibDevice.eelinkCustomAction(me, dvc_id || null);
console.log("act 20203", act);
let dvc_id = devices1[`${rinfo.address}:${rinfo.port}`]
const act = LibDevice.eelinkCustomAction(me, dvc_id || null)
console.log("act 20203", act)
if (act.action_type == "exist_data") {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
devices1[`${rinfo.address}:${rinfo.port}`] = act.device_id;
devices1[`${rinfo.address}:${rinfo.port}`] = act.device_id
if (typeof act.buffer_resp != "undefined") {
udp.send(act.buffer_resp, 0, act.buffer_resp.length, rinfo.port, rinfo.address, function (err, bytes) {
if (err) throw err;
console.log("UDP message sent to " + rinfo.address + ":" + rinfo.port);
console.log("20203", bytes);
});
if (err) throw err
console.log("UDP message sent to " + rinfo.address + ":" + rinfo.port)
console.log("20203", bytes)
})
}
}
}
});
})
udp.on("error", (err) => {
console.log(`udp error:\n${err.stack}`);
udp.close();
});
console.log(`udp error:\n${err.stack}`)
udp.close()
})
udp.on("close", function () {
console.log("udp socket is closed !");
});
console.log("udp socket is closed !")
})
udp.on("listening", () => {
const address = udp.address();
console.log(`udp listening ${address.address}:${address.port}`);
});
const address = udp.address()
console.log(`udp listening ${address.address}:${address.port}`)
})
udp.bind(process.env.PORT_UDP);
udp.bind(process.env.PORT_UDP)

View File

@ -1,113 +1,121 @@
const moment = require("moment");
const Validator = require("validatorjs");
const Helper = require("../library/LibHelper");
const response = require("../config/response");
const LibMail = require("../library/LibMail");
const LibDevice = require("../library/LibDevice");
const DanaModels = require("../models/DanaModels");
const GpsTracksModels = require("../models/GpsTracksModels");
const { nanoid } = require("nanoid");
const VhcModels = require("../models/VhcModels");
const ZoneModels = require("../models/ZoneModels");
const LibHelper = require("../library/LibHelper");
const moment = require("moment")
const Validator = require("validatorjs")
const Helper = require("../library/LibHelper")
const response = require("../config/response")
const LibMail = require("../library/LibMail")
const LibDevice = require("../library/LibDevice")
const DanaModels = require("../models/DanaModels")
const GpsTracksModels = require("../models/GpsTracksModels")
const { nanoid } = require("nanoid")
const VhcModels = require("../models/VhcModels")
const ZoneModels = require("../models/ZoneModels")
const LibHelper = require("../library/LibHelper")
Validator.useLang("en");
Validator.useLang("en")
const devices = [];
const devices = []
async function commitMessage(now, logDevice) {
try {
if (!logDevice.original_hex) {
return false;
return false
}
const vhc = await VhcModels.getVhcByDeviceId(logDevice.device_id);
const lastTrack = await GpsTracksModels.get2LastLocByDeviceId(logDevice.device_id);
const vhc = await VhcModels.getVhcByDeviceId(logDevice.device_id)
const lastTrack = await GpsTracksModels.get2LastLocByDeviceId(logDevice.device_id)
if (["heartbeat", "alarm"].includes(logDevice.action)) {
if (logDevice.ignition == GpsTracksModels.STTS_IGNITION_HIGH) {
if (logDevice.speed) {
logDevice.stts_engine = GpsTracksModels.STTS_EN_MOVING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_MOVING
} else {
if (lastTrack.length > 0) {
const checkLastHeartbeat = await GpsTracksModels.getLastHeartbeatToDeterminIdling(logDevice.device_id, lastTrack[0].crt, now);
const checkLastHeartbeat = await GpsTracksModels.getLastHeartbeatToDeterminIdling(
logDevice.device_id,
lastTrack[0].crt,
now
)
if (checkLastHeartbeat.length >= 3) {
logDevice.stts_engine = GpsTracksModels.STTS_EN_IDLING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_IDLING
} else {
logDevice.stts_engine = lastTrack[0].stts_engine;
logDevice.stts_engine = lastTrack[0].stts_engine
}
}
}
} else {
logDevice.stts_engine = GpsTracksModels.STTS_EN_STOPING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_STOPING
}
}
if (["location"].includes(logDevice.action)) {
console.log("logDevice:", logDevice);
// console.log("logDevice:", logDevice)
const lastHeartbeatOrAlarm = await GpsTracksModels.get2LastHeartbeatOrAlarm(logDevice.device_id);
const lastHeartbeatOrAlarm = await GpsTracksModels.get2LastHeartbeatOrAlarm(logDevice.device_id)
if (lastHeartbeatOrAlarm.length > 0) {
logDevice.ignition = lastHeartbeatOrAlarm[0].ignition;
logDevice.stts_gps = lastHeartbeatOrAlarm[0].stts_gps;
logDevice.stts_gsm = lastHeartbeatOrAlarm[0].stts_gsm;
logDevice.stts_oil_electricity = lastHeartbeatOrAlarm[0].stts_oil_electricity;
logDevice.stts_alarm = lastHeartbeatOrAlarm[0].stts_alarm;
logDevice.stts_charge = lastHeartbeatOrAlarm[0].stts_charge;
logDevice.stts_acc = lastHeartbeatOrAlarm[0].stts_acc;
logDevice.stts_volt = lastHeartbeatOrAlarm[0].stts_volt;
logDevice.stts_switch = lastHeartbeatOrAlarm[0].stts_switch;
logDevice.ignition = lastHeartbeatOrAlarm[0].ignition
logDevice.stts_gps = lastHeartbeatOrAlarm[0].stts_gps
logDevice.stts_gsm = lastHeartbeatOrAlarm[0].stts_gsm
logDevice.stts_oil_electricity = lastHeartbeatOrAlarm[0].stts_oil_electricity
logDevice.stts_alarm = lastHeartbeatOrAlarm[0].stts_alarm
logDevice.stts_charge = lastHeartbeatOrAlarm[0].stts_charge
logDevice.stts_acc = lastHeartbeatOrAlarm[0].stts_acc
logDevice.stts_volt = lastHeartbeatOrAlarm[0].stts_volt
logDevice.stts_switch = lastHeartbeatOrAlarm[0].stts_switch
} else {
logDevice.ignition = null;
logDevice.stts_gps = null;
logDevice.stts_gsm = null;
logDevice.stts_oil_electricity = null;
logDevice.stts_alarm = null;
logDevice.stts_charge = null;
logDevice.stts_acc = null;
logDevice.stts_volt = null;
logDevice.stts_switch = null;
logDevice.ignition = logDevice.ignition || 0
logDevice.stts_gps = logDevice.stts_gps || 0
logDevice.stts_gsm = logDevice.stts_gsm || 0
logDevice.stts_oil_electricity = logDevice.stts_oil_electricity || 0
logDevice.stts_alarm = logDevice.stts_alarm || 0
logDevice.stts_charge = logDevice.stts_charge || 0
logDevice.stts_acc = logDevice.stts_acc || 0
logDevice.stts_volt = logDevice.stts_volt || 0
logDevice.stts_switch = logDevice.stts_switch || 0
}
// set engine stts moving,idling,stopped
if (logDevice.ignition == GpsTracksModels.STTS_IGNITION_HIGH) {
if (logDevice.speed) {
logDevice.stts_engine = GpsTracksModels.STTS_EN_MOVING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_MOVING
} else {
if (lastTrack.length > 0) {
const checkLastHeartbeat = await GpsTracksModels.getLastHeartbeatToDeterminIdling(logDevice.device_id, lastTrack[0].crt, now);
const checkLastHeartbeat = await GpsTracksModels.getLastHeartbeatToDeterminIdling(
logDevice.device_id,
lastTrack[0].crt,
now
)
if (checkLastHeartbeat.length >= 3) {
logDevice.stts_engine = GpsTracksModels.STTS_EN_IDLING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_IDLING
} else {
logDevice.stts_engine = lastTrack[0].stts_engine;
logDevice.stts_engine = lastTrack[0].stts_engine
}
}
}
// get stts_alarm, stts_charge, stts_acc, stts_volt, stts_switch
} else {
logDevice.stts_engine = GpsTracksModels.STTS_EN_STOPING;
logDevice.stts_engine = GpsTracksModels.STTS_EN_STOPING
}
logDevice.stts_oil_electricity = lastHeartbeatOrAlarm[0].stts_oil_electricity;
logDevice.stts_alarm = lastHeartbeatOrAlarm[0].stts_alarm;
logDevice.stts_charge = lastHeartbeatOrAlarm[0].stts_charge;
logDevice.stts_acc = lastHeartbeatOrAlarm[0].stts_acc;
logDevice.stts_volt = lastHeartbeatOrAlarm[0].stts_volt;
logDevice.stts_switch = lastHeartbeatOrAlarm[0].stts_switch;
logDevice.stts_oil_electricity = lastHeartbeatOrAlarm[0]?.stts_oil_electricity || 0
logDevice.stts_alarm = lastHeartbeatOrAlarm[0]?.stts_alarm || 0
logDevice.stts_charge = lastHeartbeatOrAlarm[0]?.stts_charge || 0
logDevice.stts_acc = lastHeartbeatOrAlarm[0]?.stts_acc || 0
logDevice.stts_volt = lastHeartbeatOrAlarm[0]?.stts_volt || 0
logDevice.stts_switch = lastHeartbeatOrAlarm[0]?.stts_switch || 0
}
// sekarang heartbeat diinject data lokasi juga dari lokasi terakhir
if (["heartbeat"].includes(logDevice.action)) {
if (lastTrack.length > 0) {
logDevice.latitude = lastTrack[0].latitude;
logDevice.longitude = lastTrack[0].longitude;
logDevice.speed = lastTrack[0].speed;
logDevice.orientation = lastTrack[0].orientation;
logDevice.latitude = lastTrack[0].latitude
logDevice.longitude = lastTrack[0].longitude
logDevice.speed = lastTrack[0].speed
logDevice.orientation = lastTrack[0].orientation
if (logDevice.latitude) {
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT;
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT
}
logDevice.length_gps = lastTrack[0].length_gps;
logDevice.pos_stlt_gps = lastTrack[0].pos_stlt_gps;
logDevice.pos_type_gps = lastTrack[0].pos_type_gps;
logDevice.is_pos_gps = lastTrack[0].is_pos_gps;
logDevice.length_gps = lastTrack[0].length_gps
logDevice.pos_stlt_gps = lastTrack[0].pos_stlt_gps
logDevice.pos_type_gps = lastTrack[0].pos_type_gps
logDevice.is_pos_gps = lastTrack[0].is_pos_gps
// jika gapengen dimunculin di last movement
// logDevice.crt = lastTrack[0].crt;
@ -115,27 +123,33 @@ async function commitMessage(now, logDevice) {
// logDevice.crt_d = lastTrack[0].crt_d;
// logDevice.crt_d_format = lastTrack[0].crt_d_format;
// jika pengen di munculin di last movement
logDevice.crt = now;
logDevice.crt_format = moment.unix(now).format("YYYY-MM-DD HH:mm:ss");
logDevice.crt_d = now;
logDevice.crt_d_format = moment.unix(now).format("YYYY-MM-DD HH:mm:ss");
logDevice.crt = now
logDevice.crt_format = moment.unix(now).format("YYYY-MM-DD HH:mm:ss")
logDevice.crt_d = now
logDevice.crt_d_format = moment.unix(now).format("YYYY-MM-DD HH:mm:ss")
}
}
// count milleage
if (logDevice.latitude != null && logDevice.longitude != null && lastTrack.length > 0) {
const distance = LibHelper.haversineGreatCircleDistance(lastTrack[0].latitude, lastTrack[0].longitude, logDevice.latitude, logDevice.longitude, LibHelper.EARTH_RADIUS_KM);
const distance_km = LibHelper.kmToKm(distance, 100000000);
const distance = LibHelper.haversineGreatCircleDistance(
lastTrack[0].latitude,
lastTrack[0].longitude,
logDevice.latitude,
logDevice.longitude,
LibHelper.EARTH_RADIUS_KM
)
const distance_km = LibHelper.kmToKm(distance, 100000000)
// console.log(`GPS TRACKER UP LOCATION => device_id:${logDevice.device_id} vhc_id:${(vhc[0]) ? vhc[0].vid : 0}, distance_km:${distance_km}`);
// validasi jika lebih dari 3km, ga disimpan
if (distance_km >= 3) {
GpsTracksModels.bundleCreate2(logDevice, logDevice); // jika tidak disimpan malah jadi bug, jadi akan update lokasi terus dengan kalkulasi jarak sebelumnya jadi makan lama makin lebar, mending disimpen terus milleagenya jadi 0 aja
return false;
GpsTracksModels.bundleCreate2(logDevice, logDevice) // jika tidak disimpan malah jadi bug, jadi akan update lokasi terus dengan kalkulasi jarak sebelumnya jadi makan lama makin lebar, mending disimpen terus milleagenya jadi 0 aja
return false
}
logDevice.pre_milleage = distance_km;
logDevice.sum_milleage = (lastTrack[0].sum_milleage + logDevice.pre_milleage).toFixed(8);
logDevice.pre_milleage = distance_km
logDevice.sum_milleage = (lastTrack[0].sum_milleage + logDevice.pre_milleage).toFixed(8)
if (vhc.length > 0) {
logDevice.vhc_id = vhc[0] ? vhc[0].vid : 0;
logDevice.vhc_id = vhc[0] ? vhc[0].vid : 0
// if (lastTrack[0].vhc_id == logDevice.vhc_id) {
// logDevice.vhc_milleage = (lastTrack[0].vhc_milleage + logDevice.pre_milleage).toFixed(8);
// } else {
@ -147,9 +161,9 @@ async function commitMessage(now, logDevice) {
// logDevice.vhc_milleage = ((vhc[0] ? vhc[0].sum_milleage : 0) + logDevice.pre_milleage).toFixed(8);
// }
// force mileage dari vechile
logDevice.vhc_milleage = ((vhc[0]?.sum_milleage || 0) + logDevice.pre_milleage).toFixed(8);
logDevice.vhc_milleage = ((vhc[0]?.sum_milleage || 0) + logDevice.pre_milleage).toFixed(8)
VhcModels.update(vhc[0] ? vhc[0].vid : 0, { sum_milleage: logDevice.vhc_milleage });
VhcModels.update(vhc[0] ? vhc[0].vid : 0, { sum_milleage: logDevice.vhc_milleage })
}
}
@ -157,16 +171,16 @@ async function commitMessage(now, logDevice) {
if (logDevice.latitude != null && logDevice.longitude != null) {
// && vhc.length > 0
// log tracking
const currTrack = await GpsTracksModels.bundleCreate2(logDevice, logDevice);
const currTrack = await GpsTracksModels.bundleCreate2(logDevice, logDevice)
// console.log('GT06 HAS LOCATION AND CHECK ZONE');
const inCircle = await ZoneModels.getInCircle(logDevice.latitude, logDevice.longitude);
const inShape = await ZoneModels.getInShape(logDevice.latitude, logDevice.longitude);
const insideSpawnZone = [];
const inCircle = await ZoneModels.getInCircle(logDevice.latitude, logDevice.longitude)
const inShape = await ZoneModels.getInShape(logDevice.latitude, logDevice.longitude)
const insideSpawnZone = []
for (let zone of inCircle) {
insideSpawnZone.push(zone);
insideSpawnZone.push(zone)
}
for (let zone of inShape) {
insideSpawnZone.push(zone);
insideSpawnZone.push(zone)
}
/**
@ -181,12 +195,12 @@ async function commitMessage(now, logDevice) {
leave_at_d: 0,
order_by: "ORDER BY id DESC",
limit: 1,
});
})
if (lastSpawn.length > 0) {
let is_leave_zone = 1;
let is_leave_zone = 1
for (const insideZone of insideSpawnZone) {
if (insideZone.zid === lastSpawn[0].zone_id) is_leave_zone = 0;
if (insideZone.zid === lastSpawn[0].zone_id) is_leave_zone = 0
}
if (is_leave_zone === 1 && lastSpawn[0].device_id == logDevice.device_id) {
GpsTracksModels.updt2SpawnZone(
@ -201,7 +215,7 @@ async function commitMessage(now, logDevice) {
updt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
},
lastSpawn[0].id
);
)
}
} else {
for (let zone of insideSpawnZone) {
@ -213,13 +227,17 @@ async function commitMessage(now, logDevice) {
z_workflow_name: zone.workflow_type_name,
shiptocode: zone.shiptocode,
z_fulladdress: zone.fulladdress,
v_nopol: (vhc[0] ? vhc[0].nopol1 : 0 || "") + (vhc[0] ? vhc[0].nopol2 : 0 || "") + (vhc[0] ? vhc[0].nopol3 : 0 || ""),
v_nopol:
(vhc[0] ? vhc[0].nopol1 : 0 || "") +
(vhc[0] ? vhc[0].nopol2 : 0 || "") +
(vhc[0] ? vhc[0].nopol3 : 0 || ""),
da_name: vhc[0] ? vhc[0].da_name : 0 || "",
da_phone: "+" + (vhc[0] ? vhc[0].da_phone_code : 0 || "") + (vhc[0] ? vhc[0].da_phone : 0 || ""),
};
da_phone:
"+" + (vhc[0] ? vhc[0].da_phone_code : 0 || "") + (vhc[0] ? vhc[0].da_phone : 0 || ""),
}
// LibMail.sendVhcSpawnZoneMail(`${(vhc[0]) ? vhc[0].nopol1 : 0 || ''}${(vhc[0]) ? vhc[0].nopol2 : 0 || ''}${(vhc[0]) ? vhc[0].nopol3 : 0 || ''} entering zone ${mailData.z_name}`, mailData.pic_mail, mailData);
if (logDevice.device_id === "0865784052395871") console.log(1234567890);
if (logDevice.device_id === "0865784052395871") console.log(1234567890)
GpsTracksModels.create2SpawnZone({
device_id: logDevice.device_id,
master_id: Number(currTrack.result.insertId),
@ -235,27 +253,27 @@ async function commitMessage(now, logDevice) {
source: GpsTracksModels.SOURCE_GPS_TRACKER,
crt: now,
crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
});
if (logDevice.device_id === "0865784052395871") console.log("DISINI");
})
if (logDevice.device_id === "0865784052395871") console.log("DISINI")
}
}
} else {
// log tracking
GpsTracksModels.bundleCreate2(logDevice, logDevice);
GpsTracksModels.bundleCreate2(logDevice, logDevice)
}
} catch (e) {
console.error(e);
console.error(e)
}
}
class ListenController {
async gps(req, res) {
let apiRes = {};
let apiRes = {}
try {
const c = { id: req.body._id };
let buffer_req = Buffer.from(req.body.data, "base64");
const now = moment().unix();
const me = LibDevice.identifyProtocolFromBuffer(buffer_req);
const c = { id: req.body._id }
let buffer_req = Buffer.from(req.body.data, "base64")
const now = moment().unix()
const me = LibDevice.identifyProtocolFromBuffer(buffer_req)
const logDevice = {
original_hex: me.ori_string,
@ -291,100 +309,228 @@ class ListenController {
crt_d_format: null,
crt_s: now,
crt_s_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
};
}
if (me.protocol_name == "gt06") {
let dvc_id = devices[c.id];
const act = LibDevice.gt06Action(me, dvc_id || null);
let dvc_id = devices[c.id]
const act = LibDevice.gt06Action(me, dvc_id || null)
if (act.action_type == "login") {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
devices[c.id] = act.device_id;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
devices[c.id] = act.device_id
} else if (act.action_type == "location") {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
logDevice.latitude = act.gps_data.latitude || null;
logDevice.longitude = act.gps_data.longitude || null;
logDevice.speed = act.gps_data.speed;
logDevice.orientation = act.gps_data.orientation;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
logDevice.latitude = act.gps_data.latitude || null
logDevice.longitude = act.gps_data.longitude || null
logDevice.speed = act.gps_data.speed
logDevice.orientation = act.gps_data.orientation
if (logDevice.latitude) {
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT;
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT
}
logDevice.length_gps = act.gps_data.quantity_pos_satellites_c;
logDevice.pos_stlt_gps = act.gps_data.quantity_pos_satellites_b;
logDevice.pos_type_gps = Number(act.gps_data.realtime_dif_gps) === 0 ? GpsTracksModels.STTS_POS_TYPE_GPS_RLTM : GpsTracksModels.STTS_POS_TYPE_GPS_DIFF;
logDevice.is_pos_gps = Number(act.gps_data.positioning_gps) ? GpsTracksModels.STTS_IS_POS_GPS_HAS : GpsTracksModels.STTS_IS_POS_GPS_NOT;
logDevice.crt = moment(act.gps_data.date).unix();
logDevice.crt_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss");
logDevice.crt_d = moment(act.gps_data.date).unix();
logDevice.crt_d_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss");
logDevice.length_gps = act.gps_data.quantity_pos_satellites_c
logDevice.pos_stlt_gps = act.gps_data.quantity_pos_satellites_b
logDevice.pos_type_gps =
Number(act.gps_data.realtime_dif_gps) === 0
? GpsTracksModels.STTS_POS_TYPE_GPS_RLTM
: GpsTracksModels.STTS_POS_TYPE_GPS_DIFF
logDevice.is_pos_gps = Number(act.gps_data.positioning_gps)
? GpsTracksModels.STTS_IS_POS_GPS_HAS
: GpsTracksModels.STTS_IS_POS_GPS_NOT
logDevice.crt = moment(act.gps_data.date).unix()
logDevice.crt_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss")
logDevice.crt_d = moment(act.gps_data.date).unix()
logDevice.crt_d_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss")
} else if (act.action_type == "heartbeat") {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
logDevice.ignition = Number(act.stts_data.terminal_info.acc) ? GpsTracksModels.STTS_IGNITION_HIGH : GpsTracksModels.STTS_IGNITION_LOW;
logDevice.stts_gps = act.stts_data.terminal_info.gps_tracking ? GpsTracksModels.STTS_GPS_ON : GpsTracksModels.STTS_GPS_OFF;
logDevice.stts_gsm = Number(act.stts_data.gsm_signal_strength) + 1;
logDevice.stts_oil_electricity = Number(act.stts_data.terminal_info.oil_electricity) === 0 ? GpsTracksModels.STTS_OIL_ELECTRIC_ON : GpsTracksModels.STTS_OIL_ELECTRIC_OFF;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
logDevice.ignition = Number(act.stts_data.terminal_info.acc)
? GpsTracksModels.STTS_IGNITION_HIGH
: GpsTracksModels.STTS_IGNITION_LOW
logDevice.stts_gps = act.stts_data.terminal_info.gps_tracking
? GpsTracksModels.STTS_GPS_ON
: GpsTracksModels.STTS_GPS_OFF
logDevice.stts_gsm = Number(act.stts_data.gsm_signal_strength) + 1
logDevice.stts_oil_electricity =
Number(act.stts_data.terminal_info.oil_electricity) === 0
? GpsTracksModels.STTS_OIL_ELECTRIC_ON
: GpsTracksModels.STTS_OIL_ELECTRIC_OFF
let stts_alarm = Number(act.stts_data.terminal_info.stts);
logDevice.stts_alarm = stts_alarm === 1 ? GpsTracksModels.STTS_ALARM_SHOCK : stts_alarm === 2 ? GpsTracksModels.STTS_ALARM_POWER_CUT : stts_alarm === 3 ? GpsTracksModels.STTS_ALARM_LOW_BATTERY : stts_alarm === 4 ? GpsTracksModels.STTS_ALARM_SOS : GpsTracksModels.STTS_ALARM_NORMAL;
let stts_alarm = Number(act.stts_data.terminal_info.stts)
logDevice.stts_alarm =
stts_alarm === 1
? GpsTracksModels.STTS_ALARM_SHOCK
: stts_alarm === 2
? GpsTracksModels.STTS_ALARM_POWER_CUT
: stts_alarm === 3
? GpsTracksModels.STTS_ALARM_LOW_BATTERY
: stts_alarm === 4
? GpsTracksModels.STTS_ALARM_SOS
: GpsTracksModels.STTS_ALARM_NORMAL
logDevice.stts_charge = Number(act.stts_data.terminal_info.charge) ? GpsTracksModels.STTS_CHARGE_ON : GpsTracksModels.STTS_CHARGE_OFF;
logDevice.stts_acc = Number(act.stts_data.terminal_info.acc) ? GpsTracksModels.STTS_ACC_HIGH : GpsTracksModels.STTS_ACC_LOW;
logDevice.stts_switch = Number(act.stts_data.terminal_info.is_active) ? GpsTracksModels.STTS_SWITCH_ON : GpsTracksModels.STTS_SWITCH_OFF;
logDevice.stts_volt = Number(act.stts_data.voltage_level) + 1;
logDevice.stts_charge = Number(act.stts_data.terminal_info.charge)
? GpsTracksModels.STTS_CHARGE_ON
: GpsTracksModels.STTS_CHARGE_OFF
logDevice.stts_acc = Number(act.stts_data.terminal_info.acc)
? GpsTracksModels.STTS_ACC_HIGH
: GpsTracksModels.STTS_ACC_LOW
logDevice.stts_switch = Number(act.stts_data.terminal_info.is_active)
? GpsTracksModels.STTS_SWITCH_ON
: GpsTracksModels.STTS_SWITCH_OFF
logDevice.stts_volt = Number(act.stts_data.voltage_level) + 1
} else if (act.action_type == "alarm") {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
logDevice.latitude = act.gps_data.latitude || null;
logDevice.longitude = act.gps_data.longitude || null;
logDevice.speed = act.gps_data.speed;
logDevice.orientation = act.gps_data.orientation;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
logDevice.latitude = act.gps_data.latitude || null
logDevice.longitude = act.gps_data.longitude || null
logDevice.speed = act.gps_data.speed
logDevice.orientation = act.gps_data.orientation
if (logDevice.latitude) {
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT;
logDevice.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_NOT
}
logDevice.length_gps = act.gps_data.quantity_pos_satellites_c;
logDevice.pos_stlt_gps = act.gps_data.quantity_pos_satellites_b;
logDevice.pos_type_gps = Number(act.gps_data.realtime_dif_gps) === 0 ? GpsTracksModels.STTS_POS_TYPE_GPS_RLTM : GpsTracksModels.STTS_POS_TYPE_GPS_DIFF;
logDevice.is_pos_gps = Number(act.gps_data.positioning_gps) ? GpsTracksModels.STTS_IS_POS_GPS_HAS : GpsTracksModels.STTS_IS_POS_GPS_NOT;
logDevice.ignition = Number(act.stts_data.terminal_info.acc) ? GpsTracksModels.STTS_IGNITION_HIGH : GpsTracksModels.STTS_IGNITION_LOW;
logDevice.stts_gps = act.stts_data.terminal_info.gps_tracking ? GpsTracksModels.STTS_GPS_ON : GpsTracksModels.STTS_GPS_OFF;
logDevice.stts_gsm = Number(act.stts_data.gsm_signal_strength) + 1;
logDevice.stts_oil_electricity = Number(act.stts_data.terminal_info.oil_electricity) === 0 ? GpsTracksModels.STTS_OIL_ELECTRIC_ON : GpsTracksModels.STTS_OIL_ELECTRIC_OFF;
logDevice.length_gps = act.gps_data.quantity_pos_satellites_c
logDevice.pos_stlt_gps = act.gps_data.quantity_pos_satellites_b
logDevice.pos_type_gps =
Number(act.gps_data.realtime_dif_gps) === 0
? GpsTracksModels.STTS_POS_TYPE_GPS_RLTM
: GpsTracksModels.STTS_POS_TYPE_GPS_DIFF
logDevice.is_pos_gps = Number(act.gps_data.positioning_gps)
? GpsTracksModels.STTS_IS_POS_GPS_HAS
: GpsTracksModels.STTS_IS_POS_GPS_NOT
logDevice.ignition = Number(act.stts_data.terminal_info.acc)
? GpsTracksModels.STTS_IGNITION_HIGH
: GpsTracksModels.STTS_IGNITION_LOW
logDevice.stts_gps = act.stts_data.terminal_info.gps_tracking
? GpsTracksModels.STTS_GPS_ON
: GpsTracksModels.STTS_GPS_OFF
logDevice.stts_gsm = Number(act.stts_data.gsm_signal_strength) + 1
logDevice.stts_oil_electricity =
Number(act.stts_data.terminal_info.oil_electricity) === 0
? GpsTracksModels.STTS_OIL_ELECTRIC_ON
: GpsTracksModels.STTS_OIL_ELECTRIC_OFF
let stts_alarm = Number(act.stts_data.terminal_info.stts);
logDevice.stts_alarm = stts_alarm === 1 ? GpsTracksModels.STTS_ALARM_SHOCK : stts_alarm === 2 ? GpsTracksModels.STTS_ALARM_POWER_CUT : stts_alarm === 3 ? GpsTracksModels.STTS_ALARM_LOW_BATTERY : stts_alarm === 4 ? GpsTracksModels.STTS_ALARM_SOS : GpsTracksModels.STTS_ALARM_NORMAL;
let stts_alarm = Number(act.stts_data.terminal_info.stts)
logDevice.stts_alarm =
stts_alarm === 1
? GpsTracksModels.STTS_ALARM_SHOCK
: stts_alarm === 2
? GpsTracksModels.STTS_ALARM_POWER_CUT
: stts_alarm === 3
? GpsTracksModels.STTS_ALARM_LOW_BATTERY
: stts_alarm === 4
? GpsTracksModels.STTS_ALARM_SOS
: GpsTracksModels.STTS_ALARM_NORMAL
logDevice.stts_charge = Number(act.stts_data.terminal_info.charge) ? GpsTracksModels.STTS_CHARGE_ON : GpsTracksModels.STTS_CHARGE_OFF;
logDevice.stts_acc = Number(act.stts_data.terminal_info.acc) ? GpsTracksModels.STTS_ACC_HIGH : GpsTracksModels.STTS_ACC_LOW;
logDevice.stts_switch = Number(act.stts_data.terminal_info.is_active) ? GpsTracksModels.STTS_SWITCH_ON : GpsTracksModels.STTS_SWITCH_OFF;
logDevice.stts_volt = Number(act.stts_data.voltage_level) + 1;
logDevice.crt = moment(act.gps_data.date).unix();
logDevice.crt_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss");
logDevice.crt_d = moment(act.gps_data.date).unix();
logDevice.crt_d_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss");
logDevice.stts_charge = Number(act.stts_data.terminal_info.charge)
? GpsTracksModels.STTS_CHARGE_ON
: GpsTracksModels.STTS_CHARGE_OFF
logDevice.stts_acc = Number(act.stts_data.terminal_info.acc)
? GpsTracksModels.STTS_ACC_HIGH
: GpsTracksModels.STTS_ACC_LOW
logDevice.stts_switch = Number(act.stts_data.terminal_info.is_active)
? GpsTracksModels.STTS_SWITCH_ON
: GpsTracksModels.STTS_SWITCH_OFF
logDevice.stts_volt = Number(act.stts_data.voltage_level) + 1
logDevice.crt = moment(act.gps_data.date).unix()
logDevice.crt_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss")
logDevice.crt_d = moment(act.gps_data.date).unix()
logDevice.crt_d_format = moment(act.gps_data.date).format("YYYY-MM-DD HH:mm:ss")
} else {
logDevice.action = act.action_type;
logDevice.device_id = act.device_id;
logDevice.action = act.action_type
logDevice.device_id = act.device_id
}
}
await commitMessage(now, logDevice);
await commitMessage(now, logDevice)
apiRes = JSON.parse(JSON.stringify(response[200]));
apiRes.meta.message = "success";
apiRes.data = logDevice;
return res.status(200).json(apiRes);
apiRes = JSON.parse(JSON.stringify(response[200]))
apiRes.meta.message = "success"
apiRes.data = logDevice
return res.status(200).json(apiRes)
} catch (e) {
console.log("error", e);
apiRes = JSON.parse(JSON.stringify(response[500]));
apiRes.meta.message += Helper.setErrMsg(": " + e.message);
return res.status(500).json(apiRes);
console.log("error", e)
apiRes = JSON.parse(JSON.stringify(response[500]))
apiRes.meta.message += Helper.setErrMsg(": " + e.message)
return res.status(500).json(apiRes)
}
}
async teltonika(req, res) {
let apiRes = {}
try {
const imei = req.body.imei.toString().padStart(16, "0")
const records = req.body.records
// for (const rec of records) {
// console.log(
// `→ ${rec.timestamp} ${imei} | GNSS: ${JSON.stringify(rec.gnss)} || IO: ${JSON.stringify(rec.io)}`
// )
// }
// -- Commit each record to DB --
// records.forEach(async (rec) => {
for (const rec of records) {
// console.log("rec ====> ", rec)
const now = moment().unix()
const logDevice = {
original_hex: "0xTELTONIKA",
protocol: "teltonika8e",
action: "location",
device_id: imei,
latitude: rec.gnss.latitude || null,
longitude: rec.gnss.longitude || null,
speed: rec.gnss.speed || 0,
orientation: rec.gnss.angle || 0,
ignition: rec.io.Ignition ? GpsTracksModels.STTS_IGNITION_HIGH : GpsTracksModels.STTS_IGNITION_LOW,
stts_engine: 0,
stts_gps: rec.gnss.satellites || 0,
length_gps: 0,
pos_stlt_gps: 0,
pos_type_gps: 0,
is_pos_gps: 0,
stts_gsm: 0,
stts_oil_electricity: 0,
stts_alarm: 0,
stts_charge: 0,
stts_acc: 0,
stts_volt: 0,
stts_switch: 0,
stts_reverse_geo: 0,
pre_milleage: 0,
source: GpsTracksModels.SOURCE_GPS_TRACKER,
vhc_id: 0,
drv_id: 0,
drv_milleage: rec.io["Trip Odometer"] || 0,
crt: now,
crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
crt_d: rec.gnss.timestamp / 1000,
crt_d_format: moment.unix(rec.gnss.timestamp / 1000).format("YYYY-MM-DD HH:mm:ss"),
crt_s: now,
crt_s_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
fuel_curr: rec.io["Fuel Level"] || 0,
fuel_count: rec.io["Fuel Consumed (counted)"] || 0,
}
await commitMessage(now, logDevice)
}
// IO: {"Ignition":0,"Movement":1,"GSM Signal":5,"Sleep Mode":0,"GNSS Status":1,"Accelerator Pedal Position":0,"External Voltage":13087,"Battery Voltage":4100,"Fuel Level":144,"Engine RPM":0,"Engine Temperature":950,"Trip Odometer":48250,"Total Odometer":288320,"Total Mileage":125662000,"Fuel Consumed (counted)":229}
apiRes = JSON.parse(JSON.stringify(response[200]))
apiRes.meta.message = "success"
// apiRes.data = "logDevice"
return res.status(200).json(apiRes)
} catch (err) {
console.error("❌ error:", err.message)
apiRes = JSON.parse(JSON.stringify(response[500]))
apiRes.meta.message += Helper.setErrMsg(": " + err.message)
return res.status(500).json(apiRes)
}
}
}
const object = new ListenController();
const object = new ListenController()
module.exports = object;
module.exports = object

View File

@ -41,7 +41,7 @@ async function job() {
id bigint NOT NULL AUTO_INCREMENT,
original_hex text,
protocol enum('gt06','tk119','smartphone') DEFAULT NULL,
action enum('login','heartbeat','location','alarm','other') DEFAULT NULL,
action enum('login','heartbeat','location','alarm','other','teltonika8e') DEFAULT NULL,
device_id varchar(16) DEFAULT NULL,
latitude double DEFAULT NULL,
longitude double DEFAULT NULL,
@ -66,6 +66,8 @@ async function job() {
sum_milleage double NOT NULL DEFAULT '0' COMMENT 'in km. summary device milleage. calculated based on this device',
vhc_milleage double NOT NULL DEFAULT '0' COMMENT 'in km. summary vhc milleage. calculated based on vhc, every change vhc this will get last milleage on that vhc',
drv_milleage double NOT NULL DEFAULT '0' COMMENT 'in km. summary drv milleage. calculated based on drv, every change drv this will get last milleage on that drv',
fuel_curr INT UNSIGNED DEFAULT 0,
fuel_count INT UNSIGNED DEFAULT 0,
vhc_id int NOT NULL DEFAULT '0',
drv_id int NOT NULL DEFAULT '0',
source int NOT NULL DEFAULT '1' COMMENT '1=>gps_tracker, 2=>smartphone',

View File

@ -1,97 +1,741 @@
class LibHelper {
static EARTH_RADIUS_M = 6371000
static EARTH_RADIUS_KM = 6371
static EARTH_RADIUS_MILES = 3959 // 3958.756 || 3959 || 3963
static EARTH_RADIUS_M = 6371000;
static EARTH_RADIUS_KM = 6371;
static EARTH_RADIUS_MILES = 3959; // 3958.756 || 3959 || 3963
static setErrMsg(msg) {
if (process.env.NODE_ENV == "development") {
return msg
}
return ""
}
static setErrMsg(msg) {
if (process.env.NODE_ENV == 'development') {
return msg;
}
return '';
}
/**
* Calculates the great-circle distance between two points, with
* the Haversine formula.
* @param float latitudeFrom Latitude of start point in [deg decimal]
* @param float longitudeFrom Longitude of start point in [deg decimal]
* @param float latitudeTo Latitude of target point in [deg decimal]
* @param float longitudeTo Longitude of target point in [deg decimal]
* @param float earthRadius Mean earth radius in [m]
* @return float Distance between points in [m] (same as earthRadius)
* reference: https://stackoverflow.com/questions/14750275/haversine-formula-with-php
* tolak ukur: tarik garis lurus
* more accurate using km/meters than miles i think ~ rafifmulia
*/
static haversineGreatCircleDistance(latFrom, lngFrom, latTo, lngTo, earthRadius = LibHelper.EARTH_RADIUS_M) {
// convert from degrees to radians
let latFromRads = LibHelper.degsToRads(latFrom)
let lngFromRads = LibHelper.degsToRads(lngFrom)
let latToRads = LibHelper.degsToRads(latTo)
let lngToRads = LibHelper.degsToRads(lngTo)
/**
* Calculates the great-circle distance between two points, with
* the Haversine formula.
* @param float latitudeFrom Latitude of start point in [deg decimal]
* @param float longitudeFrom Longitude of start point in [deg decimal]
* @param float latitudeTo Latitude of target point in [deg decimal]
* @param float longitudeTo Longitude of target point in [deg decimal]
* @param float earthRadius Mean earth radius in [m]
* @return float Distance between points in [m] (same as earthRadius)
* reference: https://stackoverflow.com/questions/14750275/haversine-formula-with-php
* tolak ukur: tarik garis lurus
* more accurate using km/meters than miles i think ~ rafifmulia
*/
static haversineGreatCircleDistance(latFrom, lngFrom, latTo, lngTo, earthRadius = LibHelper.EARTH_RADIUS_M) {
// convert from degrees to radians
let latFromRads = LibHelper.degsToRads(latFrom);
let lngFromRads = LibHelper.degsToRads(lngFrom);
let latToRads = LibHelper.degsToRads(latTo);
let lngToRads = LibHelper.degsToRads(lngTo);
let latDelta = latToRads - latFromRads
let lngDelta = lngToRads - lngFromRads
let latDelta = latToRads - latFromRads;
let lngDelta = lngToRads - lngFromRads;
let angle =
2 *
Math.asin(
Math.sqrt(
Math.pow(Math.sin(latDelta / 2), 2) +
Math.cos(latFromRads) * Math.cos(latToRads) * Math.pow(Math.sin(lngDelta / 2), 2)
)
)
let distance = angle * earthRadius
let angle = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(latDelta / 2), 2) + Math.cos(latFromRads) * Math.cos(latToRads) * Math.pow(Math.sin(lngDelta / 2), 2)));
let distance = angle * earthRadius;
return distance
}
return distance;
}
// reference: https://www.codegrepper.com/code-examples/javascript/deg2rad+javascript
// degrees to radians
static degsToRads(deg) {
return (deg * Math.PI) / 180.0
}
// radians to degrees
static radsToDegs(rad) {
return (rad * 180.0) / Math.PI
}
// reference: https://www.codegrepper.com/code-examples/javascript/deg2rad+javascript
// degrees to radians
static degsToRads(deg) {
return (deg * Math.PI) / 180.0;
}
// radians to degrees
static radsToDegs(rad) {
return rad * 180.0 / Math.PI;
}
// round up with precisions digits => 4 == (10000)
// reference: https://stackoverflow.com/questions/11832914/how-to-round-to-at-most-2-decimal-places-if-necessary
static milesToKm(miles, precisionDigits = 10000) {
return Math.round((miles * 1.609 + Number.EPSILON) * precisionDigits) / precisionDigits
}
static milesToMeters(miles, precisionDigits = 10000) {
return Math.round((miles * 1609 + Number.EPSILON) * precisionDigits) / precisionDigits
}
static milesToMiles(meters, precisionDigits = 10000) {
return Math.round((meters + Number.EPSILON) * precisionDigits) / precisionDigits
}
static kmToMiles(km, precisionDigits = 10000) {
return Math.round((km / 1.609 + Number.EPSILON) * precisionDigits) / precisionDigits
}
static kmToMeters(km, precisionDigits = 10000) {
return Math.round((km * 1000 + Number.EPSILON) * precisionDigits) / precisionDigits
}
static kmToKm(meters, precisionDigits = 10000) {
return Math.round((meters + Number.EPSILON) * precisionDigits) / precisionDigits
}
static metersToKm(meters, precisionDigits = 10000) {
return Math.round((meters / 1000 + Number.EPSILON) * precisionDigits) / precisionDigits
}
static metersToMiles(meters, precisionDigits = 10000) {
return Math.round((meters / 1609 + Number.EPSILON) * precisionDigits) / precisionDigits
}
static metersToMeters(meters, precisionDigits = 10000) {
return Math.round((meters + Number.EPSILON) * precisionDigits) / precisionDigits
}
// round up with precisions digits => 4 == (10000)
// reference: https://stackoverflow.com/questions/11832914/how-to-round-to-at-most-2-decimal-places-if-necessary
static milesToKm(miles, precisionDigits = 10000) {
return Math.round(((miles * 1.609) + Number.EPSILON) * precisionDigits) / precisionDigits;
}
static milesToMeters(miles, precisionDigits = 10000) {
return Math.round(((miles * 1609) + Number.EPSILON) * precisionDigits) / precisionDigits;
}
static milesToMiles(meters, precisionDigits = 10000) {
return Math.round(((meters) + Number.EPSILON) * precisionDigits) / precisionDigits;
}
static kmToMiles(km, precisionDigits = 10000) {
return Math.round(((km / 1.609) + Number.EPSILON) * precisionDigits) / precisionDigits;
}
static kmToMeters(km, precisionDigits = 10000) {
return Math.round(((km * 1000) + Number.EPSILON) * precisionDigits) / precisionDigits;
}
static kmToKm(meters, precisionDigits = 10000) {
return Math.round(((meters) + Number.EPSILON) * precisionDigits) / precisionDigits;
}
static metersToKm(meters, precisionDigits = 10000) {
return Math.round(((meters / 1000) + Number.EPSILON) * precisionDigits) / precisionDigits;
}
static metersToMiles(meters, precisionDigits = 10000) {
return Math.round(((meters / 1609) + Number.EPSILON) * precisionDigits) / precisionDigits;
}
static metersToMeters(meters, precisionDigits = 10000) {
return Math.round(((meters) + Number.EPSILON) * precisionDigits) / precisionDigits;
}
static hex2bin(hex) {
return ("00000000" + parseInt(hex, 16).toString(2)).slice(-8)
}
static hex2bin(hex) {
return ("00000000" + (parseInt(hex, 16)).toString(2)).slice(-8);
}
static splitEvery4Char(str) {
if (str) {
str = "" + str
let splitEvery4Char = str.match(/.{1,4}/g)
return splitEvery4Char.join(" ")
}
return ""
}
static splitEvery4Char(str) {
if (str) {
str = '' + str;
let splitEvery4Char = str.match(/.{1,4}/g)
return splitEvery4Char.join(' ')
}
return '';
}
};
static ioID() {
return {
1: "Digital Input 1",
2: "Digital Input 2",
3: "Digital Input 3",
4: "Pulse Counter Din1",
5: "Pulse Counter Din2",
6: "Analog Input 2",
9: "Analog Input 1",
10: "SD Status",
11: "ICCID1",
12: "Fuel Used GPS",
13: "Fuel Rate GPS",
15: "Eco Score",
16: "Total Odometer",
17: "Axis X",
18: "Axis Y",
19: "Axis Z",
21: "GSM Signal",
24: "Speed",
66: "External Voltage",
67: "Battery Voltage",
68: "Battery Current",
69: "GNSS Status",
71: "Dallas Temperature ID 4",
72: "Dallas Temperature 1",
73: "Dallas Temperature 2",
74: "Dallas Temperature 3",
75: "Dallas Temperature 4",
76: "Dallas Temperature ID 1",
77: "Dallas Temperature ID 2",
78: "iButton",
79: "Dallas Temperature ID 3",
80: "Data Mode",
113: "Battery Level",
179: "Digital Output 1",
180: "Digital Output 2",
181: "GNSS PDOP",
182: "GNSS HDOP",
199: "Trip Odometer",
200: "Sleep Mode",
201: "LLS 1 Fuel Level",
202: "LLS 1 Temperature",
203: "LLS 2 Fuel Level",
204: "LLS 2 Temperature",
205: "GSM Cell ID",
206: "GSM Area Code",
207: "RFID",
210: "LLS 3 Fuel Level",
211: "LLS 3 Temperature",
212: "LLS 4 Fuel Level",
213: "LLS 4 Temperature",
214: "LLS 5 Fuel Level",
215: "LLS 5 Temperature",
237: "Network Type",
238: "User ID",
239: "Ignition",
240: "Movement",
241: "Active GSM Operator",
263: "BT Status",
264: "Barcode ID",
303: "Instant Movement",
327: "UL202-02 Sensor Fuel level",
329: "AIN Speed",
380: "Digital output 3",
381: "Ground Sense",
383: "AXL Calibration Status",
387: "ISO6709 Coordinates",
403: "Driver Name",
404: "Driver card license type",
405: "Driver Gender",
406: "Driver Card ID",
407: "Driver card expiration date",
408: "Driver Card place of issue",
409: "Driver Status Event",
451: "BLE RFID #1",
452: "BLE RFID #2",
453: "BLE RFID #3",
454: "BLE RFID #4",
455: "BLE Button 1 state #1",
456: "BLE Button 1 state #2",
457: "BLE Button 1 state #3",
458: "BLE Button 1 state #4",
459: "BLE Button 2 state #1",
460: "BLE Button 2 state #2",
461: "BLE Button 2 state #3",
462: "BLE Button 2 state #4",
483: "UL202-02 Sensor Status",
500: "MSP500 vendor name",
501: "MSP500 vehicle number",
502: "MSP500 speed sensor",
622: "Frequency DIN1",
623: "Frequency DIN2",
636: "UMTS/LTE Cell ID",
637: "Wake Reason",
10800: "EYE Temperature 1",
10801: "EYE Temperature 2",
10802: "EYE Temperature 3",
10803: "EYE Temperature Liza4",
10804: "EYE Humidity 1",
10805: "EYE Humidity 2",
10806: "EYE Humidity 3",
10807: "EYE Humidity 4",
10808: "EYE Magnet 1",
10809: "EYE Magnet 2",
10810: "EYE Magnet 3",
10811: "EYE Magnet 4",
10812: "EYE Movement 1",
10813: "EYE Movement 2",
10814: "EYE Movement 3",
10815: "EYE Movement 4",
10816: "EYE Pitch 1",
10817: "EYE Pitch 2",
10818: "EYE Pitch 3",
10819: "EYE Pitch 4",
10820: "EYE Low Battery 1",
10821: "EYE Low Battery 2",
10822: "EYE Low Battery 3",
10823: "EYE Low Battery 4",
10824: "EYE Battery Voltage 1",
10825: "EYE Battery Voltage 2",
10826: "EYE Battery Voltage 3",
10827: "EYE Battery Voltage 4",
10832: "EYE Roll 1",
10833: "EYE Roll 2",
10834: "EYE Roll 3",
10835: "EYE Roll 4",
10836: "EYE Movement count 1",
10837: "EYE Movement count 2",
10838: "EYE Movement count 3",
10839: "EYE Movement count 4",
10840: "EYE Magnet count 1",
10841: "EYE Magnet count 2",
10842: "EYE Magnet count 3",
10843: "EYE Magnet count 4",
1148: "Connectivity quality",
14: "ICCID2",
20: "BLE Battery #2",
22: "BLE Battery #3",
23: "BLE Battery #4",
25: "BLE Temperature #1",
26: "BLE Temperature #2",
27: "BLE Temperature #3",
28: "BLE Temperature #4",
29: "BLE Battery #1",
30: "Number of DTC",
31: "Engine Load",
32: "Coolant Temperature",
33: "Short Fuel Trim",
34: "Fuel pressure",
35: "Intake MAP",
36: "Engine RPM",
37: "Vehicle Speed",
38: "Timing Advance",
39: "Intake Air Temperature",
40: "MAF",
41: "Throttle Position",
42: "Runtime since engine start",
43: "Distance Traveled MIL On",
44: "Relative Fuel Rail Pressure",
45: "Direct Fuel Rail Pressure",
46: "Commanded EGR",
47: "EGR Error",
48: "Fuel Level",
49: "Distance Since Codes Clear",
50: "Barometic Pressure",
51: "Control Module Voltage",
52: "Absolute Load Value",
53: "Ambient Air Temperature",
54: "Time Run With MIL On",
55: "Time Since Codes Cleared",
56: "Absolute Fuel Rail Pressure",
57: "Hybrid battery pack life",
58: "Engine Oil Temperature",
59: "Fuel injection timing",
60: "Fuel Rate",
61: "Geofence zone 06",
62: "Geofence zone 07",
63: "Geofence zone 08",
64: "Geofence zone 09",
65: "Geofence zone 10",
70: "Geofence zone 11",
81: "Vehicle Speed",
82: "Accelerator Pedal Position",
83: "Fuel Consumed",
84: "Fuel Level",
85: "Engine RPM",
86: "BLE Humidity #1",
87: "Total Mileage",
88: "Geofence zone 12",
89: "Fuel level",
90: "Door Status",
91: "Geofence zone 13",
92: "Geofence zone 14",
93: "Geofence zone 15",
94: "Geofence zone 16",
95: "Geofence zone 17",
96: "Geofence zone 18",
97: "Geofence zone 19",
98: "Geofence zone 20",
99: "Geofence zone 21",
100: "Program Number",
101: "Module ID 8B",
102: "Engine Worktime",
103: "Engine Worktime (counted)",
104: "BLE Humidity #2",
105: "Total Mileage (counted)",
106: "BLE Humidity #3",
107: "Fuel Consumed (counted)",
108: "BLE Humidity #4",
110: "Fuel Rate",
111: "AdBlue Level",
112: "AdBlue Level",
114: "Engine Load",
115: "Engine Temperature",
118: "Axle 1 Load",
119: "Axle 2 Load",
120: "Axle 3 Load",
121: "Axle 4 Load",
122: "Axle 5 Load",
123: "Control State Flags",
124: "Agricultural Machinery Flags",
125: "Harvesting Time",
126: "Area of Harvest",
127: "Mowing Efficiency",
128: "Grain Mown Volume",
129: "Grain Moisture",
130: "Harvesting Drum RPM",
131: "Gap Under Harvesting Drum",
132: "Security State Flags",
133: "Tachograph Total Vehicle Distance",
134: "Trip Distance",
135: "Tachograph Vehicle Speed",
136: "Tacho Driver Card Presence",
137: "Driver 1 States",
138: "Driver 2 States",
139: "Driver 1 Continuous Driving Time",
140: "Driver 2 Continuous Driving Time",
141: "Driver 1 Cumulative Break Time",
142: "Driver 2 Cumulative Break Time",
143: "Driver 1 Selected Activity Duration",
144: "Driver 2 Selected Activity Duration",
145: "Driver 1 Cumulative Driving Time",
146: "Driver 2 Cumulative Driving Time",
147: "Driver 1 ID High",
148: "Driver 1 ID Low",
149: "Driver 2 ID High",
150: "Driver 2 ID Low",
151: "Battery Temperature",
152: "HV Battery Level",
153: "Geofence zone 22",
154: "Geofence zone 23",
155: "Geofence zone 01",
156: "Geofence zone 02",
157: "Geofence zone 03",
158: "Geofence zone 04",
159: "Geofence zone 05",
160: "DTC Faults",
161: "Slope of Arm",
162: "Rotation of Arm",
163: "Eject of Arm",
164: "Horizontal Distance Arm Vehicle",
165: "Height Arm Above Ground",
166: "Drill RPM",
167: "Amount Of Spread Salt Square Meter",
168: "Battery Voltage",
169: "Amount Of Spread Fine Grained Salt",
170: "Amount Of Coarse Grained Salt",
171: "Amount Of Spread DiMix",
172: "Amount Of Spread Coarse Grained Calcium",
173: "Amount Of Spread Calcium Chloride",
174: "Amount Of Spread Sodium Chloride",
175: "Auto Geofence",
176: "Amount Of Spread Magnesium Chloride",
177: "Amount Of Spread Gravel",
178: "Amount Of Spread Sand",
183: "Width Pouring Left",
184: "Width Pouring Right",
185: "Salt Spreader Working Hours",
186: "Distance During Salting",
187: "Load Weight",
188: "Retarder Load",
189: "Cruise Time",
190: "Geofence zone 24",
191: "Geofence zone 25",
192: "Geofence zone 26",
193: "Geofence zone 27",
194: "Geofence zone 28",
195: "Geofence zone 29",
196: "Geofence zone 30",
197: "Geofence zone 31",
198: "Geofence zone 32",
208: "Geofence zone 33",
209: "Geofence zone 34",
216: "Geofence zone 35",
217: "Geofence zone 36",
218: "Geofence zone 37",
219: "Geofence zone 38",
220: "Geofence zone 39",
221: "Geofence zone 40",
222: "Geofence zone 41",
223: "Geofence zone 42",
224: "Geofence zone 43",
225: "Geofence zone 44",
226: "Geofence zone 45",
227: "Geofence zone 46",
228: "Geofence zone 47",
229: "Geofence zone 48",
230: "Geofence zone 49",
231: "Geofence zone 50",
232: "CNG Status",
233: "CNG Used",
234: "CNG Level",
235: "Oil Level",
236: "Alarm",
243: "Green driving event duration",
246: "Towing",
247: "Crash detection",
248: "Immobilizer",
249: "Jamming",
250: "Trip",
251: "Idling",
252: "Unplug",
253: "Green driving type",
254: "Green Driving Value",
255: "Over Speeding",
256: "VIN",
257: "Crash trace data",
258: "EcoMaximum",
259: "EcoAverage",
260: "EcoDuration",
270: "BLE Fuel Level #1",
273: "BLE Fuel Level #2",
276: "BLE Fuel Level #3",
279: "BLE Fuel Level #4",
281: "Fault Codes",
282: "Fault Codes",
283: "Driving State",
284: "Driving Records",
285: "Blood alcohol content",
304: "Vehicles Range On Battery",
305: "Vehicles Range On Additional Fuel",
306: "BLE Fuel Frequency #1",
307: "BLE Fuel Frequency #2",
308: "BLE Fuel Frequency #3",
309: "BLE Fuel Frequency #4",
317: "Crash event counter",
318: "GNSS Jamming",
325: "VIN",
331: "BLE 1 Custom #1",
332: "BLE 2 Custom #1",
333: "BLE 3 Custom #1",
334: "BLE 4 Custom #1",
335: "BLE Luminosity #1",
336: "BLE Luminosity #2",
337: "BLE Luminosity #3",
338: "BLE Luminosity #4",
385: "Beacon",
388: "Module ID 17B",
389: "OBD OEM Total Mileage",
390: "OBD OEM Fuel Level",
391: "Private mode",
400: "Distance to Next Service",
402: "OEM Distance Until Service",
411: "OEM Battery charge level",
449: "Ignition On Counter",
450: "CNG Level Kg",
463: "BLE 1 Custom #2",
464: "BLE 1 Custom #3",
465: "BLE 1 Custom #4",
466: "BLE 1 Custom #5",
467: "BLE 2 Custom #2",
468: "BLE 2 Custom #3",
469: "BLE 2 Custom #4",
470: "BLE 2 Custom #5",
471: "BLE 3 Custom #2",
472: "BLE 3 Custom #3",
473: "BLE 3 Custom #4",
474: "BLE 3 Custom #5",
475: "BLE 4 Custom #2",
476: "BLE 4 Custom #3",
477: "BLE 4 Custom #4",
478: "BLE 4 Custom #5",
517: "Security State Flags P4",
518: "Control State Flags P4",
519: "Indicator State Flags P4",
520: "Agricultural State Flags P4",
521: "Utility State Flags P4",
522: "Cistern State Flags P4",
540: "Throttle position group",
541: "Commanded Equivalence R",
542: "Intake MAP 2 bytes",
543: "Hybrid System Voltage",
544: "Hybrid System Current",
548: "Advanced BLE Beacon data",
652: "SSF KeyInIgnitionLock",
653: "SSF Handbrake Is Active",
654: "SSF Front Left Door Open",
655: "SSF Front Right Door Open",
656: "SSF Rear Left Door Open",
657: "SSF Rear Right Door Open",
658: "SSF Trunk Door Open",
659: "SSF Neutral Gear Active (automatic gear box)",
660: "SSF Parking Gear Active (automatic gear box)",
661: "SSF Reverse Gear Active",
662: "SSF Car Is Closed",
755: "OEM Remaining distance",
759: "Fuel Type",
855: "LNG Used",
856: "LNG Used (counted)",
857: "LNG Level",
858: "LNG Level",
859: "Distance from need of service",
860: "Distance from last service",
861: "Time to next service",
862: "Time from need of service",
863: "Time from last serivce",
864: "Distance to next oil service",
865: "Time to next oil service",
866: "LVCAN Vehicle Range",
867: "LVCAN Total CNG counted",
898: "SSF Ignition",
899: "SSF Webasto",
900: "SSF Engine Working",
901: "SSF Standalone Engine",
902: "SSF Ready To Drive",
903: "SSF Engine Working On CNG",
904: "SSF Work Mode",
905: "SSF Operator",
906: "SSF Interlock",
907: "SSF Engine Lock Active",
908: "SSF Request To Lock Engine",
909: "SSF Roof Open",
910: "SSF Footbrake Is Active",
911: "SSF Clutch Pushed",
912: "SSF Hazard Warning Lights",
913: "SSF Engine Cover Open",
914: "SSF Charging Wire Plugged",
915: "SSF Batttery Charging",
916: "SSF Electric Engine State",
917: "SSF Car Closed Factory Remote",
918: "SSF Factory Alarm Actuated",
919: "SSF Factory Alarm Emulated",
920: "SSF Signal Close Factory Remote",
921: "SSF Signal Open Factory Remote",
922: "SSF Rearming Signal",
923: "SSF Trunk Door Opened Factory Remote",
924: "SSF CAN Module In Sleep",
925: "SSF Factory Remote 3x",
926: "SSF Factory Armed",
927: "SSF Drive Is Active (automatic gear box)",
928: "CSF Parking Lights",
929: "CSF Dipped Head lights",
930: "CSF Full Beam Headlights",
931: "CSF Rear Fog Lights",
932: "CSF Front Fog Lights",
933: "CSF Additional Front Lights",
934: "CSF Additional Rear Lights",
935: "CSF Light Signal",
936: "CSF Air Conditioning",
937: "CSF Cruise Control",
938: "CSF Automatic Retarder",
939: "CSF Manual Retarder",
940: "CSF Driver's Seatbelt Fastened",
941: "CSF Front Driver's Seatbelt Fastened",
942: "CSF Left Driver's Seatbelt Fastened",
943: "CSF Right Driver's Seatbelt Fastened",
944: "CSF Centre Driver's Seatbelt Fastened",
945: "CSF Front Passenger Present",
946: "CSF PTO",
947: "CSF Front Differential Locked",
948: "CSF Rear Differential Locked",
949: "CSF Central Differential 4HI Locked",
950: "CSF Rear Differential 4LO Locked",
951: "CSF Trailer Axle 1 Lift Active",
952: "CSF Trailer Axle 2 Lift Active",
953: "ISF Check Engine Indicator",
954: "ISF ABS Indicator",
955: "ISF ESP Indicator",
956: "ISF ESP Turned Off",
957: "ISF Stop Indicator",
958: "ISF Oil Level Indicator",
959: "ISF Coolant liquid level",
960: "ISF Battery Not Charging Indicator",
961: "ISF Handbrake System Indicator",
962: "ISF AIRBAG Indicator",
963: "ISF EPS Indicator",
964: "ISF Warning Indicator",
965: "ISF Lights Failure Indicator",
966: "ISF Low Tire Pressure Indicator",
967: "ISF Wear Of Brake Pads Indicator",
968: "ISF Low Fuel Level Indicator",
969: "ISF Maintenence required Indicator",
970: "ISF Glow Plug Indicator",
971: "ISF FAP Indicator",
972: "ISF EPC (Electronic Power Control) Indicator",
973: "ISF Clogged Engine Oil Filter Indicator",
974: "ISF Low Engine Oil Pressure Indicator",
975: "ISF Too High Engine Oil Temperature Indicator",
976: "ISF Low Coolant Level Indicator",
977: "ISF Clogged Hydraulic System Oil filter Indicator",
978: "ISF Hydraulic System Low Pressure Indicator",
979: "ISF Hydraulic Oil Low Level Indicator",
980: "ISF Hydraulic System High Temperature Indicator",
981: "ISF Oil Overflow In Hydraulic Chamber Indicator",
982: "ISF Clogged Air Filter Indicator",
983: "ISF Clogged Fuel Filter Indicator",
984: "ISF Water in Fuel Indicator",
985: "ISF Clogged Brake System Filter Indicator",
986: "ISF Low Washer Fluid Level Indicator",
987: "ISF Low AdBlue Level Indicator",
988: "ISF Low Trailer Tyre Pressure Indicator",
989: "ISF Wear Of Trailer Brake Lining Indicator",
990: "ISF High Trailer Brake Temperature Indicator",
991: "ISF Incorrect Trailer Pneumatic Supply Indicator",
992: "ISF Low CNG Level Indicator",
993: "ASF Right Joystick Moved Right Active",
994: "ASF Right Joystick Moved Left Active",
995: "ASF Right Joystick Moved Forward Active",
996: "ASF Right Joystick Moved Back Active",
997: "ASF Left Joystick Moved Right Active",
998: "ASF Left Joystick Moved Left Active",
999: "ASF Left Joystick Moved Forward Active",
1000: "ASF Left Joystick Moved Back Active",
1001: "ASF First Rear hydraulic",
1002: "ASF Second Rear hydraulic",
1003: "ASF Third Rear hydraulic",
1004: "ASF Fourth Rear hydraulic",
1005: "ASF First Front hydraulic",
1006: "ASF Second Front hydraulic",
1007: "ASF Third Front hydraulic",
1008: "ASF Fourth Front hydraulic",
1009: "ASF Front Three-point Hitch",
1010: "ASF Rear Three-point Hitch",
1011: "ASF Front Power Take-off",
1012: "ASF Rear Power Take-off",
1013: "ASF Mowing Active",
1014: "ASF Threshing Active",
1015: "ASF Grain Release From Hopper",
1016: "ASF Grain Tank Is 100% Full",
1017: "ASF Grain Tank Is 70% Full",
1018: "ASF Grain Tank Is Opened",
1019: "ASF Unloader Drive",
1020: "ASF Cleaning Fan Control Turned Off",
1021: "ASF Threshing Drum Control Turned Off",
1022: "ASF Straw Walker Is Clogged",
1023: "ASF Excessive Clearance Under The Threshing Drum",
1024: "ASF Low Temperature Of Drive System Hydraulics Less Than 5 Grades",
1025: "ASF High Temperature Of Drive System Hydraulics Greater Than 86 Grades",
1026: "ASF Ear Auger Speed Below The Norm",
1027: "ASF Grain Auger Speed Below The Norm",
1028: "ASF Straw Chooper Speed Below The Norm",
1029: "ASF Straw Shaker Speed Below The Norm",
1030: "ASF Feeder Speed Below The Norm",
1031: "ASF Straw Chopper Switched On",
1032: "ASF Corn Header Connected",
1033: "ASF Grain Header Connected",
1034: "ASF Feeder Reverse Switched On",
1035: "ASF The Pressure Filter Of The Hydraulic Pump Is Clogged",
1036: "USF Spreading",
1037: "USF Pouring Chemicals",
1038: "USF Conveyor Belt",
1039: "USF Salt Spreader's Drive Wheel",
1040: "USF Brushes",
1041: "USF Vacuum Cleaner",
1042: "USF Water Supply",
1043: "USF Spreading",
1044: "USF Liquid pump",
1045: "USF Unloading From The Hopper",
1046: "USF Low Salt (Sand) Level In Container Indicator",
1047: "USF Low Water Level in Container Indicator",
1048: "USF Chemicals",
1049: "USF Compressor",
1050: "USF Water Valve Is Opened",
1051: "USF Cabin Moved Up Status Active",
1052: "USF Cabin Moved Down Status Active",
1053: "CiSF Section 1 Presence Of Fluid In The Downpipe",
1054: "CiSF Section 1 Filled",
1055: "CiSF Section 1 Overfilled",
1056: "CiSF Section 2 Presence Of Fluid In The Downpipe",
1057: "CiSF Section 2 Filled",
1058: "CiSF Section 2 Overfilled",
1059: "CiSF Section 3 Presence Of Fluid In The Downpipe",
1060: "CiSF Section 3 Filled",
1061: "CiSF Section 3 Overfilled",
1062: "CiSF Section 4 Presence Of Fluid In The Downpipe",
1063: "CiSF Section 4 Filled",
1064: "CiSF Section 4 Overfilled",
1065: "CiSF Section 5 Presence Of Fluid In The Downpipe",
1066: "CiSF Section 5 Filled",
1067: "CiSF Section 5 Overfilled",
1068: "CiSF Section 6 Presence Of Fluid In The Downpipe",
1069: "CiSF Section 6 Filled",
1070: "CiSF Section 6 Overfilled",
1071: "CiSF Section 7 Presence Of Fluid In The Downpipe",
1072: "CiSF Section 7 Filled",
1073: "CiSF Section 7 Overfilled",
1074: "CiSF Section 8 Presence Of Fluid In The Downpipe",
1075: "CiSF Section 8 Filled",
1076: "CiSF Section 8 Overfilled",
1079: "Total Bale Count",
1080: "Bale Count",
1081: "Cut Bale Count",
1082: "Bale Slices",
1083: "SSF Engine Working On Dual Fuel",
1084: "SSF Engine Working On LPG",
1085: "CSF Trailer Connected",
1086: "CSF Start Stop System Inactive",
1087: "ASF Adapter Pressure Filter Sensor",
1088: "ASF Service 2 Required Indicator",
1089: "ASF Drain Filter Clogged Indicator",
1090: "ASF Section 1 Spraying",
1091: "ASF Section 2 Spraying",
1092: "ASF Section 3 Spraying",
1093: "ASF Section 4 Spraying",
1094: "ASF Section 5 Spraying",
1095: "ASF Section 6 Spraying",
1096: "ASF Section 7 Spraying",
1097: "ASF Section 8 Spraying",
1098: "ASF Section 9 Spraying",
1099: "USF Hydraulics Work Not Permitted",
1100: "Total LPG Used",
1101: "Total LPG Used Counted",
1102: "LPG Level Proc",
1103: "LPG Level Liters",
1116: "LVCAN MaxRoadSpeed",
1117: "LVCAN ExceededRoadSpeed",
1151: "OEM Battery State Of Health",
1152: "OEM Battery Temperature",
1205: "LVCAN RSF SpeedLimitSign",
1206: "LVCAN RSF EndOfSpeedLimitSign",
1207: "LVCAN RSF SpeedExceeded",
1208: "LVCAN RSF TimeSpeedLimitSign",
1209: "LVCAN RSF WthrSpeedLimitSign",
1412: "Motorcycle Fall Detection",
}
}
}
module.exports = LibHelper;
module.exports = LibHelper

View File

@ -35,7 +35,7 @@
"moment": "^2.29.1",
"morgan": "^1.10.0",
"mysql": "^2.18.1",
"mysql2": "^3.15.1",
"mysql2": "^3.15.3",
"nanoid": "^3.3.1",
"node-cron": "^4.2.1",
"nodemailer": "^6.7.2",

10
pnpm-lock.yaml generated
View File

@ -72,8 +72,8 @@ importers:
specifier: ^2.18.1
version: 2.18.1
mysql2:
specifier: ^3.15.1
version: 3.15.1
specifier: ^3.15.3
version: 3.15.3
nanoid:
specifier: ^3.3.1
version: 3.3.11
@ -1332,8 +1332,8 @@ packages:
msgpackr@1.11.5:
resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==}
mysql2@3.15.1:
resolution: {integrity: sha512-WZMIRZstT2MFfouEaDz/AGFnGi1A2GwaDe7XvKTdRJEYiAHbOrh4S3d8KFmQeh11U85G+BFjIvS1Di5alusZsw==}
mysql2@3.15.3:
resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==}
engines: {node: '>= 8.0'}
mysql@2.18.1:
@ -3501,7 +3501,7 @@ snapshots:
optionalDependencies:
msgpackr-extract: 3.0.3
mysql2@3.15.1:
mysql2@3.15.3:
dependencies:
aws-ssl-profiles: 1.1.2
denque: 2.1.0

8
routes/listen.js Normal file
View File

@ -0,0 +1,8 @@
const ListenController = require("../controllers/ListenController")
const { PATH_URL } = process.env
exports.use = function (app) {
// LISTEN
app.post(PATH_URL + "/listen/gps", ListenController.gps)
app.post(PATH_URL + "/listen/teltonika", ListenController.teltonika)
}