diff --git a/app.js b/app.js index 586c03a..29ac577 100644 --- a/app.js +++ b/app.js @@ -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) diff --git a/controllers/ListenController.js b/controllers/ListenController.js index 925727c..c7f4b4f 100644 --- a/controllers/ListenController.js +++ b/controllers/ListenController.js @@ -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 diff --git a/cron/TripsWorker.js b/cron/TripsWorker.js index 5c0f4a0..4e39292 100644 --- a/cron/TripsWorker.js +++ b/cron/TripsWorker.js @@ -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', diff --git a/library/LibHelper.js b/library/LibHelper.js index 0f943be..318fe5c 100755 --- a/library/LibHelper.js +++ b/library/LibHelper.js @@ -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; \ No newline at end of file +module.exports = LibHelper diff --git a/package.json b/package.json index b5d591f..520f3f6 100755 --- a/package.json +++ b/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3e4d24..133b082 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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 diff --git a/routes/listen.js b/routes/listen.js new file mode 100644 index 0000000..15fb017 --- /dev/null +++ b/routes/listen.js @@ -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) +}