北斗短报文通信服务平台
This commit is contained in:
135
app/middleware/socket/socketClient.js
Normal file
135
app/middleware/socket/socketClient.js
Normal file
@@ -0,0 +1,135 @@
|
||||
// socket客户端
|
||||
const net = require('net');
|
||||
|
||||
module.exports = (app) => {
|
||||
const { middleware } = app;
|
||||
const packageBuild = middleware.packageBuild;
|
||||
const utils = middleware.utils;
|
||||
const parseDataPackage = middleware.parseDataPackage;
|
||||
const shunt = middleware.shunt;
|
||||
|
||||
const client = new net.Socket();
|
||||
|
||||
let times, connectSwitch = true, reconnectSwitch = false;
|
||||
|
||||
setTimeout(() => {
|
||||
reconnectSwitch = true;
|
||||
}, 66000);
|
||||
|
||||
const createClient = () => {
|
||||
if(connectSwitch) {
|
||||
connectSwitch = false;
|
||||
client.connect(app.config.socketClient.port, app.config.socketClient.ip, () => {
|
||||
console.log(`socket: 连接到服务端: ${app.config.socketClient.ip + ':' + app.config.socketClient.port}`);
|
||||
client.setKeepAlive(true, 60000);
|
||||
reconnectSwitch = true;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
createClient();
|
||||
|
||||
// 重连服务端
|
||||
const reconnect = () => {
|
||||
if (reconnectSwitch) {
|
||||
reconnectSwitch = false;
|
||||
setTimeout(() => {
|
||||
connectSwitch = true;
|
||||
createClient();
|
||||
}, 66000);
|
||||
}
|
||||
};
|
||||
|
||||
client.on('connectTimeout', () => {
|
||||
reconnect();
|
||||
});
|
||||
|
||||
client.on('timeout', () => {
|
||||
reconnect();
|
||||
});
|
||||
|
||||
client.on('end', () => {
|
||||
reconnect();
|
||||
});
|
||||
|
||||
client.on('close', () => {
|
||||
reconnect();
|
||||
});
|
||||
|
||||
client.on('error', (err) => {
|
||||
utils.log('../../../socketLog', err);
|
||||
reconnect();
|
||||
});
|
||||
|
||||
client.on('connect', () => {
|
||||
// 连接成功后的逻辑...
|
||||
client.write(packageBuild.packageBuild(app, [utils.packageItem(2, 100) + utils.packageItem(2, packageBuild.buildXFType100(app.config.socketClient.token).length / 2) + packageBuild.buildXFType100(app.config.socketClient.token)]));
|
||||
});
|
||||
|
||||
client.on('data', async (data) => {
|
||||
// 在这里可以处理从服务器接收到的数据
|
||||
// utils.log('../../../socketLog', data);
|
||||
let msg = parseDataPackage.parseDataPackage(middleware, data.toString('hex').slice(0, data.toString('hex').length - 16));
|
||||
if (msg == utils.intrinsic.heart) {
|
||||
clearTimeout(times);
|
||||
times = setTimeout(() => {
|
||||
client.write(Buffer.from(msg, 'hex'));
|
||||
}, 10000);
|
||||
} else {
|
||||
let nowResult = shunt.socketResult(msg.dataContent.nowData);
|
||||
let resendResult = shunt.socketResult(msg.dataContent.resendData);
|
||||
// 当前消息处理
|
||||
if (nowResult.type == 99) {
|
||||
// token验证处理程序
|
||||
if (nowResult.data == '1') {
|
||||
client.write(Buffer.from(utils.intrinsic.heart, 'hex'));
|
||||
} else {
|
||||
reconnect();
|
||||
}
|
||||
} else if (nowResult.type == 4) {
|
||||
const { msgContent } = nowResult.data;
|
||||
const { outboundMsg, receiverAddress, originalMsg } = msgContent;
|
||||
const { senderAddress, msgData, encodingCategory } = outboundMsg;
|
||||
// socket接收消息后触发事件监听器,将消息发送给websocket客户端并存储在数据库中
|
||||
shunt.socketEmitter().emit(senderAddress.data, { encode_type: parseInt(encodingCategory.data), msg_data: msgData.data, created_at: new Date() });
|
||||
await app.curl('http://127.0.0.1:' + app.server.address().port + '/shortMsg', {
|
||||
dataType: 'json',
|
||||
contentType: 'application/x-www-form-urlencoded',
|
||||
method: 'POST',
|
||||
timeout: 3000,
|
||||
data: {
|
||||
card_id: senderAddress.data,
|
||||
receiver_address: receiverAddress.data,
|
||||
original_msg: originalMsg,
|
||||
send_type: 0,
|
||||
encode_type: parseInt(encodingCategory.data),
|
||||
msg_data: msgData.data,
|
||||
created_at: new Date()
|
||||
},
|
||||
});
|
||||
}
|
||||
// 重发消息处理
|
||||
if (resendResult && resendResult.type == 4) {
|
||||
const { msgContent } = resendResult.data;
|
||||
const { outboundMsg, receiverAddress } = msgContent;
|
||||
const { senderAddress, msgData, encodingCategory } = outboundMsg;
|
||||
// socket接收消息后触发事件监听器,将消息发送给websocket客户端并存储在数据库中
|
||||
shunt.socketEmitter().emit(senderAddress.data, msgData.data);
|
||||
await app.curl('http://127.0.0.1:' + app.server.address().port + '/shortMsg', {
|
||||
dataType: 'json',
|
||||
contentType: 'application/x-www-form-urlencoded',
|
||||
method: 'POST',
|
||||
timeout: 3000,
|
||||
data: {
|
||||
card_id: senderAddress.data,
|
||||
receiver_address: receiverAddress.data,
|
||||
msg: data.toString(),
|
||||
send_type: 1,
|
||||
encode_type: parseInt(encodingCategory.data),
|
||||
msg_data: msgData.data,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user