CommandClient.java 4.8 KB
package com.sy.socket;

import com.sy.model.GatherInfo;
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
public class CommandClient {

    private static final Logger logger = Logger.getLogger(CommandClient.class);

    /**
    * @Param GatherInfo 所传卡口信息
    * @Param flag 是否放行标识符
    * */
    public static void Client(GatherInfo info,String flag) {
        String xmlBody = getXmlInfo(info,flag);
        Socket socket =null;
        OutputStream op = null;
        try {
            socket = new Socket("192.168.1.107", 9002);
            logger.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;
            //消息类型
            byte[] mType = new byte[1];
            mType[0] = (byte)0x22;
            //场站号
            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)0xFF;
            bwFlag[1]=(byte)0xFF;
            bwFlag[2]=(byte)0xFF;
            bwFlag[3]=(byte)0xFF;
            //xml字节流长度
            byte[]xmlLength = intToByte4(xBody.length);
            //包尾
            byte[]end = new byte[2];
            end[0]=(byte)0xFF;
            end[1]=(byte)0xFF;
            //总长
            byte [] packge = intToByte4((head.length+xBody.length+mType.length+station.length+aisle.length+eType
                    .length+bwFlag.length+xmlLength.length+end.length));
            byte[]allByte = byteMergerAll(head,packge,mType,station,aisle,eType,bwFlag,xmlLength,xBody,end);
            op.write(allByte);
            op.flush();
            op.close();
            logger.info("发送完毕");
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            logger.info("创建连接失败"+e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("文件发送失败"+e.getMessage());
        }


    }
    /**
     * @Param info 卡口采集信息
     * @Param flag 放行标识
     * */
    private static String getXmlInfo(GatherInfo info,String flag) {
        String message = null;
        if ("11".equals(flag)){
            message="直接放行";
        }else{
            message = "禁止通行,载重比对不在可控范围";
        }
        StringBuffer buffer = new StringBuffer();
        buffer.append("<COMMAND_INFO AREA_ID=\""+info.getAreaid()+"\" CHNL_NO=\""+info.getChnlno()+"\" I_E_TYPE=\""+info
                .getIetype()+"\" SEQ_NO=\""+info.getSeqno()+"\">");
        buffer.append("<CHECK_RESULT>"+flag+"000000000000000000</CHECK_RESULT><OP_HINT>"+message+"</OP_HINT>");
        buffer.append("<SEAL>");
        buffer.append("<ESEAL_ID>"+info.getEsealid()+"</ESEAL_ID>");
        buffer.append("<SEAL_KEY>"+info.getSealkey()+"</SEAL_KEY>");
        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();
    }

    //int转byte
    private static byte[] intToByte4(int i) {
        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
    private static int byteArrayToInt(byte[] bytes) {
        int value = 0;
        // 由高位到低位
        for (int i = 0; i < 4; i++) {
            int shift = (4 - 1 - i) * 8;
            value += (bytes[i] & 0x000000FF) << shift;// 往高位游
        }
        return value;
    }

    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;
    }

}