用Node.js和Linux搭建一个简易的4G电子围栏数据接收服务器(附完整源码)

张开发
2026/4/18 11:39:47 15 分钟阅读

分享文章

用Node.js和Linux搭建一个简易的4G电子围栏数据接收服务器(附完整源码)
基于Node.js的4G电子围栏数据接收系统开发实战在物联网和移动通信技术快速发展的今天如何高效采集和分析移动设备数据成为许多开发者关注的重点。本文将详细介绍如何使用Node.js在Linux环境下构建一个轻量级的4G电子围栏数据接收服务器实现IMSI数据的接收、存储和可视化展示。1. 系统架构与环境准备一个完整的4G电子围栏数据接收系统通常由三部分组成前端采集设备、数据传输网络和后端服务器。我们的重点将放在后端服务器的实现上。系统核心组件需求Node.js运行环境建议v14.x或更高版本Express框架处理HTTP请求数据库系统SQLite或MongoDBLinux操作系统Ubuntu Server推荐首先我们需要在Linux系统上配置开发环境# 安装Node.js和npm curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt-get install -y nodejs # 验证安装 node -v npm -v # 安装必要的构建工具 sudo apt-get install -y build-essential对于数据库选择我们有几种方案数据库类型优点缺点适用场景SQLite零配置单文件并发性能有限小型项目快速原型MongoDB文档型扩展性好内存占用较高中大型项目灵活数据模型MySQL成熟稳定需要单独服务传统关系型数据存储2. Express服务器核心实现我们将使用Express框架搭建接收IMSI数据的API服务。首先初始化项目mkdir imsi-server cd imsi-server npm init -y npm install express body-parser sqlite3 cors创建主服务器文件server.jsconst express require(express); const bodyParser require(body-parser); const sqlite3 require(sqlite3).verbose(); const cors require(cors); const app express(); const PORT 3000; // 中间件配置 app.use(cors()); app.use(bodyParser.json()); // 数据库初始化 const db new sqlite3.Database(./imsi.db, (err) { if (err) console.error(err.message); console.log(Connected to the SQLite database.); }); // 创建数据表 db.serialize(() { db.run(CREATE TABLE IF NOT EXISTS imsi_data ( id INTEGER PRIMARY KEY AUTOINCREMENT, imsi TEXT NOT NULL UNIQUE, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, device_info TEXT, location TEXT )); }); // 数据接收API app.post(/api/imsi, (req, res) { const { imsi, device_info, location } req.body; if (!imsi) { return res.status(400).json({ error: IMSI is required }); } db.run( INSERT OR IGNORE INTO imsi_data (imsi, device_info, location) VALUES (?, ?, ?), [imsi, device_info, location], function(err) { if (err) { return res.status(500).json({ error: err.message }); } res.json({ success: true, imsi: imsi, id: this.lastID }); } ); }); // 启动服务器 app.listen(PORT, () { console.log(Server running on port ${PORT}); });这个基础实现包含了数据库连接和表创建数据接收API端点基本错误处理CORS支持用于跨域请求3. 数据安全与性能优化在实际部署中我们需要考虑以下几个关键方面安全措施添加API密钥验证实现请求速率限制数据加密传输HTTPS输入验证和清理性能优化技巧使用连接池管理数据库连接实现批处理插入减少I/O操作添加内存缓存层如Redis启用Gzip压缩响应让我们增强安全性的中间件示例// API密钥验证中间件 const apiKeyAuth (req, res, next) { const apiKey req.headers[x-api-key]; if (!apiKey || apiKey ! process.env.API_KEY) { return res.status(403).json({ error: Invalid API key }); } next(); }; // 应用中间件 app.use(/api/imsi, apiKeyAuth);对于高负载场景我们可以使用PM2进行进程管理npm install pm2 -g pm2 start server.js -i max --name imsi-server pm2 save pm2 startup4. 数据可视化与扩展功能收集到的IMSI数据需要有效的展示方式。我们可以使用EJS模板引擎或单独的前端应用来实现可视化。首先安装必要的依赖npm install ejs chart.js然后扩展服务器以支持数据展示// 设置视图引擎 app.set(view engine, ejs); app.set(views, ./views); // 静态文件服务 app.use(express.static(public)); // 数据查询API app.get(/api/imsi, (req, res) { const limit parseInt(req.query.limit) || 100; const sql SELECT * FROM imsi_data ORDER BY timestamp DESC LIMIT ?; db.all(sql, [limit], (err, rows) { if (err) { return res.status(500).json({ error: err.message }); } res.json(rows); }); }); // 仪表板路由 app.get(/dashboard, (req, res) { res.render(dashboard, { title: IMSI数据仪表板 }); });创建视图文件views/dashboard.ejs!DOCTYPE html html head title% title %/title script srchttps://cdn.jsdelivr.net/npm/chart.js/script style .chart-container { width: 80%; margin: 0 auto; } /style /head body h1% title %/h1 div classchart-container canvas idimsiChart/canvas /div script fetch(/api/imsi?limit50) .then(response response.json()) .then(data { const ctx document.getElementById(imsiChart).getContext(2d); const chart new Chart(ctx, { type: bar, data: { labels: data.map(item new Date(item.timestamp).toLocaleTimeString()), datasets: [{ label: IMSI采集统计, data: data.map((item, index) index 1), backgroundColor: rgba(54, 162, 235, 0.5), borderColor: rgba(54, 162, 235, 1), borderWidth: 1 }] }, options: { scales: { y: { beginAtZero: true } } } }); }); /script /body /html5. 实际部署与运维将开发完成的系统部署到生产环境需要考虑以下因素部署方案对比部署方式优点缺点适用场景物理服务器完全控制高性能维护成本高高安全性要求场景云服务AWS/阿里云弹性扩展管理方便持续成本大多数生产环境容器化Docker环境一致易于部署学习曲线现代应用部署日志管理使用Winston或Morgan记录请求日志设置日志轮转防止磁盘占满实现日志分级info, warn, errorconst winston require(winston); const logger winston.createLogger({ level: info, format: winston.format.json(), transports: [ new winston.transports.File({ filename: error.log, level: error }), new winston.transports.File({ filename: combined.log }) ] }); if (process.env.NODE_ENV ! production) { logger.add(new winston.transports.Console({ format: winston.format.simple() })); } // 在路由中使用 app.post(/api/imsi, (req, res) { logger.info(Received IMSI: ${req.body.imsi}); // ...其余处理逻辑 });监控与告警使用PM2或Kubernetes进行健康检查实现心跳检测API设置资源使用阈值告警# 使用PM2监控 pm2 monit # 设置内存限制自动重启 pm2 start server.js --max-memory-restart 500M在开发过程中我发现使用SQLite作为初始数据库可以快速启动项目但当数据量增长到数十万条记录时查询性能会明显下降。这时可以考虑迁移到MongoDB或PostgreSQL或者对SQLite进行优化-- 添加索引提高查询性能 CREATE INDEX idx_imsi ON imsi_data(imsi); CREATE INDEX idx_timestamp ON imsi_data(timestamp); -- 定期执行VACUUM减少数据库文件大小 VACUUM;

更多文章