审查视图

src/main/java/com/sy/socket/CommandClient.java 8.2 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 14
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

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

@Component
朱兆平 authored
15
@Slf4j
zhangFan authored
16
public class CommandClient {
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
    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
70
    /**
zhangFan authored
71 72
    * @Param GatherInfo 卡口采集信息
    * @Param flag 是否放行信息
zhangFan authored
73 74 75
    * */
    public static void Client(GatherInfo info,String flag) {
        String xmlBody = getXmlInfo(info,flag);
76 77 78 79
        sendWithSocket(info,xmlBody);
    }

    private static void sendWithSocket(GatherInfo info,String xmlBody){
zhangFan authored
80 81 82
        Socket socket =null;
        OutputStream op = null;
        try {
zhangFan authored
83 84
            //ip+端口
            socket = new Socket("10.50.7.10", 9003);
朱兆平 authored
85
            log.info("socket通讯创建连接成功");
zhangFan authored
86
            op = socket.getOutputStream();
zhangFan authored
87
            //xml字节流
zhangFan authored
88
            byte[]xBody =xmlBody.getBytes("GB2312");
zhangFan authored
89
            //包头
zhangFan authored
90 91 92 93 94
            byte[] head = new byte[4];
            head[0]=(byte)0xE2;
            head[1]=(byte)0x5C;
            head[2]=(byte)0x4B;
            head[3]=(byte)0x89;
zhangFan authored
95
            //消息类型
zhangFan authored
96 97
            byte[] mType = new byte[1];
            mType[0] = (byte)0x22;
zhangFan authored
98 99 100 101 102 103 104
            //场站号
            byte[]station =info.getAreaid().getBytes("ASCII");
            //通道号
            byte[]aisle =info.getChnlno().getBytes("ASCII");
            //进出标识
            byte[]eType =info.getIetype().getBytes("ASCII");
            //标识符
zhangFan authored
105
            byte[] bwFlag = new byte[4];
zhangFan authored
106 107 108 109
            bwFlag[0]=(byte)0x00;
            bwFlag[1]=(byte)0x00;
            bwFlag[2]=(byte)0x00;
            bwFlag[3]=(byte)0x00;
zhangFan authored
110
            //xml字节流长度
zhangFan authored
111
            byte[]xmlLength = intToByte4(xBody.length);
zhangFan authored
112
            //包尾
zhangFan authored
113 114 115
            byte[]end = new byte[2];
            end[0]=(byte)0xFF;
            end[1]=(byte)0xFF;
zhangFan authored
116 117
            System.out.println();
            //总长 4为总长的length
zhangFan authored
118
            byte [] packge = intToByte4((head.length+xBody.length+mType.length+station.length+aisle.length+eType
zhangFan authored
119
                    .length+bwFlag.length+xmlLength.length+end.length+4));
zhangFan authored
120 121 122
            byte[]allByte = byteMergerAll(head,packge,mType,station,aisle,eType,bwFlag,xmlLength,xBody,end);
            op.write(allByte);
            op.flush();
zhangFan authored
123
            op.close();
朱兆平 authored
124
            log.info("发送完毕");
zhangFan authored
125 126 127
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
朱兆平 authored
128
            log.info("创建连接失败"+e.getMessage());
zhangFan authored
129 130
        } catch (IOException e) {
            e.printStackTrace();
朱兆平 authored
131
            log.info("文件发送失败"+e.getMessage());
zhangFan authored
132 133
        }
    }
zhangFan authored
134 135 136
    /**
     * @Param info 卡口采集信息
     * @Param flag 放行标识
zhangFan authored
137
     * @Result 生成放行报文
zhangFan authored
138
     * */
zhangFan authored
139 140
    private static String getXmlInfo(GatherInfo info,String message) {
        String flag = null;
141
        if ("直接放行".equals(message) || "海关放行".equals(message)){
zhangFan authored
142
            flag = "00";
zhangFan authored
143 144
        } else{
            flag = "11";
zhangFan authored
145
        }
zhangFan authored
146
        StringBuffer buffer = new StringBuffer();
zhangFan authored
147 148
        buffer.append("<COMMAND_INFO AREA_ID=\""+info.getAreaid()+"\" CHNL_NO=\""+info.getChnlno()+"\" I_E_TYPE=\""+info
                .getIetype()+"\" SEQ_NO=\""+info.getSeqno()+"\">");
zhangFan authored
149 150 151 152 153 154 155
        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
156
        buffer.append("<SEAL>");
zhangFan authored
157
        buffer.append("<ESEAL_ID>"+info.getEsealid()+"</ESEAL_ID>");
zhangFan authored
158 159 160 161 162 163
        if(flag == "00"){
            buffer.append("<SEAL_KEY>1234567890</SEAL_KEY>");
        }else{
            buffer.append("<SEAL_KEY>"+info.getSealkey()+"</SEAL_KEY>");
        }
zhangFan authored
164 165 166 167 168 169 170 171
        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();
    }
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
    /**
     * 生成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());

        sendWithSocket(info,gatherXML);
    }

zhangFan authored
193
    //int转byte
zhangFan authored
194
    private static byte[] intToByte4(int i) {
zhangFan authored
195 196 197 198 199 200 201 202 203 204
        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
205
    private static int byteArrayToInt(byte[] bytes) {
zhangFan authored
206 207 208 209 210 211 212 213 214
        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
215
    //合并byte数据
zhangFan authored
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
    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
231
}