审查视图

src/main/java/com/sy/socket/CommandClient.java 10.3 KB
zhangFan authored
1 2
package com.sy.socket;
3
import com.sy.model.CommandInfoX22;
zhangFan authored
4
import com.sy.model.GatherInfo;
朱兆平 authored
5
import lombok.extern.slf4j.Slf4j;
zhangFan authored
6 7 8 9 10 11 12 13
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

@Component
朱兆平 authored
14
@Slf4j
zhangFan authored
15
public class CommandClient {
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
    private static final String GATHER_TEMPLATE = "<GATHER_INFO AREA_ID=\"${AREA_ID}\" CHNL_NO=\"${CHNL_NO}\" I_E_TYPE=\"${I_E_TYPE}\" SEQ_NO=\"${SEQ_NO}\">\n" +
            "\t<IC>\n" +
            "\t\t<DR_IC_NO/>\n" +
            "\t\t<IC_DR_CUSTOMS_NO/>\n" +
            "\t\t<IC_CO_CUSTOMS_NO/>\n" +
            "\t\t<IC_BILL_NO/>\n" +
            "\t\t<IC_FORM_TYPE/>\n" +
            "\t\t<IC_GROSS_WT/>\n" +
            "\t\t<IC_VE_CUSTOMS_NO/>\n" +
            "\t\t<IC_VE_NAME/>\n" +
            "\t\t<IC_CONTA_ID/>\n" +
            "\t\t<IC_ESEAL_ID/>\n" +
            "\t\t<IC_REG_DATETIME/>\n" +
            "\t\t<IC_PER_DAY_DUE/>\n" +
            "\t</IC>\n" +
            "\t<WEIGHT>\n" +
            "\t\t<GROSS_WT>${GROSS_WT}</GROSS_WT>\n" +
            "\t</WEIGHT>\n" +
            "\t<CAR>\n" +
            "\t\t<VE_NAME>${VE_NAME}</VE_NAME>\n" +
            "\t\t<CAR_EC_NO/>\n" +
            "\t\t<CAR_EC_NO2/>\n" +
            "\t\t<VE_CUSTOMS_NO/>\n" +
            "\t\t<VE_WT/>\n" +
            "\t</CAR>\n" +
            "\t<CONTA>\n" +
            "\t\t<CONTA_NUM/>\n" +
            "\t\t<CONTA_RECO>${CONTA_RECO}</CONTA_RECO>\n" +
            "\t\t<CONTA_ID_F/>\n" +
            "\t\t<CONTA_ID_B/>\n" +
            "\t\t<CONTA_MODEL_F/>\n" +
            "\t\t<CONTA_MODEL_B/>\n" +
            "\t</CONTA>\n" +
            "\t<ORDER_NUM/>\n" +
            "\t<BAR_CODE>${BAR_CODE}</BAR_CODE>\n" +
            "\t<SEAL>\n" +
            "\t\t<ESEAL_ID/>\n" +
            "\t\t<SEAL_KEY/>\n" +
            "\t</SEAL>\n" +
            "</GATHER_INFO>";

    private static final String COMMAND_INFO_TEMPLATE = "<COMMAND_INFO AREA_ID=\"${AREA_ID}\" CHNL_NO=\"${CHNL_NO}\" I_E_TYPE=\"${I_E_TYPE}\" SEQ_NO=\"${SEQ_NO}\">\n" +
            "\t<CHECK_RESULT>${CHECK_RESULT}</CHECK_RESULT>\n" +
            "\t<OP_HINT>${OP_HINT}</OP_HINT>\n" +
            "\t<SEAL>\n" +
            "\t\t<ESEAL_ID/>\n" +
            "\t\t<SEAL_KEY>${SEAL_KEY}</SEAL_KEY>\n" +
            "\t\t<OPEN_TIMES/>\n" +
            "\t\t<ESEAL_IC_NO/>\n" +
            "\t</SEAL>\n" +
            "\t<SZ_MSG/>\n" +
            "</COMMAND_INFO>";
zhangFan authored
69
    /**
zhangFan authored
70 71
    * @Param GatherInfo 卡口采集信息
    * @Param flag 是否放行信息
zhangFan authored
72 73 74
    * */
    public static void Client(GatherInfo info,String flag) {
        String xmlBody = getXmlInfo(info,flag);
75 76 77 78
        sendWithSocket(info,xmlBody);
    }

    private static void sendWithSocket(GatherInfo info,String xmlBody){
zhangFan authored
79 80 81
        Socket socket =null;
        OutputStream op = null;
        try {
zhangFan authored
82
            //ip+端口
83
            socket = new Socket("10.50.7.10", 9998);
朱兆平 authored
84
            log.info("socket通讯创建连接成功");
zhangFan authored
85
            op = socket.getOutputStream();
zhangFan authored
86
            //xml字节流
zhangFan authored
87
            byte[]xBody =xmlBody.getBytes("GB2312");
zhangFan authored
88
            //包头
zhangFan authored
89 90 91 92 93
            byte[] head = new byte[4];
            head[0]=(byte)0xE2;
            head[1]=(byte)0x5C;
            head[2]=(byte)0x4B;
            head[3]=(byte)0x89;
94
            //消息类型,0x21为gatherInfo 0x22为commandInfo
zhangFan authored
95 96
            byte[] mType = new byte[1];
            mType[0] = (byte)0x22;
zhangFan authored
97 98 99 100 101 102 103
            //场站号
            byte[]station =info.getAreaid().getBytes("ASCII");
            //通道号
            byte[]aisle =info.getChnlno().getBytes("ASCII");
            //进出标识
            byte[]eType =info.getIetype().getBytes("ASCII");
            //标识符
zhangFan authored
104
            byte[] bwFlag = new byte[4];
zhangFan authored
105 106 107 108
            bwFlag[0]=(byte)0x00;
            bwFlag[1]=(byte)0x00;
            bwFlag[2]=(byte)0x00;
            bwFlag[3]=(byte)0x00;
zhangFan authored
109
            //xml字节流长度
zhangFan authored
110
            byte[]xmlLength = intToByte4(xBody.length);
zhangFan authored
111
            //包尾
zhangFan authored
112 113 114
            byte[]end = new byte[2];
            end[0]=(byte)0xFF;
            end[1]=(byte)0xFF;
zhangFan authored
115 116
            System.out.println();
            //总长 4为总长的length
zhangFan authored
117
            byte [] packge = intToByte4((head.length+xBody.length+mType.length+station.length+aisle.length+eType
zhangFan authored
118
                    .length+bwFlag.length+xmlLength.length+end.length+4));
zhangFan authored
119 120 121
            byte[]allByte = byteMergerAll(head,packge,mType,station,aisle,eType,bwFlag,xmlLength,xBody,end);
            op.write(allByte);
            op.flush();
zhangFan authored
122
            op.close();
朱兆平 authored
123
            log.info("发送完毕");
zhangFan authored
124 125 126
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
朱兆平 authored
127
            log.info("创建连接失败"+e.getMessage());
zhangFan authored
128 129
        } catch (IOException e) {
            e.printStackTrace();
朱兆平 authored
130
            log.info("文件发送失败"+e.getMessage());
zhangFan authored
131 132
        }
    }
133 134 135 136 137 138

    private static void sendWithSocket_x21(GatherInfo info,String xmlBody){
        Socket socket =null;
        OutputStream op = null;
        try {
            //ip+端口
139
            socket = new Socket("10.50.7.10", 9998);
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 189
            log.info("socket通讯创建连接成功");
            op = socket.getOutputStream();
            //xml字节流
            byte[]xBody =xmlBody.getBytes("GB2312");
            //包头
            byte[] head = new byte[4];
            head[0]=(byte)0xE2;
            head[1]=(byte)0x5C;
            head[2]=(byte)0x4B;
            head[3]=(byte)0x89;
            //消息类型,0x21为gatherInfo 0x22为commandInfo
            byte[] mType = new byte[1];
            mType[0] = (byte)0x21;
            //场站号
            byte[]station =info.getAreaid().getBytes("ASCII");
            //通道号
            byte[]aisle =info.getChnlno().getBytes("ASCII");
            //进出标识
            byte[]eType =info.getIetype().getBytes("ASCII");
            //标识符
            byte[] bwFlag = new byte[4];
            bwFlag[0]=(byte)0x00;
            bwFlag[1]=(byte)0x00;
            bwFlag[2]=(byte)0x00;
            bwFlag[3]=(byte)0x00;
            //xml字节流长度
            byte[]xmlLength = intToByte4(xBody.length);
            //包尾
            byte[]end = new byte[2];
            end[0]=(byte)0xFF;
            end[1]=(byte)0xFF;
            System.out.println();
            //总长 4为总长的length
            byte [] packge = intToByte4((head.length+xBody.length+mType.length+station.length+aisle.length+eType
                    .length+bwFlag.length+xmlLength.length+end.length+4));
            byte[]allByte = byteMergerAll(head,packge,mType,station,aisle,eType,bwFlag,xmlLength,xBody,end);
            op.write(allByte);
            op.flush();
            op.close();
            log.info("发送完毕");
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            log.info("创建连接失败"+e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
            log.info("文件发送失败"+e.getMessage());
        }
    }
zhangFan authored
190 191 192
    /**
     * @Param info 卡口采集信息
     * @Param flag 放行标识
zhangFan authored
193
     * @Result 生成放行报文
zhangFan authored
194
     * */
zhangFan authored
195 196
    private static String getXmlInfo(GatherInfo info,String message) {
        String flag = null;
197
        if ("直接放行".equals(message) || "海关放行".equals(message)){
zhangFan authored
198
            flag = "00";
zhangFan authored
199 200
        } else{
            flag = "11";
zhangFan authored
201
        }
zhangFan authored
202
        StringBuffer buffer = new StringBuffer();
zhangFan authored
203 204
        buffer.append("<COMMAND_INFO AREA_ID=\""+info.getAreaid()+"\" CHNL_NO=\""+info.getChnlno()+"\" I_E_TYPE=\""+info
                .getIetype()+"\" SEQ_NO=\""+info.getSeqno()+"\">");
zhangFan authored
205 206 207 208 209 210 211
        String type = null;
        if("I".equals(info.getIetype())){
            type="000000200000000000";
        }else{
            type="000000100000000000";
        }
        buffer.append("<CHECK_RESULT>"+flag+type+"</CHECK_RESULT><OP_HINT>"+message+"</OP_HINT>");
zhangFan authored
212
        buffer.append("<SEAL>");
zhangFan authored
213
        buffer.append("<ESEAL_ID>"+info.getEsealid()+"</ESEAL_ID>");
zhangFan authored
214 215 216 217 218 219
        if(flag == "00"){
            buffer.append("<SEAL_KEY>1234567890</SEAL_KEY>");
        }else{
            buffer.append("<SEAL_KEY>"+info.getSealkey()+"</SEAL_KEY>");
        }
zhangFan authored
220 221 222 223 224 225 226 227
        buffer.append("<OPEN_TIMES></OPEN_TIMES>");
        buffer.append("<ESEAL_IC_NO></ESEAL_IC_NO>");
        buffer.append("</SEAL>");
        buffer.append("<SZ_MSG></SZ_MSG>");
        buffer.append("</COMMAND_INFO>");
        return buffer.toString();
    }
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
    /**
     * 生成GATHERINFO 报文内容
     * @param info 过卡信息
     * @return X21报文
     */
    public static void gatherInfoBuildAndSend(GatherInfo info){
        String gatherXML = "";
        gatherXML = GATHER_TEMPLATE.replace("${AREA_ID}",info.getAreaid())
                .replace("${CHNL_NO}",info.getChnlno())
                .replace("${I_E_TYPE}",info.getIetype())
                .replace("${SEQ_NO}",info.getSeqno())
                .replace("${GROSS_WT}",  info.getGrosswt().toString())
                .replace("${VE_NAME}",info.getVename())
                .replace("${CONTA_RECO}",info.getContareco())
                //给三宝的去掉BARCODE,todo:不去掉做个测试
                .replace("${BAR_CODE}",info.getBarcode());
245
        sendWithSocket_x21(info,gatherXML);
246 247 248
    }

zhangFan authored
249
    //int转byte
zhangFan authored
250
    private static byte[] intToByte4(int i) {
zhangFan authored
251 252 253 254 255 256 257 258 259 260
        byte[] targets = new byte[4];
        //低位到高位
        targets[0] = (byte) (i & 0xFF);
        targets[1] = (byte) (i >> 8 & 0xFF);
        targets[2] = (byte) (i >> 16 & 0xFF);
        targets[3] = (byte) (i >> 24 & 0xFF);
        return targets;
    }

    //byte转int
zhangFan authored
261
    private static int byteArrayToInt(byte[] bytes) {
zhangFan authored
262 263 264 265 266 267 268 269 270
        int value = 0;
        // 由高位到低位
        for (int i = 0; i < 4; i++) {
            int shift = (4 - 1 - i) * 8;
            value += (bytes[i] & 0x000000FF) << shift;// 往高位游
        }
        return value;
    }
zhangFan authored
271
    //合并byte数据
zhangFan authored
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
    private static byte[] byteMergerAll(byte[]... values) {
        int length_byte = 0;
        for (int i = 0; i < values.length; i++) {
            length_byte += values[i].length;
        }
        byte[] all_byte = new byte[length_byte];
        int countLength = 0;
        for (int i = 0; i < values.length; i++) {
            byte[] b = values[i];
            System.arraycopy(b, 0, all_byte, countLength, b.length);
            countLength += b.length;
        }
        return all_byte;
    }
zhangFan authored
287
}