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’); });

sipgear


2 回复

根据你的描述,你遇到了处理定位器数据的问题。以下是一个简化版的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');
});

说明

  1. 数据格式转换:原始数据通过str.split('#')分割成多个部分,然后重新组合成新的格式。
  2. 解析数据:从分割后的数组中提取必要的字段(如IMEI、位置坐标等)。
  3. 插入数据库:将解析后的数据插入到MySQL数据库中。
  4. 缓存更新:每次成功插入数据后,更新缓存以避免重复记录。

注意事项

  • 确保你的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

这段代码首先将输入字符串按逗号分割成多个部分,并去除每个部分开头的 # 字符。然后将这些部分重新连接在一起,用 # 分隔。这样就可以得到你期望的格式。

如果你有更多关于数据处理的具体需求或问题,请提供更多细节,我会进一步帮助你。

回到顶部