const net = require('net');
const iconv = require('iconv-lite');
//const car = require('./car32960.js');
const TCP_PORT = 29102;
const jsonrpc = "2.0";
const timeout = 30 * 1000;
let clients = [];
const log = console.log;
console.log = function (...args) {
log(new Date().toLocaleString() + " \x1b[32mINFO\x1b[37m", ...args);
};
const errorLog = console.error;
console.error = function (...args) {
errorLog(new Date().toLocaleString() + " \x1b[31mERROR\x1b[37m", ...args);
};
// 创建TCP服务器
const server = net.createServer((socket) => {
socket.setTimeout(timeout);
console.log('终端已连接:', {
remoteAddress: socket.remoteAddress,
remoteFamily: socket.remoteFamily,
remotePort: socket.remotePort,
localAddress: socket.localAddress,
localPort: socket.localPort
});
clients.push(socket);
// 监听数据接收事件
socket.on('data', (data) => {
socket.setTimeout(timeout);
json = JSON.parse(iconv.decode(data, 'gbk'));
if (json.eqCode && !socket.eqCode) {
socket.eqCode = json.eqCode;
}
//console.log("终端【" + (socket.eqCode || '') + "】上报数据:", json);
var responseData = parse(socket, json);
// var message = json.car;
// if (message) {
// car.parse32960(socket, message);
// }
if (responseData) {
socket.write(JSON.stringify(responseData));
}
});
// 监听连接关闭事件
socket.on('end', () => {
console.log('终端已断开:', {
remoteAddress: socket.remoteAddress,
remoteFamily: socket.remoteFamily,
remotePort: socket.remotePort,
localAddress: socket.localAddress,
localPort: socket.localPort
});
clients = clients.filter((client) => client !== socket);
});
socket.on('timeout', () => {
console.log('终端连接超时,关闭连接');
socket.end();
});
// 监听错误事件
socket.on('error', (err) => {
console.error('Socket错误:', err);
});
});
// 设置服务器监听端口
server.listen(TCP_PORT, () => {
console.log(`终端上报TCP端口:${TCP_PORT}`);
});
// 监听服务器错误事件
server.on('error', (err) => {
console.error('终端监听服务错误:', err);
});
function parse(socket, data) {
var responseData;
var id = data && data.id || 0;
switch(id) {
case 101:{ // 读取串口配置
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】读取串口配置成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】读取串口配置异常:", data);
}
break;
}
case 102:{ // 下发串口配置
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】下发串口配置成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】下发串口配置异常:", data);
}
break;
}
case 103:{ // 读取CAN配置
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】读取CAN配置成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】读取CAN配置异常:", data);
}
break;
}
case 104:{ // 下发CAN配置
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】下发CAN配置成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】下发CAN配置异常:", data);
}
break;
}
case 105:{ // 读取CAN滤波字组
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】读取CAN滤波字组成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】读取CAN滤波字组异常:", data);
}
break;
}
case 106:{ // 下发CAN滤波字组
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】下发CAN滤波字组成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】下发CAN滤波字组异常:", data);
}
break;
}
case 107:{ // 读取TCP配置
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】读取TCP配置成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】读取TCP配置异常:", data);
}
break;
}
case 108:{ // 下发TCP配置
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】下发TCP配置成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】下发TCP配置异常:", data);
}
break;
}
case 109:{ // 重启结果
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】重启成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】重启异常:", data);
}
break;
}
case 1010:{ // 校时结果
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】校时成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】校时异常:", data);
}
break;
}
case 112:{ // 固件升级响应
if (data && data.result && data.result.status === "success") {
console.log("终端【" + (socket.eqCode || '') + "】固件升级响应成功:", data);
} else {
console.error("终端【" + (socket.eqCode || '') + "】固件升级响应异常:", data);
}
break;
}
default: {
var method = data && data.method || '';
switch(method) {
case "register":{ // 上报注册
console.log("终端【" + (socket.eqCode || '') + "】注册:", data);
upgrade(socket.eqCode,"ab1","1.0.0");
break;
}
case "heartbeat":{ // 上报心跳
console.log("终端【" + (socket.eqCode || '') + "】心跳:", data);
break;
}
case "RequestFileData":{ // 固件下载请求
console.log("终端【" + (socket.eqCode || '') + "】固件下载:", data);
responseData = {};
responseData.jsonrpc = jsonrpc;
responseData.id = id;
responseData.eqCode = data.eqCode || socket.eqCode;
responseData.result = {};
responseData.result.status = "success";
const fileBuffer = fs.readFileSync("upgrade/" + data.params.name);
const offset = data.params.offset;
const size = data.params.size;
responseData.result.offset = offset;
responseData.result.size = size;
responseData.result.data = Buffer.from(fileBuffer.slice(offset,offset + size)).toString('base64');
responseData.result.crc32 = zlib.crc32(responseData.result.data);
console.log("终端【" + (socket.eqCode || '') + "】固件下载数据:", responseData);
break;
}
case "ReportUpdateResult":{ // 上报更新结果
console.log("终端【" + (socket.eqCode || '') + "】固件更新结果:", data);
if (data && data.params && data.params.ret === "success") {
solidify(data.eqCode || socket.eqCode,1);
}
responseData = {};
responseData.jsonrpc = jsonrpc;
responseData.id = id;
responseData.eqCode = data.eqCode || socket.eqCode;
responseData.result = {};
responseData.result.status = "success";
break;
}
default: {
//console.log("终端数据未解析【" + id + "】:", data);
if (data && data.error) {
console.error("终端【" + (socket.eqCode || '') + "】上报数据:", data);
} else {
console.log("终端【" + (socket.eqCode || '') + "】上报数据:", data);
}
break;
}
}
}
}
return responseData;
};
function solidify(eqCode,action) {
json = {};
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "StartSolidify";
json.eqCode = eqCode;
json.id = 116;
json.params = {};
json.params.action = action;
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】固化固件:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "设备固化已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】固化固件失败,未找到设备:", json);
}
return json;
}
function upgrade(eqCode,name,version) {
json = {};
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "StartUpdate";
json.eqCode = eqCode;
json.id = 112;
json.params = {};
json.params.version = version;
const filePath = "upgrade/" + name;
const stats = fs.statSync(filePath);
json.params.name = name;
json.params.size = stats.size;
const fileBuffer = fs.readFileSync(filePath);
const crc32 = zlib.crc32(fileBuffer);
json.params.crc32 = crc32;
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】固件升级:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "设备固件升级已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "平台下发【" + eqCode + "】固件升级失败,未找到设备" + eqCode;
}
return json;
}
const express = require('express');
const fs = require('fs');
const path = require('path');
const zlib = require('zlib');
const SERVER_PORT = 29103;
const app = express();
app.listen(SERVER_PORT, () => console.log(`平台下发HTTP端口:${SERVER_PORT}`))
app.get('/readUart', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var value = req.query && req.query.value || 'uart1';
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "getUartPara";
json.eqCode = eqCode;
json.id = 101;
json.params = {};
json.params.name = value;
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】读取串口配置:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "读取串口配置已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】读取串口配置失败,未找到设备:", json);
}
res.json(json);
});
app.get('/setUart', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var config = req.query && req.query.config;
if (!config) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数config为空";
res.json(json);
return;
}
var value = req.query && req.query.value || 'uart1';
if (config.indexOf("{") !== 0 || config.lastIndexOf("}") < 0) {
json.errorCode = 1;
json.result = "Error";
json.message = "参数config数据格式错误";
res.json(json);
return;
}
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "setUartPara";
json.eqCode = eqCode;
json.id = 102;
json.params = {};
json.params.name = value;
json.config = JSON.parse(config);
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】串口配置:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "串口配置已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】串口配置失败,未找到设备:", json);
}
res.json(json);
});
app.get('/readCan', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var value = req.query && req.query.value || 'can1';
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "getCanPara";
json.eqCode = eqCode;
json.id = 103;
json.params = {};
json.params.name = value;
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】读取CAN配置:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "读取CAN配置已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】读取CAN配置失败,未找到设备:", json);
}
res.json(json);
});
app.get('/setCan', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var config = req.query && req.query.config;
if (!config) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数config为空";
res.json(json);
return;
}
var value = req.query && req.query.value || 'can1';
if (config.indexOf("{") !== 0 || config.lastIndexOf("}") < 0) {
json.errorCode = 1;
json.result = "Error";
json.message = "参数config数据格式错误";
res.json(json);
return;
}
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "setCanPara";
json.eqCode = eqCode;
json.id = 104;
json.params = {};
json.params.name = value;
json.config = JSON.parse(config);
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】CAN配置:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "CAN配置已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】CAN配置失败,未找到设备:", json);
}
res.json(json);
});
app.get('/readCanLvBo', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var value = req.query && req.query.value || 'can1';
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "getCanLvBoPara";
json.eqCode = eqCode;
json.id = 105;
json.params = {};
json.params.name = value;
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】读取CAN滤波字组:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "读取CAN滤波字组已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】读取CAN滤波字组失败,未找到设备:", json);
}
res.json(json);
});
app.get('/setCanLvBo', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var config = req.query && req.query.config;
if (!config) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数config为空";
res.json(json);
return;
}
var value = req.query && req.query.value || 'can1';
if (config.indexOf("{") !== 0 || config.lastIndexOf("}") < 0) {
json.errorCode = 1;
json.result = "Error";
json.message = "参数config数据格式错误";
res.json(json);
return;
}
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "setCanLvBoPara ";
json.eqCode = eqCode;
json.id = 106;
json.params = {};
json.params.name = value;
json.config = JSON.parse(config);
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】CAN滤波字组:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "CAN滤波字组已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】CAN滤波字组失败,未找到设备:", json);
}
res.json(json);
});
app.get('/readTcp', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var value = req.query && req.query.value || 'tcp1';
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "getTcpPara";
json.eqCode = eqCode;
json.id = 107;
json.params = {};
json.params.name = value;
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】读取TCP配置:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "读取TCP配置已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】读取TCP配置失败,未找到设备:", json);
}
res.json(json);
});
app.get('/setTcp', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var config = req.query && req.query.config;
if (!config) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数config为空";
res.json(json);
return;
}
var value = req.query && req.query.value || 'tcp1';
if (config.indexOf("{") !== 0 || config.lastIndexOf("}") < 0) {
json.errorCode = 1;
json.result = "Error";
json.message = "参数config数据格式错误";
res.json(json);
return;
}
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "setTcpPara";
json.eqCode = eqCode;
json.id = 108;
json.params = {};
json.params.name = value;
json.config = JSON.parse(config);
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】TCP配置:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "TCP配置已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】TCP配置失败,未找到设备:", json);
}
res.json(json);
});
app.get('/restart', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "reboot";
json.eqCode = eqCode;
json.id = 109;
json.params = {};
json.params.key = Buffer.from("EQAUTHRST2507001").toString('base64');
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】重启请求:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "设备重启已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】重启失败,未找到设备:", json);
}
res.json(json);
});
app.get('/checkTime', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
json.jsonrpc = jsonrpc;
json.method = "timeSyn";
json.eqCode = eqCode;
json.id = 1010;
json.params = {};
var now = new Date();
json.params.time = now.getFullYear() + "-" +
((now.getMonth() + 1) < 10 ? ("0" + (now.getMonth() + 1)) : (now.getMonth() + 1)) + "-" +
(now.getDate() < 10 ? ("0" + now.getDate()) : now.getDate()) + " " +
(now.getHours() < 10 ? ("0" + now.getHours()) : now.getHours()) + ":" +
(now.getMinutes() < 10 ? ("0" + now.getMinutes()) : now.getMinutes()) + ":" +
(now.getSeconds() < 10 ? ("0" + now.getSeconds()) : now.getSeconds());
client.write(JSON.stringify(json));
console.log("平台下发【" + eqCode + "】校时请求:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "设备校时已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
console.error("平台下发【" + eqCode + "】校时失败,未找到设备:", json);
}
res.json(json);
});
app.get('/upgrade', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var name = req.query && req.query.name || '';
if (!name) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数name为空";
res.json(json);
return;
}
var version = req.query && req.query.version || "1.0.0";
json = upgrade(eqCode,name,version);
res.json(json);
});
app.get('/solidify', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var action = req.query && req.query.action || 1;
json = solidify(eqCode,action)
res.json(json);
});
app.get('/disconnect', (req, res) => {
var json = {};
var eqCode = req.query && req.query.eqCode || '';
if (!eqCode) {
json.errorCode = 1;
json.result = "Error";
json.message = "必须参数eqCode为空";
res.json(json);
return;
}
var isSend = false;
clients.forEach((client) => {
if (client.eqCode === eqCode) {
client.end();
console.log("平台下发【" + eqCode + "】断开连接:", json);
isSend = true;
}
});
if (isSend === true) {
json.errorCode = 0;
json.result = "Success";
json.message = "设备断开连接已下发";
} else {
json.errorCode = 1;
json.result = "Error";
json.message = "未找到设备" + eqCode;
}
res.json(json);
});
app.get('/log', (req, res) => {
const logFilePath = path.join(__dirname, '../../root/.pm2/logs/shouhuan230-1-out.log'); // 修改为你的日志文件路径
fs.readFile(logFilePath, 'utf8', (err, data) => {
if (err) {
console.error(err);
res.status(500).send('日志文件读取失败');
} else {
res.send(data); // 发送日志内容到客户端
}
});
});
function makeCRCTable() {
let c;
const crcTable = [];
for (let n = 0; n < 256; n++) {
c = n;
for (let k = 0; k < 8; k++) {
c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
}
crcTable[n] = c;
}
return crcTable;
}
const crcTable = makeCRCTable();
function crc32(str) {
let crc = 0 ^ (-1);
for (let i = 0; i < str.length; i++) {
const charCode = str.charCodeAt(i);
crc = (crc >>> 8) ^ crcTable[(crc ^ charCode) & 0xFF];
}
return (crc ^ (-1)) >>> 0;
}
将app.get('/upgrade', (req, res) => {
在vue中调用。