领新科技
QQ:283853318
领新科技

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

https://www.lingx.com/wp-content/uploads/2022/10/图片5.png

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

https://www.lingx.com/wp-content/uploads/2023/02/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协议之转义处理,利用netty的ByteBuf实现高性能处理

领新科技

JT808协议之转义处理,利用netty的ByteBuf实现高性能处理
JT808网关作为部标终端连接的服务端,承载了终端登录、心跳、位置、拍照等基础业务以及信令交互,是整个系统最核心的模块,一旦崩溃,则所有部标终端都会离线,所有信令交互包括1078和主…
扫描二维码继续阅读
2023-02-16