报文解析工作

1.报文数据

报文数据:应用层的信息分组称为报文。报文数据的分层:

2.报文解析逻辑

将报文数据作为字符串,分段解析。

3.报文数据解析代码

Model(存储数据的类)

package atotommi;

public class atotommiModel extends CommonMsg {
    //应用层报头
    public  String Mtype;
    public String MLength;

public String getMtype() {
        return Mtype;
    }
    public void setMtype(String mtype) {
        Mtype = mtype;
    }
    public String getMLength() {
        return MLength;
    }
    public void setMLength(String mLength) {
        MLength = mLength;
    }
    //ATO工作模式
    private String ATOWork;
    public String getATOWork(){
            return this.ATOWork;
        }
    public void setATOWork(String t_ATOWork){
           this.ATOWork=t_ATOWork;
        }    
    //ATS车组匹配状态
    private String ATSCommandType;
    public String get_ATSCommandType(){
            return this.ATSCommandType;
        }
    public void set_ATSCommandType(String t_ATSCommandType){
           this.ATSCommandType=t_ATSCommandType;
        }    
    
    //ATO软件版本
    private String M_ATSGROUP_CO ;
    public String get_M_ATSGROUP_CO(){
            return this.M_ATSGROUP_CO;
        }
    public void set_M_ATSGROUP_CO(String t_M_ATSGROUP_CO){
           this.M_ATSGROUP_CO=t_M_ATSGROUP_CO;
        }
    
    //ATO数据版本
    private String M_DATA_VERSION ;
    public String get_M_DATA_VERSION(){
            return this.M_DATA_VERSION;
        }
    public void set_M_DATA_VERSION(String t_M_DATA_VERSION){
           this.M_DATA_VERSION=t_M_DATA_VERSION;
        }
    
    //ATO故障代码
    private String M_CHECK_ERRCODE ;
    public String get_M_CHECK_ERRCODE(){
            return this.M_CHECK_ERRCODE;
        }
    public void set_M_CHECK_ERRCODE(String t_M_CHECK_ERRCODE){
           this.M_CHECK_ERRCODE=t_M_CHECK_ERRCODE;
        }
    
    
    //ATO故障代码
    
    private String M_START_ERRCODE ;
    public String get_M_START_ERRCODE(){
            return this.M_START_ERRCODE;
        }
    public void set_M_START_ERRCODE(String t_M_START_ERRCODE){
           this.M_START_ERRCODE=t_M_START_ERRCODE;
        }
        
    //ATO牵引制动状态
    private String M_FORCE_STATUS;

public String get_M_FORCE_STATUS(){
            return this.M_FORCE_STATUS;
        }
    public void set_M_FORCE_STATUS(String t_M_FORCE_STATUS){
           this.M_FORCE_STATUS=t_M_FORCE_STATUS;
        }
    
    //门控模式
    private String M_DOORMODE;
    public String get_M_DOORMODE(){
        return this.M_DOORMODE;
    }
    public void set_M_DOORMODE(String t_M_DOORMODE){
       this.M_DOORMODE=t_M_DOORMODE;
    }
    
    //车组号
    private String NID_VEHICLE;
    public String get_NID_VEHICLE(){
        return this.NID_VEHICLE;
    }
    public void set_NID_VEHICLE(String t_NID_VEHICLE){
       this.NID_VEHICLE=t_NID_VEHICLE;
    }
    
    //车组次
    private String NID_TRAIN;
    public String get_NID_TRAIN(){
        return this.NID_TRAIN;
    }
    public void set_NID_TRAIN(String t_NID_TRAIN){
       this.NID_TRAIN=t_NID_TRAIN;
    }
    
    //目的地号
    private String NID_DESTINATION;
    public String get_NID_DESTINATION(){
        return this.NID_DESTINATION;
    }
    public void set_NID_DESTINATION(String t_NID_DESTINATION){
       this.NID_DESTINATION=t_NID_DESTINATION;
    }
    
    //司机号
    private String NID_DRIVER;
    public String get_NID_DRIVER(){
        return this.NID_DRIVER;
    }
    public void set_NID_DRIVER(String t_NID_DRIVER){
       this.NID_DRIVER=t_NID_DRIVER;
    }
    
    
    //区间运行调整命令
    private String M_RUNTIME_STATUS;
    public String get_M_RUNTIME_STATUS(){
        return this.M_RUNTIME_STATUS;
    }
    public void set_M_RUNTIME_STATUS(String t_M_RUNTIME_STATUS){
       this.M_RUNTIME_STATUS =t_M_RUNTIME_STATUS;
    }
    
    
    //跳停状态
    private String M_SKIP_STATUS;
    public String get_M_SKIP_STATUS(){
        return this.M_SKIP_STATUS;
    }
    public void set_M_SKIP_STATUS(String t_M_SKIP_STATUS){
       this.M_SKIP_STATUS=t_M_SKIP_STATUS;
    }
    
    //扣车状态
    private String M_TASK_STATUS;
    public String get_M_TASK_STATUS(){
        return this.M_TASK_STATUS;
    }
    public void set_M_TASK_STATUS(String t_M_TASK_STATUS){
       this.M_TASK_STATUS=t_M_TASK_STATUS;
    }
    
    //下一停车站台 ID
    private String NID_NEXT_PLATFORM;
    public String get_NID_NEXT_PLATFORM(){
        return this.NID_NEXT_PLATFORM;
    }
    public void set_NID_NEXT_PLATFORM(String t_NID_NEXT_PLATFORM){
       this.NID_NEXT_PLATFORM=t_NID_NEXT_PLATFORM;
    }
    
    
    
    //制动力状态
    private String M_BRAKE_STATUS;
    public String get_M_BRAKE_STATUS(){
        return this.M_BRAKE_STATUS;
    }
    public void set_M_BRAKE_STATUS(String t_M_BRAKE_STATUS){
       this.M_BRAKE_STATUS=t_M_BRAKE_STATUS;
    }
    
}

Analyze(解析报文的类)

package atotommi;

public class atotommiAnalyze extends AnalyzeMsg{
    public atotommiModel m_atotommi;
    
    public atotommiAnalyze() {
        m_atotommi = new atotommiModel();
       
    }
    
    //父类方法的重载,对这个方法增加新的功能
    //长度是5+36个字节,对报头信息进行解析
     public void analyzeMsg(byte[] bytes){
         //byte转string
         StringBuffer sb = new StringBuffer();  
         for(int i = 0; i < bytes.length; i++) {  
                String hex = Integer.toHexString(bytes[i] & 0xFF);  
                if(hex.length() < 2){  
                    sb.append(0);  
                }  
                sb.append(hex);  
            }  
        String p_data = sb.toString();            
        int GMsgLength = Integer.parseInt(p_data.substring(14,18), 16);// 应用层数据包的长度
        String HGMsg = p_data.substring(0,18);//总长度
        //报文类型、源设备、目的设备、长度
        int index =0;
        m_atotommi.setMsgtype(HGMsg.substring(index, index+2));//2
        index +=2;
        m_atotommi.setSendid(HGMsg.substring(index, index+2));//2
        index +=2;
        m_atotommi.setReceiveid(HGMsg.substring(index, index+2));//2
        index +=2;
        m_atotommi.setMsglength(HGMsg.substring(index, index+4));//4
        index +=4;
        m_atotommi.setMtype(HGMsg.substring(index, index+4));//4
        index +=4;
        m_atotommi.setMLength(HGMsg.substring(index, index+4));//4
        index +=4;            
        String AMsg = p_data.replaceFirst(HGMsg, "");//应用层数据
        int TMsgLength = AMsg.length() / 2;//报文中应用层的长度实际的  
        if (TMsgLength == GMsgLength) {    //  
            // 将各信息包进行拆分
            int index1 =0;
            m_atotommi.setATOWork(HGMsg.substring(index1, index1+2));//2
            index1 +=2;
            m_atotommi.set_ATSCommandType(HGMsg.substring(index1, index1+2));//2
            index1 +=2;
            m_atotommi.set_M_ATSGROUP_CO(HGMsg.substring(index1, index1+8));//8
            index1 +=8;
            m_atotommi.set_M_DATA_VERSION(HGMsg.substring(index1, index1+8));//8
            index1 +=8;
            m_atotommi.set_M_CHECK_ERRCODE(HGMsg.substring(index1, index1+8));//8
            index1 +=8;
            m_atotommi.set_M_START_ERRCODE(HGMsg.substring(index1, index1+2));//2
            index1 +=2;
            m_atotommi.set_M_FORCE_STATUS(HGMsg.substring(index1, index1+2));//2
            index1 +=2;
            m_atotommi.set_M_DOORMODE(HGMsg.substring(index1, index1+2));//2
            index1 +=2;
            m_atotommi.set_NID_VEHICLE(HGMsg.substring(index1, index1+4));//4
            index1 +=4;
            m_atotommi.set_NID_TRAIN(HGMsg.substring(index1, index1+4));//4
            index1 +=4;
            m_atotommi.set_NID_DESTINATION(HGMsg.substring(index1, index1+8));//8
            index1 +=8;
            m_atotommi.set_NID_DRIVER(HGMsg.substring(index1, index1+4));//4
            index1 +=4;
            m_atotommi.set_M_RUNTIME_STATUS(HGMsg.substring(index1, index1+4));//4
            index1 +=4;
            m_atotommi.set_M_SKIP_STATUS(HGMsg.substring(index1, index1+2));//2
            index1 +=2;
            m_atotommi.set_M_TASK_STATUS(HGMsg.substring(index1, index1+2));//2
            index1 +=2;
            m_atotommi.set_NID_NEXT_PLATFORM(HGMsg.substring(index1, index1+8));//8
            index1 +=8;
            m_atotommi.set_M_BRAKE_STATUS(HGMsg.substring(index1, index1+2));//2
                       
        } else {
            System.out.println("报文解析出现错误!");
        }}
        //ATO工作模式/ATS车组匹配状态/ATO软件版本/ATO数据版本/ATO故障代码/ATO故障代码/ATO牵引制动状态
        //门控模式/车组号/车组次/目的地号/司机号/区间运行调整命令/跳停状态/扣车状态/下一停车站台 ID/制动力状态

//    System.out.println("解析成功");
     
     public atotommiModel getModel(){
         return m_atotommi;
     }

@Override
    public void analyzeMsg(String p_data) {
        // TODO 自动生成的方法存根
        
    }
}

报文解析(java版)相关推荐

  1. iso8583 java解析源码_iso8583报文解析java

    8583报文详解 4页 免费 8583报文格式介绍 1页 免费 8583报文及各域详解 48页 1下载券 解析ISO8583报文实例 4页 1下载券 8583报文 48页 免费 ...... Pos ...

  2. java 数学表达式解析插件_数学表达式解析-JAVA版

    1 .工具介绍 String exp = "v>=10&&v<=2000&&v%10==0"; 在 js 中,能够直接运行 eval 得 ...

  3. java执行数学表达式_数学表达式解析-JAVA版

    1 .工具介绍 String exp = "v>=10&&v<=2000&&v%10==0"; 在 js 中,能够直接运行 eval 得 ...

  4. 2019年8月14号抖音更新后单个解析java版源码

    19-06-04:接口变更(https://aweme.snssdk.com/aweme/v1/aweme/detail/) 19-06-05:新增长视频,userId.抖音id 19-06-13:提 ...

  5. Modbus通信协议+Modbus串口调试工具+Java版协议解析源码

    网络与串口二合一调试助手TCPCOM: https://download.csdn.net/download/liuyuan_java/87454762 Modbus调试工具,模拟串口调试工具 htt ...

  6. java版银联8583协议解析,超简单超直观的实现及示例(全互联网最简单)

    一直以来做嵌入式软件开发,跟银联8583协议通信打交道太多了. 最近有需要把8383协议的解析用到android上,但是搜遍了整个互联网,没发现有哪个简单好用点的java版8583解析库.就自己动手自 ...

  7. java socket 报文解析_java socket解析和发送二进制报文工具(附java和C++转化问题)

    解析: 首先是读取字节: /*** 读取输入流中指定字节的长度 * * 输入流 * *@paramlength 指定长度 *@return指定长度的字节数组*/ public static byte[ ...

  8. 深入解析棋牌湖南放炮罚,跑胡子手游源码(java版)

    深入解析棋牌湖南放炮罚,跑胡子手游后台源码(java版) 最近开发了一款湖南放炮罚的房卡模式带三级分销的手游,现在我就将我开发中的思路给朋友们分享一下. 首先介绍一下棋牌游戏最近的火热度吧. 最近微信 ...

  9. JAVA实现报文解析:协议的数据类型和完整的报文结构解析

    **JAVA实现GBT32960报文解析系列文章链接:** JAVA实现GBT32960报文解析(一):协议的数据类型和完整的报文结构解析 JAVA实现GBT32960报文解析(二):数据包结构解析源 ...

  10. 解析java程序设计第二版答案,解析Java程序设计答案

    解析Java程序设计答案 java作业 5. 答:由于第一个catch子句将捕获所有异常,因此,第二个catch子句永远不会被执行.不能通过编译. 6. 答: public class first_e ...

最新文章

  1. 面试热点Redis分布式锁,再细说一次
  2. mongodb php 存储文件大小,PHP MongoDB GridFS 存储文件的方法详解
  3. .net数据库操作类2
  4. COGS 930. [河南省队2012] 找第k小的数 主席树
  5. 2008R2Win7管理九DNS冗余和恢复
  6. PLSQL 查询结果只显示年月日不显示时分秒的解决方法
  7. 表格列求和_Excel表格的基本操作,包含制作一个表格10方面的知识
  8. 大盘指数的定义及其计算方法
  9. 全球最大电子展2018再度起航,镁客网在香港带你深度探讨人工智能
  10. vue脚手架学习笔记
  11. 基于matlab的心电信号预处理
  12. 一天干掉一只Monkey计划(三)——延迟渲染,及材质ID
  13. 启动Hadoop集群,出现Cannot set priority of nodemanager(resourcemanager) process xxx问题
  14. 客户协作 over 合同谈判
  15. (Hankson的逆问题)
  16. MaxCompute 助力衣二三构建智能化运营工具
  17. DeFi保险协议InsurAce.io宣布与Mushrooms Finance达成战略合作为其平台用户提供智能合约安全相关保险服务
  18. 从华为P20开始的脑洞之旅:AI如何改变未来手机生活
  19. Android 平台语音通话及回音消除、噪音消除研究
  20. SQL WEEK()函数

热门文章

  1. python gif压缩_压缩gif的正确姿势
  2. 200plc与施耐德ATV610变频器modbus通讯
  3. 用计算机新字库打出的文字,为什么用五笔打字有很多字打不出来(GBK和GB2312字库的区别)...
  4. 【AI面试题】随机森林算法的原理、随机性、优缺点
  5. 妹妹系列:哥哥,机器人示教器有错别字??聊聊国产示教器!!
  6. php 事件流转,php46公文流转
  7. 2020年下半年软件设计师下午真题及答案解析
  8. IO、NIO和Netty
  9. 打印时显示预服务器,域服务器如何设置打印机
  10. 计算机专业人才需求调研背景,计算机专业人才需求调研报告