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

JT808网关作为部标终端连接的服务端,承载了终端登录、心跳、位置、拍照等基础业务以及信令交互,是整个系统最核心的模块,一旦崩溃,则所有部标终端都会离线,所有信令交互包括1078和主动安全的信令交互也会大受影响。

QQ图片20230216161800.png

转义处理是为了方便拆包,防止粘包。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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容