const mytools = require("./mytools");
const mynet = require('net');
const mysql = require('mysql')
// 使用 createPool 建立连接池
var mysqlpool = mysql.createPool({
host: '',
user: '',
password: '',
database: '',
port: ''
});
// 保存客户端
var g_clients = [];
//移除下线的客户端
function delete_client(temp_client_name) {
g_clients = g_clients.filter(cn => {
return cn != temp_client_name;
})
}
// 创建服务器
const server = new mynet.createServer();
server.on('connection', (client) => {
//局部客户端变量
let client_name = client.remoteAddress + ":" + client.remotePort;
g_clients.push(client_name);
//设置超时时间为60秒(单位毫秒)因为设备间隔3s发送一次数据
client.setTimeout(60 * 1000);
client.on('timeout', () => {
delete_client(client_name);
mytools.logger().info(`客户端${client_name}超时,从客户端列表中删除!`);
client.end();
});
client.on('data', function (msg) { //接收client发来的信息
mytools.logger().info(`收到${client_name}:`, msg);
if (!mytools.checkBuffer(msg)) {
mytools.logger().info(`校验错误,系统自动返回! ${client_name}:`, msg);
} else {
let t_request = new mytools.myRequest();
t_request.setBuffer(msg)
let t_msg = mytools.getResponse(msg);
mysqlpool.getConnection(function (err, connection) {
//if (err) mytools.logger().info('MySQL数据库建立连接失败。');
if (err) mytools.logger().info(err);
else {
mytools.logger().info('数据库建立连接成功。');
connection.query('INSERT INTO basetb (链路地址,请求帧,响应帧,状态,电流,电场,电压,信号强度) VALUES (?,?,?,?,?,?,?,?)', [t_request.getLianLuDiZhi(), t_request.to16String(), t_msg.toString("hex"), t_request.getStatus(), t_request.getDianLiu(), t_request.getDianChang(), t_request.getDianYa(), t_request.getXinHao()], function (err, data) {
if (err) mytools.logger().info('插入数据操作失败。');
else {
mytools.logger().info(data);
//连接释放很重要。但是不是有人写 mysqlpool.end(); 绝对错误
connection.release();
}
});
}
});
client.write(t_msg, () => {
logger().info(
`写入客户端${client_name}结束,响应值为:` + t_msg.toString('hex'));
});
}
});
client.on('error', function (e) { //监听客户端异常
mytools.logger().info('>>>>>>client error: ' + e);
delete_client(client_name);
client.end();
mytools.logger().info(`客户端${client_name}出错了!`);
mytools.logger().info('<<<<<
});
client.on('close', function () {
mytools.logger().info('>>>>>>client close!');
delete_client(client_name);
mytools.logger().info(`客户端${client_name}下线了!`);
mytools.logger().info('<<<<<
});
});
//这里的0.0.0.0非常重要,指定未ip4格式监听。
//127.0.0.1 localhost 上传到服务器,就无法连接(虽然本地是正常的)
server.listen(7500, '0.0.0.0', function () {
console.log(`服务器运行在:7500`);
});
//每隔10s刷新数据库
setInterval(() => {
//mytools.logger('oth').warn("当前客户端数量:", g_clients.length, "当前活动客户端列表:", g_clients);
}, 90000);
//链接终止指令,不要调用