박재우
10 months ago
3 changed files with 281 additions and 0 deletions
@ -0,0 +1,47 @@
|
||||
const net = require('net'); |
||||
|
||||
|
||||
const getConnection = (connName, host, port) => { |
||||
const client = net.connect({port: port, host: host}, function () { |
||||
console.log(connName + ' Connected: '); |
||||
console.log(' local = %s:%s', this.localAddress, this.localPort); |
||||
console.log(' remote = %s:%s', this.remoteAddress, this.remotePort); |
||||
this.setTimeout(500); |
||||
this.setEncoding('utf8'); |
||||
this.on('data', function (data) { |
||||
console.log(connName + " From Server: " + data.toString()); |
||||
// this.end();
|
||||
}); |
||||
this.on('end', function () { |
||||
console.log(connName + ' Client disconnected'); |
||||
}); |
||||
this.on('error', function (err) { |
||||
console.log('Socket Error: ', err, JSON.stringify(err)); |
||||
}); |
||||
this.on('timeout', function () { |
||||
console.log('Socket Timed Out'); |
||||
}); |
||||
this.on('close', function (e) { |
||||
console.log('Socket Closed', e); |
||||
}); |
||||
}); |
||||
return client; |
||||
} |
||||
|
||||
const writeData = (socket, data) => { |
||||
const success = !!socket.write(data); |
||||
// if (success) {
|
||||
// (function (socket, data) {
|
||||
// socket.once('drain', function () {
|
||||
// writeData(socket, data);
|
||||
// });
|
||||
// })(socket, data);
|
||||
// }
|
||||
} |
||||
|
||||
// const Dwarves = getConnection("Dwarves");
|
||||
// writeData(Dwarves, JSON.stringify(sampleData));
|
||||
|
||||
|
||||
|
||||
module.exports = {getConnection, writeData} |
@ -0,0 +1,146 @@
|
||||
// degree -> radian 변환
|
||||
const deg2rad = deg => { |
||||
return deg * (Math.PI / 180); |
||||
}; |
||||
const rad2deg = rad => { |
||||
return rad * (180 / Math.PI); |
||||
}; |
||||
// 좌표간 거리계산
|
||||
const getDistanceFromCoordByMeter = (coord1, coord2) => { |
||||
const R = 6371; // Radius of the earth in km
|
||||
const dLat = deg2rad(coord2[0] - coord1[0]); // deg2rad below
|
||||
const dLon = deg2rad(coord2[1] - coord1[1]); |
||||
const a = |
||||
Math.sin(dLat / 2) * Math.sin(dLat / 2) + |
||||
Math.cos(deg2rad(coord1[0])) * |
||||
Math.cos(deg2rad(coord2[0])) * |
||||
Math.sin(dLon / 2) * |
||||
Math.sin(dLon / 2); |
||||
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); |
||||
// var d = R * c; // Distance in km
|
||||
const d = R * c * 1000; // Distance in m
|
||||
return d; |
||||
}; |
||||
// 두 좌표사이 특정 거리만큼의 좌표 추출
|
||||
const getCoordsFormBetweenCoord = (coord1, coord2, dist) => { |
||||
// console.log('init ===> ', {coord1, coord2, dist})
|
||||
const r = []; |
||||
// 처음 좌표
|
||||
r.push(coord1); |
||||
// 중간 좌표
|
||||
const totalDist = getDistanceFromCoordByMeter(coord1, coord2); |
||||
const dx = coord2[0] - coord1[0]; |
||||
const singX = dx < 0 ? -1 : 1; |
||||
const dy = coord2[1] - coord1[1]; |
||||
const singY = dy < 0 ? -1 : 1; |
||||
const m = dy / dx; |
||||
const rad = Math.atan(m); |
||||
|
||||
const currentTotalDist = Math.sqrt(dx ** 2 + dy ** 2); |
||||
const currentDivDist = (dist * currentTotalDist) / totalDist; |
||||
const div = Math.floor(currentTotalDist / currentDivDist); |
||||
|
||||
for (let i = 1; i <= div; i++) { |
||||
const currentDist = currentDivDist * i; |
||||
let x = coord1[0]; |
||||
let y = coord1[1]; |
||||
// var heading = Math.atan2(dy, dx) * 180 / Math.PI;
|
||||
// if (heading < 0) {
|
||||
// heading += 360;
|
||||
// }
|
||||
if (dx === 0) { |
||||
y += currentDist * singY; |
||||
} else if (dy === 0) { |
||||
x += currentDist * singX; |
||||
} else { |
||||
const angle = Math.atan2(dy, dx); |
||||
x += Math.cos(angle) * currentDist; |
||||
y += Math.sin(angle) * currentDist; |
||||
} |
||||
const heading = calculateHeading( |
||||
r[r.length - 1][0], |
||||
r[r.length - 1][1], |
||||
x, |
||||
y |
||||
); |
||||
r.push([x, y, heading]); |
||||
} |
||||
// 마지막 좌표
|
||||
r.push(coord2); |
||||
return r; |
||||
}; |
||||
|
||||
function calculateHeading(x1, y1, x2, y2) { |
||||
var dx = x2 - x1; |
||||
var dy = y2 - y1; |
||||
var heading = (Math.atan2(dy, dx) * 180) / Math.PI; |
||||
if (heading < 0) { |
||||
heading += 360; |
||||
} |
||||
return heading; |
||||
} |
||||
|
||||
const dumyData = { |
||||
authKey: '1cc2e08e-0c5c-43b2-8d4d-cddd3de558e3', |
||||
terminalId: 'SANDBOX-01', |
||||
command: 'SANDBOX', |
||||
body: [ |
||||
{ |
||||
objectId: 'JAL497', |
||||
lat: 37.52097, |
||||
lon: 126.6146, |
||||
elevType: 'M', |
||||
elev: 125.4, |
||||
speedType: 'KM', |
||||
speed: 145.8, |
||||
heading: 227.94, |
||||
terminalRcvDt: '20210629173145', |
||||
betteryLevel: 91, |
||||
betteryVoltage: 50, |
||||
dronStatus: 'TAKEOFF', |
||||
moveDistance: 120, |
||||
moveDistanceType: 'M', |
||||
sensorCo: 100.11, |
||||
sensorSo2: 200.22, |
||||
sensorNo2: 300.33, |
||||
sensorO3: 400.44, |
||||
sensorDust: 500.55 |
||||
} |
||||
] |
||||
}; |
||||
|
||||
module.exports = { |
||||
getDistanceFromCoordByMeter, |
||||
deg2rad, |
||||
getCoordsFormBetweenCoord, |
||||
dumyData |
||||
}; |
||||
|
||||
const test = () => { |
||||
const coord1 = [37.521, 126.6082]; |
||||
// const coord2 = [37.5210, 126.6057]; // x 절편
|
||||
const coord2 = [37.52, 126.6082]; // y 절편
|
||||
// const coord2 = [37.5220, 126.6057]; // 일반
|
||||
const r = getCoordsFormBetweenCoord(coord1, coord2, 10); |
||||
console.log(r); |
||||
for (let i = 1; i < r.length; i++) { |
||||
const dist = getDistanceFromCoordByMeter(r[i - 1], r[i]); |
||||
console.log(dist); |
||||
} |
||||
}; |
||||
|
||||
// test();
|
||||
|
||||
const test2 = () => { |
||||
let m = 10.5 / 14; |
||||
console.log(3 / 4, 13.5 / 18, (13.5 - 3) / (18 - 4)); |
||||
let rad = Math.atan(m); |
||||
let tan = Math.tan(rad); |
||||
let cos = Math.cos(rad); |
||||
let sin = Math.sin(rad); |
||||
console.log({ rad, tan, cos, sin }); |
||||
let x = Math.cos(rad) * 15; |
||||
let y = Math.sin(rad) * 15; |
||||
console.log({ x, y }); |
||||
}; |
||||
// test2();
|
@ -0,0 +1,88 @@
|
||||
const { getConnection, writeData } = require('./pav-client'); |
||||
const { getCoordsFormBetweenCoord, dumyData } = require('./pav-utils'); |
||||
|
||||
// const host = '192.168.0.30';
|
||||
const host = 'localhost'; |
||||
// const host = '211.253.11.189';
|
||||
const port = 8082; |
||||
|
||||
// 기본정보
|
||||
const prefix = 'PALUTM-'; |
||||
|
||||
const pathSampleCoord = [ |
||||
[37.523771, 126.720982], |
||||
[37.524841, 126.723106], |
||||
[37.524337, 126.72333], |
||||
[37.524841, 126.723106], |
||||
[37.523771, 126.720982] |
||||
]; |
||||
// const pathSampleCoord = [
|
||||
// [42.5515, 126.655],
|
||||
// [42.5515, 126.655],
|
||||
// [42.5515, 126.655],
|
||||
// [42.5515, 126.655],
|
||||
// [42.5515, 126.655],
|
||||
// [42.5515, 126.655],
|
||||
// [42.5515, 126.655],
|
||||
// [42.5515, 126.655],
|
||||
// [42.5515, 126.655],
|
||||
// [42.5515, 126.655]
|
||||
// ];
|
||||
const divDist = 10; // [m]
|
||||
|
||||
// 특정거리에 따른 좌표 추출
|
||||
const getCoords = coords => { |
||||
if (!coords || coords.length < 1) return; |
||||
const totalCoords = []; |
||||
for (let j = 1; j < 500; j++) { |
||||
for (let i = 1; i < coords.length; i++) { |
||||
const divCoords = getCoordsFormBetweenCoord( |
||||
coords[i - 1], |
||||
coords[i], |
||||
divDist |
||||
); |
||||
totalCoords.push(...divCoords); |
||||
} |
||||
} |
||||
return totalCoords; |
||||
}; |
||||
|
||||
const getClient = () => { |
||||
const dronName = prefix + '010'; |
||||
|
||||
const client = {}; |
||||
client.dronName = dronName; |
||||
client.socket = getConnection(dronName, host, port); |
||||
client.data = getCoords(pathSampleCoord); |
||||
return client; |
||||
}; |
||||
|
||||
const sendData = (client, cnt) => { |
||||
const data = { |
||||
...dumyData, |
||||
terminalId: client.dronName, |
||||
body: [ |
||||
{ |
||||
...dumyData.body[0], |
||||
objectId: client.dronName, |
||||
lat: client.data[cnt][0], |
||||
lon: client.data[cnt][1], |
||||
heading: client.data[cnt][2] |
||||
} |
||||
] |
||||
}; |
||||
writeData(client.socket, JSON.stringify(data)); |
||||
iteratorSendData(++cnt); |
||||
}; |
||||
|
||||
const client = getClient(); |
||||
|
||||
const iteratorSendData = (cnt = 0) => { |
||||
if (cnt >= client.data.length) { |
||||
client.socket.destroy(); |
||||
return; |
||||
} |
||||
setTimeout(() => sendData(client, cnt), 1000); |
||||
}; |
||||
|
||||
iteratorSendData(); |
Loading…
Reference in new issue