飞鱼星官方日志服务器为win软件,无法顺利在linux上运行,甚至在win7上运行也无法成功
废话少说,简单记录
0、选型:nodejs(dgram、mysql)、mysql、forever
1、安装nodejs、npm(win、linux),自行脑补
2、抓包udp,使用到了wireshark 下载地址https://1.na.dl.wireshark.org/win64/Wireshark-win64-2.2.4.exe
分析包内容 type1:4Byte,type2:4Byte,ip:32Byte,msg:剩余,端口:服务器20000,客户端2000
3、分析官方vls数据表结构得到基本元素(ip,type1,type2,msg)(最终没使用其官方表结构)
4、创建项目目录/path/to/vls,初始化项目,否则npm报错(win),npm init -f
5、npm安装dgram以处理UDP包npm install dgram -g
6、npm安装mysql以连接数据库npm install mysql -g
7、服务端代码后附
8、防火墙(如果有,请开放200000端口,请自行脑补)
9、安装forever npm install forever -g
10、创建自启动脚本/etc/init.d/vls并设置可执行权限,代码后附
11、启动service vls start
12、设置开机自启动chkconfig vls on
服务端代码
const dgram = require('dgram');
const server = dgram.createSocket('udp4');
const mysql = require('mysql');
var conn = mysql.createConnection(
{host:'localhost', user:'root', password:'', database:'vls', port:'3306'}//修改成自己的数据库信息
);
conn.connect();
server.on('error', function(err) {
console.log('server error:\n'+$err.stack);
server.close();
});
server.on('message', function (msg, rinfo) {
if(rinfo.address=='*.*.*.*' && rinfo.port=='2000'){//修改成设备ip
var s1 = msg.slice(0,4);
var s2 = msg.slice(4,8);
var s3 = msg.slice(8,40);
var s4 = msg.slice(40);
conn.query('insert into test (ip,type1,type2,msg) values(?, ?, ?, ?)',[s3.toString().replace(/\s+$/g,""),s1.readInt32BE(0),s2.toString('hex'),s4.toString().replace(/\s+$/g,"")],function(error,results,fields){});
console.log('server got: %d from %s:%d',msg.length,rinfo.address,rinfo.port);
}
});
server.on('listening', function() {
var address = server.address();
console.log('server listening %s:%d',address.address,address.port);
});
server.on('close', function(msg) {
console.log('server has been closed %s',msg);
});
server.bind(20000);
自启动脚本
#!/bin/bash
#
# node Start up node server daemon
#
# chkconfig: 345 85 15
# description: Forever for Node.js
#
PATH=/usr/bin
DEAMON=/path/to/vls/vls.js
LOG=/var/log/vls
PID=/var/run/vls.pid
case "$1" in
start)
forever start -l $LOG/vls.log -o $LOG/vls_out.log -e $LOG/vls_err.log --pidFile $PID -a $DEAMON
;;
stop)
forever stop --pidFile $PID $DEAMON
;;
stopall)
forever stopall --pidFile $PID
;;
restartall)
forever restartall --pidFile $PID
;;
reload|restart)
forever restart -l $LOG/vls.log -o $LOG/vls_out.log -e $LOG/vls_err.log --pidFile $PID -a $DEAMON
;;
list)
forever list
;;
*)
echo "Usage: /etc.init.d/vls {start|stop|restart|reload|stopall|restartall|list}"
exit 1
;;
esac
exit 0
数据库(索引自己加)
create table vls (id bigint(20) auto_increment primary key, ip char(15) not null default '',type1 int(8) not null default 0,type2 binary(8) not null default '\0\0\0\0\0\0\0\0',msg char(576) not null default '',dateline timestamp not null default CURRENT_TIMESTAMP);
更深入的分析请自行脑补