JLChen
2021-11-05 de72a7843ceb868c89fc11983e315849caa28573
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
package com.hdl.sdk.ttl.HDLDeviceManger.Core;
 
import com.hdl.sdk.ttl.Config.MCUConstants;
import com.hdl.sdk.ttl.Utils.LogUtils.HDLLog;
 
/**
 * Modify by JLChen on 2019/6/26
 */
public class Crc {
    private static int[] crctab = new int[]{0x0000, 0x1021, 0x2042, 0x3063,
            0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,
            0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252,
            0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a,
            0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,
            0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509,
            0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630,
            0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,
            0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7,
            0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af,
            0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,
            0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e,
            0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5,
            0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,
            0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4,
            0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc,
            0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,
            0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3,
            0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da,
            0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,
            0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589,
            0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481,
            0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,
            0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0,
            0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f,
            0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,
            0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e,
            0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16,
            0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,
            0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45,
            0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c,
            0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,
            0x2e93, 0x3eb2, 0x0ed1, 0x1ef0};
 
    public byte[] addBytes;
    public int command = 0;
    //当前APP设备子网号
    public static int localSubnetID = 254;
    //当前APP设备设备号
    public static int localDeviceID = 80;
    public int desSubnetID = 0;
    public int desDeviceID = 0;
    // Device type
    public static int DeviceType = 424;
    //    public int port = 0;
//    public String ipAddress = "";
    public int count = 0;//权宜之计,后续删掉
    public boolean isCtrlSuccess;//权宜之计,后续删掉
 
    public Crc(int command, int desSubnetID, int desDeviceID, byte[] addBytes) {
        this.command = command;
        this.desSubnetID = desSubnetID;
        this.desDeviceID = desDeviceID;
        this.addBytes = addBytes;
    }
 
    public Crc(int command, int sourceSubID, int sourceDeviceID, int desSubnetID, int desDeviceID, byte[] addBytes) {
        localSubnetID = sourceSubID;
        localDeviceID = sourceDeviceID;
        this.command = command;
        this.desSubnetID = desSubnetID;
        this.desDeviceID = desDeviceID;
        this.addBytes = addBytes;
    }
 
    private static int xcrc(int crc, byte cp) {
        int t1, t2, t3, t4, t5, t6;
        t1 = (crc >> 8);
        t2 = (t1 & 0xff);
        t3 = (cp & 0xff);
        t4 = (crc << 8);
        t5 = (t2 ^ t3);
        t6 = (crctab[t5] ^ t4);
        return t6;
    }
 
    public static void ConCRC(byte[] bufin, int n) {
        int crc16 = 0;
        int i;
        for (i = 0; i < n; i++) {
            crc16 = xcrc(crc16, bufin[i]);
        }
        bufin[i] = (byte) (crc16 >> 8);
        bufin[i + 1] = (byte) (crc16 & 0xff);
    }
 
    public static boolean checkCRC(byte[] bufin) {
        try {
            int crc16 = 0;
            int i;
            //去掉AAAA头
            for ( i = 2; i < bufin.length - 2; i++) {
                crc16 = xcrc(crc16, bufin[i]);
            }
            return (bufin[i] == (byte) (crc16 >> 8)) && (bufin[i + 1] == (byte) (crc16 & 0xff));
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
 
    }
 
 
    /**
     * 旧协议
     * @return
     */
    public byte[] GetSendBytes() {
 
        byte[] crcBytes = new byte[9 + this.addBytes.length + 2];
 
        byte[] sendBytes = new byte[2 + crcBytes.length];
 
        //Boot code
        sendBytes[0] = (byte) 0xAA;
        sendBytes[1] = (byte) 0xAA;
        crcBytes[0] = (byte) crcBytes.length;
        crcBytes[1] = (byte) localSubnetID;
        crcBytes[2] = (byte) localDeviceID;
        crcBytes[3] = (byte) (DeviceType / 256);
        crcBytes[4] = (byte) (DeviceType % 256);
        crcBytes[5] = (byte) (this.command / 256);
        crcBytes[6] = (byte) (this.command % 256);
        crcBytes[7] = (byte) this.desSubnetID;
        crcBytes[8] = (byte) this.desDeviceID;
        System.arraycopy(this.addBytes, 0, crcBytes, 9, this.addBytes.length);
        ConCRC(crcBytes, crcBytes.length - 2);
        System.arraycopy(crcBytes, 0, sendBytes, 2, crcBytes.length);
 
        return sendBytes;
    }
 
 
 
//
//    //    2.通信协议
////      引导头        控制域          数据长度             数据       校验码
////      168[1byte]    0-255[1byte]    0-1500[2byte]      [Nbyte]    [1byte]
//    /**
//     * 魔镜MCU协议
//     * @return
//     */
//    public byte[] GetSendBytes() {
//        byte[] busBytes = GetHDLSendBytes();
//        byte[] sendBytes = new byte[5 + busBytes.length];
//
//        //Boot code
//        sendBytes[0] = (byte) MCUConstants.MCU_BOOT_HEAD;
//        sendBytes[1] = (byte) MCUConstants.MCU_COMMAND_SEND;
//        sendBytes[2] = (byte) ((busBytes.length) / 256);   //数据长度:去除引导头的长度
//        sendBytes[3] = (byte) ((busBytes.length) % 256);   //数据长度:去除引导头的长度
//
//        System.arraycopy(busBytes, 0, sendBytes, 4, busBytes.length);
//
//        sendBytes[sendBytes.length-1] = MCUCrc.getMcuChecksum(sendBytes); //设置校验码
//
//        return sendBytes;
//    }
 
 
 
//    /**
//     * 校验码计算
//     * @param packet
//     * @return
//     * 头引导码和尾校验码不检验 所以i=1,开始  i < (packet.length - 2)
//     */
//    public static byte getMcuChecksum(byte[] packet)
//    {
//        byte mSum = 0;
//        for(int i = 1; i < (packet.length - 2);  i++)
//        {
//            mSum  +=  (byte)packet[i];
//        }
//        mSum = (byte) ((~mSum) + 1);
//        return mSum;
//
//    }
}