JT808协议之转义处理,利用netty的ByteBuf实现高性能转义

JT808网关作为部标终端连接的服务端,承载了终端登录、心跳、位置、拍照等基础业务以及信令交互,是整个系统最核心的模块,一旦崩溃,则所有部标终端都会离线,所有信令交互包括1078和主动安全的信令交互也会大受影响。JT808协议之转义处理,利用netty的ByteBuf实现高性能转义_第1张图片
转义处理是为了方便拆包,防止粘包。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;
	}
	

JT808项目开源地址
https://gitee.com/lingxcom/jt808

你可能感兴趣的:(java,开发语言,部标808,JT808)