Java实现符合交通部标JT808和JT1078协议服务器的思路

        “两客一危一重货”车辆运输安全是当前道路运输安全管理工作的重中之重,相应的车辆GPS定位监控平台是监控“两客一危一重货”车辆运输安全的重要平台。本系统结合交通部JT808、JT1078等协议标准,提供Java开发车载视频定位监控系统的开发思路。

        一:JT808协议解析和服务器搭建。

     JT808协议分为2011版、2013版、2019版本。市面上大多是2013版,少数2019版。2013和2019版本的最大区别是报文固定头部把手机号从原来的6字节BCD码改成了10字节BCD码。

        2013版报文头:

         2019版报文头:

         对于TCP报文的解析,消息头可以使用公共组件,通过版本标记解析不同版本的消息头。消息体用每个消息自定义的解析格式。

public abstract class JTMessage {

    protected String msgId;//消息编号
    protected String tid;//终端ID
    protected String msgNo;//消息流水

    protected int version;//版本号
    protected int isPack;//分包

        解析报文头:

         //解析报文头
        ReadByteFromHex reader = new ReadByteFromHex(msg);
        //=============解析消息头开始=============
        reader.readByte(1);// 7E
        String msgId = reader.readByte(2);// 消息id
        String msgBodyAttr = reader.readByte(2);// 消息体属性
        int msgBodyInt = Integer.parseInt(msgBodyAttr, 16);
        boolean isVersion = (msgBodyInt & 0x4000) > 0;// 是否有版本号 取第13位是否为1 0x4000二进制是0100000000000000
        int version = 0; //2019版本开始从1递增
        if (isVersion) {
            version = Integer.parseInt(reader.readByte(1), 16); // 版本号
        }
        //如果版本号大于0 则手机号为10位
        String tid = version > 0 ? reader.readByte(10) : reader.readByte(6);// 手机号,当做id
        String msgNo = reader.readByte(2);// 消息流水
        // 是否分包
        boolean isPack = (msgBodyInt & 0x2000) > 0;// 是否分包 取第13位是否为1 0x2000二进制是0010000000000000
        int packTotal = 0;
        int packNum = 0;
        if (isPack) {
            // 如果有分包则多读4个字节
            packTotal = Integer.parseInt(reader.readByte(2), 16);
            packNum = Integer.parseInt(reader.readByte(2), 16);
        }

        boolean isRSA = (msgBodyInt & 0x400) > 0;// 消息体是否过RSA算法加密; 取第13位是否为1 0x400二进制是0000010000000000
        //=============解析消息头结束=============

        解析消息体:

//=============解析消息体开始=============
        String bodyHex = reader.readByte(msgBodyInt & 0x3ff); // 消息体属性前10位是消息体长度 0x3ff二进制是0000001111111111
        if ("0200".equals(msgId)) {//位置上报
            JTMessage t0200 = new T0200(tid, msgNo);
            t0200.decodeBody(bodyHex);
            return t0200;
        } else if ("0002".equals(msgId)) {//心跳
            JTMessage t0202 = new T0002(tid, msgNo);
            t0202.decodeBody(bodyHex);
            return t0202;
        } else if ("0003".equals(msgId)) {//注销
            JTMessage t0003 = new T0003(tid, msgNo);
            t0003.decodeBody(bodyHex);
            return t0003;
        } else if ("0100".equals(msgId)) {//注册
            JTMessage t0100 = new T0100(tid, msgNo);
            t0100.decodeBody(bodyHex);
            return t0100;
        } else if ("0102".equals(msgId)) {//鉴权
            JTMessage t0102 = new T0102(tid, msgNo);
            t0102.decodeBody(bodyHex);
            return t0102;
        } else if ("0001".equals(msgId)) {//终端通用应答
            JTMessage t0001 = new T0001(tid, msgNo);
            t0001.decodeBody(bodyHex);
            return t0001;
        } else if ("0704".equals(msgId)) {//定位数据批量上传
            JTMessage t0704 = new T0704(tid, msgNo);
            t0704.decodeBody(bodyHex);
            return t0704;
        }
        //=============解析消息体结束=============

二、设备上报流程:              

        注意,设备数据大批量上报的情况下,服务器需要支持高并发,netty作为天然的高并发框架,可以用作JT808服务器的接入点。

 三、JT1078服务器的搭建流程:

        1078服务器就是一个流媒体服务器,要处理的功能是接收设备上报的视频数据,解析成浏览器能够播放的格式,并通过websocket或者http协议发送到浏览器,浏览器解码观看视频。

 下面是系统demo演示地址:gps.cachtek.com

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值