JT808网关作为部标终端连接的服务端,承载了终端登录、心跳、位置、拍照等基础业务以及信令交互,是整个系统最核心的模块,一旦崩溃,则所有部标终端都会离线,所有信令交互包括1078和主动安全的信令交互也会大受影响。所以,JT808网关的并发性稳定性健壮性成为整个系统最重要的考量之一。
转义处理是为了方便拆包,防止粘包。JT808报文以7E开头,以7E结尾。报文中间是不允许出现7E的,所以7E必须转义处理。
以下是Java实现代码
public static final ByteBuf encode(ByteBuf byteBuf) {
int len=byteBuf.readableBytes();
ByteBuf buf = Unpooled.buffer();
for(int i=0;i<len;i++) {
byte b=byteBuf.getByte(i);
if (i == 0 || i == len-1 ){
buf.writeByte(b);
} else if (b == 0x7D) {
buf.writeByte(0x7D);
buf.writeByte(0x01);
} else if( b == 0x7E ){
buf.writeByte(0x7D);
buf.writeByte(0x02);
} else {
buf.writeByte(b);
}
}
byteBuf.release();
return buf;
}
public static final ByteBuf decode(byte[] bytes) {
int len = bytes.length;
ByteBuf buf = Unpooled.buffer();
for (int i = 0; i < len; i++) {
if (bytes[i] == 0x7d && bytes[i + 1] == 0x01) {
buf.writeByte(0x7d);
i++;
} else if (bytes[i] == 0x7d && bytes[i + 1] == 0x02) {
buf.writeByte(0x7e);
i++;
} else {
buf.writeByte(bytes[i]);
}
}
bytes=null;
return buf;
}