node的一个上位机和下位机通信的转发程序,用的是udp转发.
其中在发送的时候会进行一次rc4加密数据
出现问题就在这个加密数据这一块,因为这个是升级包广播发送.提前生成了升级用的广播报文,是一个buffer数组,前四个元素是升级请求体,后面依次是升级包体.
上位机控制程序发送次数,一般设置三次.
发送升级包数据是采用递归调用发送,升级包发送方法
function sendUpgradePackage(gatewayId, buffer, port, address, sendnum = 1, index = 0, send = 0) {
if (!common.upgradeflag[gatewayId].ret) {
return;
}
if (index >= buffer.length) {
send++;
if (send >= sendnum) {
common.upgradeflag[gatewayId].ret = false;
return;
} else {
index = 0;
}
} console.log(index, send, '===>>>buff', buffer[index].toString('hex')); sendCipherMessage(buffer[index], 0, buffer.length, port, address, err => {
if (err) {
log.appendLog('send_error:' + err);
}
});
index++;
setTimeout(function() {
sendUpgradePackage(gatewayId, buffer, port, address, sendnum, index, send);
}, 100);
}
后续是一个rc4加密数据包的方法 代码省略部分
parseBody.buffer = databuffer.slice(cipherlen, cipherlen + parseBody.length);
// console.log('密钥', parseBody.deviceId, '=====>>>>>', createwaytewaykey.GATEWAYKEYDIR[parseBody.deviceId].key);
let decipher = crypto.createCipheriv('rc4', createwaytewaykey.GATEWAYKEYDIR[parseBody.deviceId].key, '');
parseBody.buffer = decipher.update(parseBody.buffer);
parseBody.buffer.copy(databuffer, cipherlen);
其中databuffer 就是传过来的buffer[index]
因为直接对这个参数进行了修改导致第一遍发送的时候数据是正常的,第二遍发送的时候数据就开始错误.因为第一遍发送的时候将原buffer数组内数组内容改变了,导致对加密过的数据进行再次加密,下位机就无法解析数据.
这个问题排查后又发现了另一个问题,就是不加密的问题~~~因为在调试过程中一直重启服务,导致服务内存没保存网关的key,导致没有加密,后续网关心跳上来以后才开始对后续的加密.
整个服务已经过于混乱,需要兼容很多旧设备,其中的字节流解析差异太大,各种判断进行解析.
整个上位机也出现了这个问题,因为设备等问题,导致整个表结构不适合现在的设备存储.但是一直没有时间重构,也不敢大的重构,面向的api过多过杂.牵一发动全身.
这段时间都是做node后端,建了一个群 做后端node的可以一起交流一下 932491438