liurunyu
2023-11-22 429f9d85eddbb07081c149d7156964337ba688aa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package com.dy.common.mw.protocol.p206V1_0_0;
 
import com.dy.common.util.ByteUtil;
import com.dy.common.util.ByteUtilUnsigned;
 
 
public class CommonV1_0_1 {
    /**
     * 检查头
     * @param bs 上行字节数组
     * @return true是,false否
     * @throws Exception  异常
     */
    public Boolean isThisProtocolHead(byte[] bs) throws Exception{
        if(bs == null){
            return null ;
        }else if(bs.length >= (ProtocolConstantV206V1_0_0.ctrlIndex - 1)
                && bs[0] == ProtocolConstantV206V1_0_0.P_Head_Byte
                && bs[2] == ProtocolConstantV206V1_0_0.P_Head_Byte){
            //String vs = this.parseVersion(bs) ;
            //return vs.equals(ProtocolConstantV206V1_0_0.version);
            return true ;
        }else{
            return false ;
        }
    }
    
    /**
     * 检查头
     * @param bs 上行字节数组
     * @throws Exception 异常
     */
    public void checkHead(byte[] bs) throws Exception{
        if(bs.length < 13 || bs[0] != ProtocolConstantV206V1_0_0.P_Head_Byte || bs[2] != ProtocolConstantV206V1_0_0.P_Head_Byte){
            throw new Exception("上行数据帧头不正确!") ;
        }
    }
    
    /**
     * 检查尾
     * @param bs 上行字节数组
     * @throws Exception 异常
     */
    public void checkTail(byte[] bs) throws Exception{
        if(bs.length < 1 || bs[bs.length - 1] != ProtocolConstantV206V1_0_0.P_Tail_Byte){
            throw new Exception("上行数据尾不正确!") ;
        }
    }
 
 
    /**
     * 分析数据字节数
     * @param bs 上行字节数组
     * @return 数据长度
     * @throws Exception 异常
     */
    public int parseDataLen(byte[] bs)throws Exception{
        return ByteUtilUnsigned.bytes2Short_BE(bs, ProtocolConstantV206V1_0_0.dataLenIndex) ;
    }
 
 
    /**
     * 分析IMEI号
     * @param bs 上行字节数组
     * @return 控制器地址
     * @throws Exception 异常
     */
    public String parseRtuAddr(byte[] bs)throws Exception{
        String rtuAddrBCD = "" + ByteUtil.BCD2Long_BE(bs, ProtocolConstantV206V1_0_0.rtuAddr1Index_start, ProtocolConstantV206V1_0_0.rtuAddr1Index_end) ;
        String rtuAddrStr = "" + ByteUtilUnsigned.bytes2Short_BE(bs, ProtocolConstantV206V1_0_0.rtuAddr2Index_start) ;
        while(rtuAddrStr.length() < 6){
            rtuAddrStr = "0" + rtuAddrStr ;
        }
        return rtuAddrBCD + rtuAddrStr ;
    }
 
    /**
     * 分析功能码
     * @param bs 上行字节数组
     * @return 功能码
     */
    public String parseCode(byte[] bs){
        return ByteUtil.bytes2Hex(bs, false, ProtocolConstantV206V1_0_0.codeIndex, 1) ;
    }
 
 
    /**
     * 校验和检查
     * @param bs 上行字节数组
     * @return 通过true,未通过false
     */
    public boolean checkCrc(byte[] bs) {
        byte he = 0 ;
        for(int i = 0 ; i <= bs.length - 3 ; i++){
            he = (byte)(he + bs[i]) ;
        }
        return bs[bs.length - 2] == he ;
    }
 
    /**
     * 校验和检查
     * @param bs  上行字节数组
     * @return 通过null,未通过返回原因
     * @throws Exception 异常
     */
    public String checkCrc_str(byte[] bs) throws Exception {
        byte[] he = new byte[1] ;
        for(int i = 0 ; i <= bs.length - 3 ; i++){
            he[0] = (byte)(he[0] + bs[i]) ;
        }
        short hes = ByteUtilUnsigned.byte2Byte(he, 0);
        short heOrg = ByteUtilUnsigned.byte2Byte(bs, bs.length - 2);
        if(hes == heOrg){
            return null ;
        }else{
            return "计算校验和是:" + hes + ",上传校验和是" + heOrg ;
        }
    }
 
 
    /*
    构造控制域
    D7                  D6                  D5~D4            D3~D0
    传输方向位 DIR        拆分标志位 DIV       帧计数位 FCB       功能码
    */
    public byte createCtrl(byte funcCode){
        byte b = 0 ;
        b = (byte)(b | funcCode) ;
        //FCB == 3
        b = (byte)(b | (byte)60) ;
        //DIV = 0
        //DIR = 0
        return b ;
    }
    
    /*
     * 分析版本号
     * @param bs  上行字节数组
     * @return 版本号
     * @throws Exception 异常
    public String parseVersion(byte[] bs)throws Exception{
        short ver = ByteUtilUnsigned.byte2Byte(bs, ProtocolConstantV206V1_0_0.versionIndex) ;
        char[] cs = ("" + ver).toCharArray() ;
        StringBuilder vs = new StringBuilder() ;
        for(byte i = 0 ; i < cs.length; i++){
            if(i == 0){
                vs.append(cs[i]) ;
            }else{
                vs.append(".").append(cs[i]) ;
            }
        }
        return vs.toString() ;
    }
    */
 
}