Big update in a while. It is very functional
This commit is contained in:
8
.gitignore
vendored
8
.gitignore
vendored
@ -1,8 +0,0 @@
|
|||||||
# Dependency directories
|
|
||||||
node_modules/
|
|
||||||
|
|
||||||
# Optional npm cache directory
|
|
||||||
.npm
|
|
||||||
|
|
||||||
# dotenv environment variables file
|
|
||||||
.env
|
|
@ -16,13 +16,15 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<picture>
|
<picture>
|
||||||
<img src="http://assets.velend.eu:2052/assets/velend_eu-tltmap/velendeulogo.jpg" alt="velendeulogojpg" style="float: right; margin-left: 15px; width: 25%;";>
|
<img src="http://assets.velend.eu:2052/assets/velend_eu-tltmap/velendeulogo.jpg" alt="velendeulogojpg" style="float: right; margin-left: 15px; width: 25%;">
|
||||||
</picture>
|
</picture>
|
||||||
<h2>TLT Location Finder</h2>
|
<h2>TLT Location Finder</h2>
|
||||||
<form id="search-form">
|
<form id="search-form">
|
||||||
<label for="bus-id">Enter TAK:</label>
|
<label for="bus-id">Enter TAK:</label>
|
||||||
<input type="text" id="bus-id" name="bus-id">
|
<input type="text" id="bus-id" name="bus-id">
|
||||||
<button type="submit">Search</button>
|
<button type="submit">Search</button>
|
||||||
|
<!-- <button type="click" id="elektrolino">Electric bus search</button>
|
||||||
|
<button type="press" id="pesa">Pesa twist search</button> -->
|
||||||
</form>
|
</form>
|
||||||
<form id="recievedData">
|
<form id="recievedData">
|
||||||
<p id="type">Type: UNFETCHED</p>
|
<p id="type">Type: UNFETCHED</p>
|
||||||
@ -45,15 +47,11 @@
|
|||||||
var socket = io();//
|
var socket = io();//
|
||||||
|
|
||||||
// Stuff for the map
|
// Stuff for the map
|
||||||
//map = new OpenLayers.Map("demoMap");//.setView([59.4370, 24.7536], 12);
|
|
||||||
//map.addLayer(new OpenLayers.Layer.OSM());
|
|
||||||
//map.zoomToMaxExtent();
|
|
||||||
|
|
||||||
map = new OpenLayers.Map("demoMap");
|
map = new OpenLayers.Map("demoMap");
|
||||||
var mapnik = new OpenLayers.Layer.OSM();
|
var mapnik = new OpenLayers.Layer.OSM();
|
||||||
var fromProjection = new OpenLayers.Projection("EPSG:4326"); // Transform from WGS 1984
|
var fromProjection = new OpenLayers.Projection("EPSG:4326"); // Transform from WGS 1984
|
||||||
var toProjection = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection
|
var toProjection = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection
|
||||||
var position = new OpenLayers.LonLat(24.7536, 59.4370).transform( fromProjection, toProjection);
|
var position = new OpenLayers.LonLat(24.7536, 59.4370).transform(fromProjection, toProjection);
|
||||||
var zoom = 12;
|
var zoom = 12;
|
||||||
|
|
||||||
map.addLayer(mapnik);
|
map.addLayer(mapnik);
|
||||||
@ -65,6 +63,13 @@
|
|||||||
var tak = document.getElementById('bus-id').value.trim();
|
var tak = document.getElementById('bus-id').value.trim();
|
||||||
socket.emit('takSearch', tak);
|
socket.emit('takSearch', tak);
|
||||||
});
|
});
|
||||||
|
/*document.getElementById('elektrolino').addEventListener('click', function () {
|
||||||
|
socket.emit('elektrolino');
|
||||||
|
});
|
||||||
|
document.getElementById('pesa').addEventListener('press', function () {
|
||||||
|
socket.emit('pesa');
|
||||||
|
});*/
|
||||||
|
|
||||||
oldMarker = "1";
|
oldMarker = "1";
|
||||||
socket.on('takResults', (typeR, lineR, latR, longR, takR, latlongR, vehicleTypeR) => {
|
socket.on('takResults', (typeR, lineR, latR, longR, takR, latlongR, vehicleTypeR) => {
|
||||||
console.log("Datafetch success");
|
console.log("Datafetch success");
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 27 KiB |
191
main.js
191
main.js
@ -1,8 +1,7 @@
|
|||||||
let serverPort = 80;
|
const serverPort = 8081;
|
||||||
const url = "http://transport.tallinn.ee/gps.txt";
|
const url = "http://transport.tallinn.ee/gps.txt";
|
||||||
|
|
||||||
const express = require('express');
|
const express = require('express');
|
||||||
const { fstat } = require('fs');
|
|
||||||
const app = express();
|
const app = express();
|
||||||
const http = require('http');
|
const http = require('http');
|
||||||
const server = http.createServer(app);
|
const server = http.createServer(app);
|
||||||
@ -10,8 +9,18 @@ const { Server } = require("socket.io");
|
|||||||
const io = new Server(server);
|
const io = new Server(server);
|
||||||
const axios = require('axios');
|
const axios = require('axios');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
let cafTramTakArray = ["502", "520", "505", "518", "513", "507"];
|
const localFilePath = 'gps/gps.txt'
|
||||||
|
|
||||||
|
let cafTramTakArray = ["501", "502", "503", "504", "505", "506", "507", "508", "509", "510", "511", "512", "513", "514", "515", "516", "517", "518", "519", "520"];
|
||||||
|
let pesaTramTakArray = ["521", "522", "523", "524", "525", "526", "527", "528", "529", "530", "531", "532"];
|
||||||
|
let electricBusTakArray = ["1350", "1351", "1353", "1356", "1357", "2411", "2413", "2414", "2416"];
|
||||||
|
let kt6tmTramArray = ["96", "97", "98", "99", "102", "103", "109", "110", "114", "123", "131", "148"];
|
||||||
|
let kt4suTramArray = ["104"];
|
||||||
|
let kt4tmrTramArray = ["136", "138", "140", "141", "142", "168"];
|
||||||
|
let kt4dTramArray = ["157", "161", "170", "172", "173", "176", "177", "178", "179", "180"];
|
||||||
|
let kt4tmTramArray = ["181", "182"];
|
||||||
|
|
||||||
let requestedType = "Unfetched";
|
let requestedType = "Unfetched";
|
||||||
let requestedLine = "Unfetched";
|
let requestedLine = "Unfetched";
|
||||||
@ -21,52 +30,136 @@ let requestedTak = "Unfetched";
|
|||||||
let vehicleType = "Unfetched";
|
let vehicleType = "Unfetched";
|
||||||
let requestedLatLong = "Unfetched";
|
let requestedLatLong = "Unfetched";
|
||||||
|
|
||||||
console.log("Server initalize!");
|
let isRequestMode = false;
|
||||||
|
let requestModeIntervalId = null;
|
||||||
|
let lastFetchTime = 0;
|
||||||
|
const defaultFetchInterval = 120000;
|
||||||
|
const requestModeInterval = 30000;
|
||||||
|
const requestModeDuration = 120000;
|
||||||
|
|
||||||
app.use(express.static('client'))
|
console.log("Server initialized!");
|
||||||
|
|
||||||
|
app.use(express.static('client'));
|
||||||
|
|
||||||
app.get('/tltmap', (req, res) => {
|
app.get('/tltmap', (req, res) => {
|
||||||
console.log("Requested / (index.html). Fetching!");
|
res.sendFile(path.join(__dirname, 'client/index.html'));
|
||||||
//index.html
|
|
||||||
res.sendFile(__dirname + '/client/index.html');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/img/marker.png', (req, res) => {
|
app.get('/img/marker.png', (req, res) => {
|
||||||
var img = fs.readFileSync('./client/marker.png');
|
const img = fs.readFileSync('./client/marker.png');
|
||||||
res.writeHead(200, {'Content-Type': 'image/png'});
|
res.writeHead(200, { 'Content-Type': 'image/png' });
|
||||||
res.end(img, 'binary');
|
res.end(img, 'binary');
|
||||||
});
|
});
|
||||||
|
|
||||||
server.listen(serverPort, () => {
|
server.listen(serverPort, () => {
|
||||||
console.log("Apache server initalized...");
|
console.log("Apache server initialized...");
|
||||||
console.log('Server started on port', serverPort);
|
console.log('Server started on port', serverPort);
|
||||||
//triggerDataFetch();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
io.on('connection', (socket) => {
|
io.on('connection', (socket) => {
|
||||||
socket.on('takSearch', (tak) => {
|
socket.on('takSearch', async (tak) => {
|
||||||
try {
|
try {
|
||||||
console.log("Input tak: " + tak);
|
console.log("Input tak: " + tak);
|
||||||
fetchData(tak, socket);
|
saveRequestLogs(socket, tak);
|
||||||
} catch {
|
if (isRequestMode) {
|
||||||
|
const currentTime = Date.now();
|
||||||
|
if (currentTime - lastFetchTime >= requestModeInterval) {
|
||||||
|
await fetchAndSaveData("Request Mode");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await fetchAndSaveData("Request Mode");
|
||||||
|
}
|
||||||
|
if (isRequestMode) {
|
||||||
|
clearInterval(requestModeIntervalId);
|
||||||
|
}
|
||||||
|
startRequestModeFetch();
|
||||||
|
fetchDataFromLocalFile(tak, socket);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error processing takSearch:", error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
async function triggerConstantDataFetch() {
|
function saveRequestLogs(socket, takInput) {
|
||||||
while (true) {
|
const xForwardedFor = socket.request.headers['x-forwarded-for'];
|
||||||
console.log("Fetching new data...");
|
let clientIp;
|
||||||
await fetchData();
|
if (xForwardedFor) {
|
||||||
console.log("Data fetch completed. Wait 5 seconds before next fetch!");
|
clientIp = xForwardedFor.split(',')[0].trim();
|
||||||
|
} else {
|
||||||
|
clientIp = socket.request.connection.remoteAddress;
|
||||||
|
}
|
||||||
|
const date = new Date();
|
||||||
|
const logData = `${clientIp} - [${date}] - [SEARCH ${takInput}] - ${socket.handshake.headers['user-agent']}\n`;
|
||||||
|
writeToLog('search_log.txt', logData);
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeToLog(logfile, logdata) {
|
||||||
|
var realLogFile = path.join('logs/', logfile);
|
||||||
|
fs.appendFile(realLogFile, logdata, 'utf8', (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error('Error writing to file:', err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fetchAndSaveData(fetchMode) {
|
||||||
|
try {
|
||||||
|
console.log(`Fetch started (${fetchMode})`);
|
||||||
|
const date = new Date();
|
||||||
|
const timestamp = date.toISOString().replace(/:/g, '_').replace('T', '-').split('.')[0];
|
||||||
|
const logData = `${date} - Fetching new data (${fetchMode})...\n`;
|
||||||
|
writeToLog('fetch_log.txt', logData);
|
||||||
|
|
||||||
|
if (fs.existsSync(localFilePath)) {
|
||||||
|
const oldFilePath = `gps/gps-${timestamp}.txt`
|
||||||
|
fs.renameSync(localFilePath, oldFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await axios.get(url);
|
||||||
|
if (response.status === 200) {
|
||||||
|
fs.writeFileSync(localFilePath, response.data, 'utf8');
|
||||||
|
console.log("Fetch completed.");
|
||||||
|
const logData = `${date} - Fetching completed (${fetchMode})!\n`;
|
||||||
|
writeToLog('fetch_log.txt', logData);
|
||||||
|
} else {
|
||||||
|
const logData = `${date} - Fetching failed (${fetchMode}). Got: ${response.status}\n`;
|
||||||
|
writeToLog('errors_log.txt', logData);
|
||||||
|
}
|
||||||
|
lastFetchTime = Date.now();
|
||||||
|
} catch (error) {
|
||||||
|
const date = new Date();
|
||||||
|
const logData = `${date} - Error fetching data (${fetchMode}): ${error.message}\n`;
|
||||||
|
writeToLog('errors_log.txt', logData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchData(takInput, socket) {
|
function startPeriodicDataFetch() {
|
||||||
|
fetchAndSaveData("Normal Mode");
|
||||||
|
setInterval(() => {
|
||||||
|
if (!isRequestMode) {
|
||||||
|
fetchAndSaveData("Normal Mode");
|
||||||
|
}
|
||||||
|
}, defaultFetchInterval);
|
||||||
|
}
|
||||||
|
|
||||||
|
function startRequestModeFetch() {
|
||||||
|
isRequestMode = true;
|
||||||
|
requestModeIntervalId = setInterval(async () => {
|
||||||
|
const currentTime = Date.now();
|
||||||
|
if (currentTime - lastFetchTime >= requestModeInterval) {
|
||||||
|
await fetchAndSaveData("Request Mode");
|
||||||
|
}
|
||||||
|
}, requestModeInterval);
|
||||||
|
setTimeout(() => {
|
||||||
|
clearInterval(requestModeIntervalId);
|
||||||
|
isRequestMode = false;
|
||||||
|
}, requestModeDuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fetchDataFromLocalFile(takInput, socket) {
|
||||||
try {
|
try {
|
||||||
const response = await axios.get(url);
|
const data = fs.readFileSync(localFilePath, 'utf8');
|
||||||
if (response.status === 200) {
|
const lines = data.split('\n');
|
||||||
const lines = response.data.split('\n');
|
|
||||||
let takFound = 0;
|
let takFound = 0;
|
||||||
lines.forEach(line => {
|
lines.forEach(line => {
|
||||||
if (line) {
|
if (line) {
|
||||||
@ -75,8 +168,8 @@ async function fetchData(takInput, socket) {
|
|||||||
try {
|
try {
|
||||||
const transportType = parseInt(data[0]);
|
const transportType = parseInt(data[0]);
|
||||||
const lineNumber = parseInt(data[1]);
|
const lineNumber = parseInt(data[1]);
|
||||||
const longitude = parseInt(data[2]) / 1000000;
|
const longitude = parseFloat(data[2]) / 1000000;
|
||||||
const latitude = parseInt(data[3]) / 1000000;
|
const latitude = parseFloat(data[3]) / 1000000;
|
||||||
const tak = data[6];
|
const tak = data[6];
|
||||||
|
|
||||||
let transportTypeDecoded;
|
let transportTypeDecoded;
|
||||||
@ -98,24 +191,38 @@ async function fetchData(takInput, socket) {
|
|||||||
transportTypeDecoded = "Unknown";
|
transportTypeDecoded = "Unknown";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (tak == takInput) {
|
if (tak === takInput) {
|
||||||
if (transportTypeDecoded == "TRAM") {
|
if (transportTypeDecoded === "TRAM") {
|
||||||
if (cafTramTakArray.includes(tak)) {
|
if (cafTramTakArray.includes(tak)) {
|
||||||
vehicleType = "CAF Urbos (Spain) (Overhead 600V, Motor 264 kW) 70km/h TOP";
|
vehicleType = "CAF Urbos AXL (Spain) (Overhead 600V, Motor 264 kW) 70km/h TOP";
|
||||||
|
} else if (pesaTramTakArray.includes(tak)) {
|
||||||
|
vehicleType = "PESA Twist 147N";
|
||||||
|
} else if (kt6tmTramArray.includes(tak)) {
|
||||||
|
vehicleType = "Tatra KT6 TM";
|
||||||
|
} else if (kt4suTramArray.includes(tak)) {
|
||||||
|
vehicleType = "Tatra KT4 SU";
|
||||||
|
} else if (kt4tmrTramArray.includes(tak)) {
|
||||||
|
vehicleType = "Tatra KT4 TMR";
|
||||||
|
} else if (kt4dTramArray.includes(tak)) {
|
||||||
|
vehicleType = "Tatra KT4 D";
|
||||||
|
} else if (kt4tmTramArray.includes(tak)) {
|
||||||
|
vehicleType = "Tatra KT4 TM";
|
||||||
|
} else {
|
||||||
|
vehicleType = "-- Info unavailable --";
|
||||||
}
|
}
|
||||||
else {
|
} else if (transportTypeDecoded === "BUS") {
|
||||||
vehicleType = "-- INFO UNAVAIL. --";
|
if (electricBusTakArray.includes(tak)) {
|
||||||
|
vehicleType = "Solaris Urbino IV 12 Electric";
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
vehicleType = "-- Info unavailable --";
|
||||||
vehicleType = "Unfetched";
|
|
||||||
}
|
}
|
||||||
takFound = 1;
|
takFound = 1;
|
||||||
requestedType = transportTypeDecoded;
|
requestedType = transportTypeDecoded;
|
||||||
requestedLine = lineNumber;
|
requestedLine = lineNumber;
|
||||||
requestedLat = latitude;
|
requestedLat = latitude;
|
||||||
requestedLong = longitude;
|
requestedLong = longitude;
|
||||||
requestedLatLong = String(latitude) + " " + String(longitude);
|
requestedLatLong = `${latitude} ${longitude}`;
|
||||||
requestedTak = tak;
|
requestedTak = tak;
|
||||||
console.log("Requested data fetched:");
|
console.log("Requested data fetched:");
|
||||||
console.log("Transport Type:", transportTypeDecoded);
|
console.log("Transport Type:", transportTypeDecoded);
|
||||||
@ -126,10 +233,9 @@ async function fetchData(takInput, socket) {
|
|||||||
console.log("TAK:", tak);
|
console.log("TAK:", tak);
|
||||||
console.log();
|
console.log();
|
||||||
socket.emit('takResults', requestedType, requestedLine, requestedLat, requestedLong, requestedTak, requestedLatLong, vehicleType);
|
socket.emit('takResults', requestedType, requestedLine, requestedLat, requestedLong, requestedTak, requestedLatLong, vehicleType);
|
||||||
}
|
} else if (tak !== takInput && takFound !== 1) {
|
||||||
else if (tak != takInput && takFound != 1) {
|
|
||||||
takFound = 0;
|
takFound = 0;
|
||||||
let busNotFoundText = "BUS NOT FOUND!";
|
const busNotFoundText = "VEHICLE NOT FOUND!";
|
||||||
requestedType = busNotFoundText;
|
requestedType = busNotFoundText;
|
||||||
requestedLine = busNotFoundText;
|
requestedLine = busNotFoundText;
|
||||||
requestedLat = busNotFoundText;
|
requestedLat = busNotFoundText;
|
||||||
@ -142,10 +248,9 @@ async function fetchData(takInput, socket) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
console.log("Data fetch fail! Got status:", response.status);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error fetching data:", error);
|
console.error("Error reading local file:", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
startPeriodicDataFetch();
|
46
package-lock.json
generated
46
package-lock.json
generated
@ -247,9 +247,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/engine.io": {
|
"node_modules/engine.io": {
|
||||||
"version": "6.5.4",
|
"version": "6.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz",
|
||||||
"integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==",
|
"integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/cookie": "^0.4.1",
|
"@types/cookie": "^0.4.1",
|
||||||
"@types/cors": "^2.8.12",
|
"@types/cors": "^2.8.12",
|
||||||
@ -260,7 +260,7 @@
|
|||||||
"cors": "~2.8.5",
|
"cors": "~2.8.5",
|
||||||
"debug": "~4.3.1",
|
"debug": "~4.3.1",
|
||||||
"engine.io-parser": "~5.2.1",
|
"engine.io-parser": "~5.2.1",
|
||||||
"ws": "~8.11.0"
|
"ws": "~8.17.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.2.0"
|
"node": ">=10.2.0"
|
||||||
@ -840,12 +840,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/socket.io-adapter": {
|
"node_modules/socket.io-adapter": {
|
||||||
"version": "2.5.4",
|
"version": "2.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
|
||||||
"integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==",
|
"integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": "~4.3.4",
|
"debug": "~4.3.4",
|
||||||
"ws": "~8.11.0"
|
"ws": "~8.17.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/socket.io-adapter/node_modules/debug": {
|
"node_modules/socket.io-adapter/node_modules/debug": {
|
||||||
@ -981,15 +981,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ws": {
|
"node_modules/ws": {
|
||||||
"version": "8.11.0",
|
"version": "8.17.1",
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
|
||||||
"integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
|
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"bufferutil": "^4.0.1",
|
"bufferutil": "^4.0.1",
|
||||||
"utf-8-validate": "^5.0.2"
|
"utf-8-validate": ">=5.0.2"
|
||||||
},
|
},
|
||||||
"peerDependenciesMeta": {
|
"peerDependenciesMeta": {
|
||||||
"bufferutil": {
|
"bufferutil": {
|
||||||
@ -1182,9 +1182,9 @@
|
|||||||
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
|
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
|
||||||
},
|
},
|
||||||
"engine.io": {
|
"engine.io": {
|
||||||
"version": "6.5.4",
|
"version": "6.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz",
|
||||||
"integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==",
|
"integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/cookie": "^0.4.1",
|
"@types/cookie": "^0.4.1",
|
||||||
"@types/cors": "^2.8.12",
|
"@types/cors": "^2.8.12",
|
||||||
@ -1195,7 +1195,7 @@
|
|||||||
"cors": "~2.8.5",
|
"cors": "~2.8.5",
|
||||||
"debug": "~4.3.1",
|
"debug": "~4.3.1",
|
||||||
"engine.io-parser": "~5.2.1",
|
"engine.io-parser": "~5.2.1",
|
||||||
"ws": "~8.11.0"
|
"ws": "~8.17.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cookie": {
|
"cookie": {
|
||||||
@ -1620,12 +1620,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"socket.io-adapter": {
|
"socket.io-adapter": {
|
||||||
"version": "2.5.4",
|
"version": "2.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
|
||||||
"integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==",
|
"integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"debug": "~4.3.4",
|
"debug": "~4.3.4",
|
||||||
"ws": "~8.11.0"
|
"ws": "~8.17.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": {
|
"debug": {
|
||||||
@ -1707,9 +1707,9 @@
|
|||||||
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
|
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
|
||||||
},
|
},
|
||||||
"ws": {
|
"ws": {
|
||||||
"version": "8.11.0",
|
"version": "8.17.1",
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
|
||||||
"integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
|
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
|
||||||
"requires": {}
|
"requires": {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
285
rollback
285
rollback
@ -1,285 +0,0 @@
|
|||||||
let serverPort = 3000;
|
|
||||||
const url = "http://transport.tallinn.ee/gps.txt";
|
|
||||||
|
|
||||||
const express = require('express');
|
|
||||||
const { fstat } = require('fs');
|
|
||||||
const app = express();
|
|
||||||
const http = require('http');
|
|
||||||
const server = http.createServer(app);
|
|
||||||
const { Server } = require("socket.io");
|
|
||||||
const io = new Server(server);
|
|
||||||
const axios = require('axios');
|
|
||||||
const fs = require('node:fs');
|
|
||||||
var sleep = require('sleep');
|
|
||||||
|
|
||||||
console.log("Server initalize!");
|
|
||||||
|
|
||||||
app.get('/', (req, res) => {
|
|
||||||
console.log("Init root /");
|
|
||||||
//index.html
|
|
||||||
res.sendFile(__dirname + '/client/index.html');
|
|
||||||
});
|
|
||||||
|
|
||||||
server.listen(serverPort, () => {
|
|
||||||
console.log("Apache server initalized...");
|
|
||||||
console.log('Server started on port', serverPort);
|
|
||||||
triggerDataFetch();
|
|
||||||
});
|
|
||||||
|
|
||||||
io.on('takSearch', (socket) => {
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
async function triggerDataFetch() {
|
|
||||||
while (true) {
|
|
||||||
console.log("Fetching new data...");
|
|
||||||
await fetchData();
|
|
||||||
console.log("Data fetch completed. Wait 5 seconds before next fetch!");
|
|
||||||
await sleep.usleep(5000000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchData() {
|
|
||||||
try {
|
|
||||||
const response = await axios.get(url);
|
|
||||||
if (response.status === 200) {
|
|
||||||
const lines = response.data.split('\n');
|
|
||||||
lines.forEach(line => {
|
|
||||||
if (line) {
|
|
||||||
const data = line.split(',');
|
|
||||||
if (data.length >= 9) {
|
|
||||||
try {
|
|
||||||
const transportType = parseInt(data[0]);
|
|
||||||
const lineNumber = parseInt(data[1]);
|
|
||||||
const longitude = parseInt(data[2]) / 1000000;
|
|
||||||
const latitude = parseInt(data[3]) / 1000000;
|
|
||||||
const tak = data[6];
|
|
||||||
|
|
||||||
let transportTypeDecoded;
|
|
||||||
switch (transportType) {
|
|
||||||
case 1:
|
|
||||||
transportTypeDecoded = "TROLL";
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
transportTypeDecoded = "BUS";
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
transportTypeDecoded = "TRAM";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
transportTypeDecoded = "Unknown";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
console.log("Transport Type:", transportTypeDecoded);
|
|
||||||
console.log("Line Number:", lineNumber);
|
|
||||||
console.log("Latitude:", latitude);
|
|
||||||
console.log("Longitude:", longitude);
|
|
||||||
console.log("Decoded address:");
|
|
||||||
console.log("TAK:", tak);
|
|
||||||
console.log();
|
|
||||||
} catch (error) {
|
|
||||||
console.log("Invalid data format!", line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
console.log("Data fetch fail! Got status:", response.status);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Error fetching data:", error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Bus Location Finder</title>
|
|
||||||
<style>
|
|
||||||
#map {
|
|
||||||
height: 1000px;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<h2>Bus Location Finder</h2>
|
|
||||||
<form id="search-form">
|
|
||||||
<label for="bus-id">Enter Bus ID (TAK):</label>
|
|
||||||
<input type="text" id="bus-id" name="bus-id">
|
|
||||||
<button type="submit">Search</button>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<div id="map"></div>
|
|
||||||
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/leaflet.js"></script>
|
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/leaflet.css" />
|
|
||||||
|
|
||||||
<script src="/socket.io/socket.io.js"></script>
|
|
||||||
<script>
|
|
||||||
const socket = io();
|
|
||||||
|
|
||||||
// Stuff for the map
|
|
||||||
var map = L.map('map').setView([59.4370, 24.7536], 12);
|
|
||||||
|
|
||||||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
|
||||||
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
|
|
||||||
}).addTo(map);
|
|
||||||
|
|
||||||
// Function to handle form submission
|
|
||||||
document.getElementById('search-form').addEventListener('submit', function(event) {
|
|
||||||
var tak = document.getElementById('bus-id').value.trim();
|
|
||||||
socket.emit('takSearch', tak);
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let serverPort = 3000;
|
|
||||||
const url = "http://transport.tallinn.ee/gps.txt";
|
|
||||||
|
|
||||||
const express = require('express');
|
|
||||||
const { fstat } = require('fs');
|
|
||||||
const app = express();
|
|
||||||
const http = require('http');
|
|
||||||
const server = http.createServer(app);
|
|
||||||
const { Server } = require("socket.io");
|
|
||||||
const io = new Server(server);
|
|
||||||
const axios = require('axios');
|
|
||||||
const fs = require('node:fs');
|
|
||||||
var sleep = require('sleep');
|
|
||||||
|
|
||||||
console.log("Server initalize!");
|
|
||||||
|
|
||||||
app.get('/', (req, res) => {
|
|
||||||
console.log("Init root /");
|
|
||||||
//index.html
|
|
||||||
res.sendFile(__dirname + '/client/index.html');
|
|
||||||
});
|
|
||||||
|
|
||||||
server.listen(serverPort, () => {
|
|
||||||
console.log("Apache server initalized...");
|
|
||||||
console.log('Server started on port', serverPort);
|
|
||||||
//triggerDataFetch();
|
|
||||||
});
|
|
||||||
|
|
||||||
io.on('connection', (socket) => {
|
|
||||||
console.log("Got connection from user! Waiting for taksearch...")
|
|
||||||
socket.on('takSearch', (tak) => {
|
|
||||||
console.log(tak);
|
|
||||||
console.log(triggerDataFetch(tak));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function triggerDataFetch(tak) {
|
|
||||||
console.log("Fetching new data...");
|
|
||||||
const data = fetchData();
|
|
||||||
console.log("Data fetch completed.");
|
|
||||||
const filteredData = data.filter(item => item.tak === tak);
|
|
||||||
return filteredData;
|
|
||||||
//await io.emit('takSearch', filteredData);
|
|
||||||
// this part is only for when it is continuous
|
|
||||||
//console.log("Data fetch completed. Wait 5 seconds before next fetch!");
|
|
||||||
//await sleep.usleep(5000000);
|
|
||||||
// also add while true cycle
|
|
||||||
}
|
|
||||||
|
|
||||||
function fetchData() {
|
|
||||||
try {
|
|
||||||
const response = axios.get(url);
|
|
||||||
if (response.status == 200) {
|
|
||||||
const lines = response.data.split('\n');
|
|
||||||
const result = [];
|
|
||||||
lines.forEach(line => {
|
|
||||||
if (line) {
|
|
||||||
const data = line.split(',');
|
|
||||||
if (data.length >= 9) {
|
|
||||||
try {
|
|
||||||
const transportType = parseInt(data[0]);
|
|
||||||
const lineNumber = parseInt(data[1]);
|
|
||||||
const longitude = parseInt(data[2]) / 1000000;
|
|
||||||
const latitude = parseInt(data[3]) / 1000000;
|
|
||||||
const tak = data[6];
|
|
||||||
|
|
||||||
let transportTypeDecoded;
|
|
||||||
switch (transportType) {
|
|
||||||
case 1:
|
|
||||||
transportTypeDecoded = "TROLL";
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
transportTypeDecoded = "BUS";
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
transportTypeDecoded = "TRAM";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
transportTypeDecoded = "Unknown";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
result.push({
|
|
||||||
transportType: transportTypeDecoded,
|
|
||||||
lineNumber,
|
|
||||||
longitude,
|
|
||||||
latitude,
|
|
||||||
tak
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.log("Invalid data format!", line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
console.log("Data fetch fail! Got status:", response.status);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Error fetching data:", error);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
get url transport.tallinn.ee/gps.txt
|
|
||||||
3,2,24786250,59429980,,302,98,Z,146
|
|
||||||
a,b,c,d,,f,g
|
|
||||||
a= 3: tram ; 2=bus ; 1: troll
|
|
||||||
b= line
|
|
||||||
c= long
|
|
||||||
d= lat
|
|
||||||
g= TAK
|
|
Reference in New Issue
Block a user