Nodejs 关于定位器数据的处理,我搞了几日都没处理好,希望大家可以帮忙。
Nodejs 关于定位器数据的处理,我搞了几日都没处理好,希望大家可以帮忙。
// 原来的数据为:
//#IMEI##0#0000#AUT#1#V#01847.2238,E,4524.3144,N,000.0,259#100912#203039##
//需要转换为:
//IMEI#0#0000#AUT#1#V#01847.2238#E#4524.3144#N#000.0#259#100912#203039
var config = require(’./config’);
var net = require(‘net’);
var mysql_driver = require(‘mysql’);
var mysql = mysql_driver.createConnection(config.db);
mysql.connect();
// Set the timezone to UTsdfsdfC as that’s what comes back from the tracker
mysql.query(“SET time_zone = '”+config.time_offset+"’");
// This stores the previous point by IMEI to prevent DB duplication
var cache = {};
// Build the cache
var csql = “SELECT * FROM (SELECT imei,lon,lat FROM logs ORDER BY id DESC) sub GROUP BY imei”;
mysql.query(csql, function(err, rows, fields) {
for (key in rows) {
cache[rows[key].imei] = {};
cache[rows[key].imei].lon = rows[key].lon;
cache[rows[key].imei].lat = rows[key].lat;
}
});
var server = net.createServer(function© {
console.log('Client connected from ’ + c.remoteAddress);
var buffer,hash_expected,replened;
var reset = function() {
buffer = '';
hash_expected = 6;
replened = false;
}
reset();
c.on('data', function(data) {
var str = data.toString();
for (var i = 0; i < str.length; i++) {
var char = str.charAt(i);
if (char == '#') {
hash_expected--;
}
buffer += char;
if (hash_expected == 0) {
if (!replened) {
hash_expected += (parseInt(str.charAt(i+1)) * 4) + 2;
replened = true;
}
else {
var split = buffer.split('#');
var datum = {
'imei' : split[1],
'data_type' : split[5],
'points' : [],
};
for (var j = 0; j < parseInt(split[6]); j++) {
offset = 6 + (j * 4);
var loc_split = split[offset + 2].split(',');
function date(part) {
var date = split[offset + 3];
return date.substring(part * 2, (part * 2) + 2);
}
function time(part) {
var time = split[offset + 4];
return time.substring(part * 2, (part * 2) + 2);
}
function convert_coord(coord, direction) {
var dot = coord.indexOf('.');
var deg = parseInt(coord.substring(0, dot - 2));
var mins = parseFloat(coord.substring(dot - 2));
return (deg + (mins / 60)) * ((direction == 'S' || direction == 'W') ? -1 : 1);
}
datum.points.push({
'type' : split[offset + 1],
'lon' : convert_coord(loc_split[0], loc_split[1]),
'lat' : convert_coord(loc_split[2], loc_split[3]),
'speed' : parseFloat(loc_split[4]),
'direction' : parseFloat(loc_split[5]),
'date' : '20'+date(2)+'-'+date(1)+'-'+date(0),
'time' : time(0)+':'+time(1)+':'+time(2),
});
}
var val_strings = [];
var new_end = 0;
for (key in datum.points) {
// Ignore invalid points
if (!isNaN(datum.points[key].lon) && !isNaN(datum.points[key].lat)) {
if (cache.hasOwnProperty(datum.imei) && cache[datum.imei].lon == datum.points[key].lon && cache[datum.imei].lat == datum.points[key].lat) {
new_end = datum.points[key].date+' '+datum.points[key].time;
}
else {
if (cache.hasOwnProperty(datum.imei)) {
var lat_orig = cache[datum.imei].lat;
var lon_orig = cache[datum.imei].lon;
var lat_cur = datum.points[key].lat;
var lon_cur = datum.points[key].lon;
val_strings.push('("'+datum.imei+'","'+datum.points[key].type+'",'+datum.points[key].lon+','+datum.points[key].lat+','+datum.points[key].speed+','+datum.points[key].direction+',UNIX_TIMESTAMP("'+datum.points[key].date+' '+datum.points[key].time+'"),UNIX_TIMESTAMP("'+datum.points[key].date+' '+datum.points[key].time+'"), (((ACOS(SIN('+lat_orig+' * PI() / 180) * SIN('+lat_cur+' * PI() / 180) + COS('+lat_orig+' * PI() / 180) * COS('+lat_cur+' * PI() / 180) * COS(('+lon_orig+' - '+lon_cur+') * PI() / 180)) * 180 / PI()) * 60 * 1.1515) * 1609.344))');
}
else {
val_strings.push('("'+datum.imei+'","'+datum.points[key].type+'",'+datum.points[key].lon+','+datum.points[key].lat+','+datum.points[key].speed+','+datum.points[key].direction+',UNIX_TIMESTAMP("'+datum.points[key].date+' '+datum.points[key].time+'"),UNIX_TIMESTAMP("'+datum.points[key].date+' '+datum.points[key].time+'"), 0)');
}
cache[datum.imei] = {lon: datum.points[key].lon, lat: datum.points[key].lat};
}
}
}
if (val_strings.length) {
var sql = 'INSERT INTO logs (imei,type,lon,lat,speed,direction,start_ts,end_ts,distance_moved) VALUES ' + val_strings.join(',');
try {
mysql.query(sql);
}
catch(err) {
console.log(err);
}
console.log("Logged");
}
else if (new_end) {
var sql = 'UPDATE logs SET end_ts=UNIX_TIMESTAMP("'+new_end+'"), time_at_point=(UNIX_TIMESTAMP("'+new_end+'")-start_ts) WHERE imei="'+datum.imei+'" ORDER BY id DESC LIMIT 1';
try {
mysql.query(sql);
}
catch(err) {
console.log(err);
}
console.log("Updated TS");
}
else {
console.log("Failed to Log");
}
reset();
}
}
}
});
});
server.listen(config.listen_port, function() { //‘listening’ listener
console.log(‘Server Bound’);
});
根据你的描述,你遇到了处理定位器数据的问题。以下是一个简化版的Node.js示例代码,用于处理你提到的数据格式转换,并将其存储到MySQL数据库中。
示例代码
const mysql = require('mysql');
const net = require('net');
// MySQL 配置
const config = {
host: 'localhost',
user: 'root',
password: 'password',
database: 'your_database'
};
// 创建MySQL连接
const connection = mysql.createConnection(config);
connection.connect((err) => {
if (err) throw err;
console.log('Connected to MySQL database!');
});
// 初始化缓存
const cache = {};
// 读取数据库中的最后一个点
connection.query("SELECT imei, lon, lat FROM logs ORDER BY id DESC", (err, results) => {
if (err) throw err;
results.forEach(row => {
cache[row.imei] = { lon: row.lon, lat: row.lat };
});
});
// 创建服务器
const server = net.createServer((socket) => {
socket.on('data', (data) => {
const str = data.toString().trim();
// 转换数据格式
const parts = str.split('#');
const formattedData = `${parts[0]}#${parts[2]}#${parts[3]}#${parts[4]}#${parts[5]}#${parts[6]}#${parts[7]}#${parts[8]}#${parts[9]}`;
// 解析并处理数据
const imei = parts[1];
const dataType = parts[5];
const location = parts[7].split(',');
const lon = parseFloat(location[0]);
const lat = parseFloat(location[1]);
const speed = parseFloat(parts[8]);
const direction = parseFloat(parts[9]);
const timestamp = `${parts[10]} ${parts[11]}`;
const dateParts = timestamp.split(' ');
const sql = `INSERT INTO logs (imei, type, lon, lat, speed, direction, start_ts, end_ts, distance_moved)
VALUES (?, ?, ?, ?, ?, ?, UNIX_TIMESTAMP(?), UNIX_TIMESTAMP(?), 0)`;
// 插入数据库
connection.query(sql, [imei, dataType, lon, lat, speed, direction, dateParts[0], dateParts[1]], (err) => {
if (err) throw err;
console.log(`Logged: ${formattedData}`);
});
// 更新缓存
cache[imei] = { lon, lat };
});
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
说明
- 数据格式转换:原始数据通过
str.split('#')
分割成多个部分,然后重新组合成新的格式。 - 解析数据:从分割后的数组中提取必要的字段(如IMEI、位置坐标等)。
- 插入数据库:将解析后的数据插入到MySQL数据库中。
- 缓存更新:每次成功插入数据后,更新缓存以避免重复记录。
注意事项
- 确保你的MySQL数据库已经创建了相应的表结构。
- 根据实际情况调整配置参数(如数据库地址、用户名、密码等)。
- 处理错误和异常情况以确保程序的稳定性。
希望这段代码能帮助你解决定位器数据处理的问题!如果有任何疑问或需要进一步的帮助,请随时提问。
根据你的描述,你希望将定位器数据从一种格式转换为另一种格式。具体来说,你希望将数据从 //#IMEI##0#0000#AUT#1#V#01847.2238,E,4524.3144,N,000.0,259#100912#203039##
转换为 IMEI#0#0000#AUT#1#V#01847.2238#E#4524.3144#N#000.0#259#100912#203039
。
你可以使用以下代码来实现这种转换:
function transformData(input) {
// Split the input string by commas and remove the leading '#' character
const parts = input.split(',').map(part => part.replace(/^#/, ''));
// Join the parts back together with the desired separator
const transformedData = parts.join('#');
return transformedData;
}
const originalData = "#IMEI##0#0000#AUT#1#V#01847.2238,E,4524.3144,N,000.0,259#100912#203039##";
const transformedData = transformData(originalData);
console.log(transformedData); // IMEI#0#0000#AUT#1#V#01847.2238#E#4524.3144#N#000.0#259#100912#203039
这段代码首先将输入字符串按逗号分割成多个部分,并去除每个部分开头的 #
字符。然后将这些部分重新连接在一起,用 #
分隔。这样就可以得到你期望的格式。
如果你有更多关于数据处理的具体需求或问题,请提供更多细节,我会进一步帮助你。