java写包走udp/tcp协议发送和接收

发送包数据的代码

//发送的controller层
package com.rengu.project.integrationoperations.controller;

import com.rengu.project.integrationoperations.configuration.LogConfig;
//import com.rengu.project.integrationoperations.configuration.LogConfig;
import com.rengu.project.integrationoperations.entity.*;
import com.rengu.project.integrationoperations.enums.SystemStatusCodeEnum;
import com.rengu.project.integrationoperations.service.WebSendToCService;
import com.rengu.project.integrationoperations.service.SysErrorLogService;
import com.rengu.project.integrationoperations.service.WebReceiveToCService;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;

import org.apache.commons.io.IOUtils;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotNull;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * web端发送到c++端
 *
 * @Author:
 * @Date: 2019/4/12 13:30
 */
@RestController
@RequestMapping(path = "/deployment")
@Slf4j
public class WebSendToCController {
   
	private final WebSendToCService webSendToCService;
	private final WebReceiveToCService receiveInformationService;
	private final SysErrorLogService sysErrorLogService;

	// 设置同批数据为同一序号
	private final int serialNumber = 0;

	@Autowired
	public WebSendToCController(WebSendToCService webSendToCService, WebReceiveToCService receiveInformationService,
								SysErrorLogService sysErrorLogService) {
   
		this.webSendToCService = webSendToCService;
		this.receiveInformationService = receiveInformationService;
		this.sysErrorLogService = sysErrorLogService;

	}

	// 发送系统校时
	@PostMapping("/sendSystemTiming/communication")
	//@LogConfig("发送系统校时")
	public ResultEntity sendSystemTiming(SystemSendTimingCMD systemSendTimingCMD,
										 @NonNull String host, @NonNull String updateAll) throws IOException {
   
		try {
   
			webSendToCService.sendSystemTiming(systemSendTimingCMD, host, updateAll, serialNumber);
		} catch (Exception e) {
   
			// receiveInformationService.receiveSocketHandler1(byteBuffer, host);
			System.out.println("发送系统校时异常");
			SysErrorLogEntity sysErrorLogEntity = new SysErrorLogEntity();
			sysErrorLogEntity.setHost(host);
			sysErrorLogEntity.setErrorMsg("发送系统校时异常");
			sysErrorLogEntity.setErrorType("系统校时异常");
			sysErrorLogEntity.setCreateTime(new Date());
			sysErrorLogService.saveError(sysErrorLogEntity);
		}
		return new ResultEntity(SystemStatusCodeEnum.SUCCESS, null);
	}

	// 添加定时发送
//	@PostMapping("/addSystemTimingTask/communication")
//	//@LogConfig("添加定时发送")
//	public ResultEntity addSystemTimingTask(String timeNow, String timingPattern, String time, String sendTime,
//											String host, String updateAll) throws SchedulerException {
   
//		return new ResultEntity(SystemStatusCodeEnum.SUCCESS, webSendToCService.addTimeSendTask(timeNow, time, sendTime,
//				timingPattern, host, updateAll, serialNumber));
//	}

	// 设备复位
	@PostMapping("/sendDeviceRestoration/communication")
	public ResultEntity sendDeviceRestoration(DeviceRestorationSendCMD deviceRestorationSendCMD, String host,
											  @NonNull String updateAll) {
   
		try {
   
			webSendToCService.sendDeviceRestoration(deviceRestorationSendCMD, host, updateAll, serialNumber);
		} catch (Exception e) {
   
			System.out.println("设备复位异常");
			SysErrorLogEntity sysErrorLogEntity = new SysErrorLogEntity();
			sysErrorLogEntity.setHost(host);
			sysErrorLogEntity.setErrorMsg("发送设备复位异常");
			sysErrorLogEntity.setErrorType("设备复位异常");
			sysErrorLogEntity.setCreateTime(new Date());
			sysErrorLogService.saveError(sysErrorLogEntity);
		}
		return new ResultEntity(SystemStatusCodeEnum.SUCCESS, "发送指令成功");
	}

	// 设备自检指令
	@PostMapping("/sendDeviceCheckCMD/communication")
	//@LogConfig("设备自检指令")
	public ResultEntity sendDeviceCheckCMD(DeviceCheckCMD deviceCheckCMD, String host, @NonNull String updateAll) {
   
		try {
   
			webSendToCService.sendDeviceCheckCMD(deviceCheckCMD, host, updateAll, serialNumber);
		} catch (Exception e) {
   
			e.printStackTrace();
			SysErrorLogEntity sysErrorLogEntity = new SysErrorLogEntity();
			sysErrorLogEntity.setHost(host);
			sysErrorLogEntity.setErrorMsg("发送设备自检指令异常");
			sysErrorLogEntity.setErrorType("设备自检指令异常");
			sysErrorLogEntity.setCreateTime(new Date());
			sysErrorLogService.saveError(sysErrorLogEntity);
		}
		return new ResultEntity(SystemStatusCodeEnum.SUCCESS, "发送指令成功");
	}

	// 软件版本更新
	@PostMapping("/sendSoftwareUpdateCMD/communication")
	//@LogConfig("软件版本更新")
	public ResultEntity sendSoftwareUpdateCMD(String timeNow, String cmd, String softwareID, String host,
											  @NonNull String updateAll) {
   
		try {
   
			webSendToCService.sendSoftwareUpdateCMD(timeNow, cmd, softwareID.trim(), host, updateAll, serialNumber);
		} catch (Exception e) {
   
			System.out.println("软件版本更新异常");
			SysErrorLogEntity sysErrorLogEntity = new SysErrorLogEntity();
			sysErrorLogEntity.setHost(host);
			sysErrorLogEntity.setErrorMsg("发送软件版本更新异常");
			sysErrorLogEntity.setErrorType("软件版本更新异常");
			sysErrorLogEntity.setCreateTime(new Date());
			sysErrorLogService.saveError(sysErrorLogEntity);
		}
		return new ResultEntity(SystemStatusCodeEnum.SUCCESS, "发送指令成功");
	}

	// 设备网络参数更新指令
	@PostMapping("/sendDeviceNetworkCMD/communication")
	//@LogConfig("设备网络参数更新指令")
	public ResultEntity sendDeviceNetworkCMD(SendDeviceNetWorkParam sendDeviceNetWorkParam, String host,
											 @NonNull String updateAll) {
   
		try {
   
			webSendToCService.sendDeviceNetworkCMD(sendDeviceNetWorkParam, host, updateAll, serialNumber);
		} catch (Exception e) {
   
			// log.info("设备网络参数更新指令异常", e);
			System.out.println("设备网络参数更新指令异常");
			SysErrorLogEntity sysErrorLogEntity = new SysErrorLogEntity();
			sysErrorLogEntity.setHost(host);
			sysErrorLogEntity.setErrorMsg("发送设备网络参数更新指令异常");
			sysErrorLogEntity.setErrorType("设备网络参数更新指令异常");
			sysErrorLogEntity.setCreateTime(new Date());
			sysErrorLogService.saveError(sysErrorLogEntity);
		}
		return new ResultEntity(SystemStatusCodeEnum.SUCCESS, "发送指令成功");
	}

	// 设备工作流程控制指令
	@PostMapping("/sendDeviceWorkFlowCMD/communication")
	//@LogConfig("设备工作流程控制指令")
	public ResultEntity sendDeviceWorkFlowCMD(DeviceWorkFlowCMD deviceWorkFlowCMD, SystemControlCMD systemControlCMD,
											  Integer count, String host, @NonNull String updateAll) {
   
		try {
   
			webSendToCService.sendDeviceWorkFlowCMD(deviceWorkFlowCMD, systemControlCMD, count, host, updateAll,
					serialNumber);
		} catch (Exception e) {
   
			// log.info("设备工作流程控制指令异常", e);
			System.out.println("设备工作流程控制指令异常");
			SysErrorLogEntity sysErrorLogEntity = new SysErrorLogEntity();
			sysErrorLogEntity.setHost(host);
			sysErrorLogEntity.setErrorMsg("发送设备工作流程控制指令");
			sysErrorLogEntity.setErrorType("设备工作流程控制指令");
			sysErrorLogEntity.setCreateTime(new Date());
			sysErrorLogService.saveError(sysErrorLogEntity);
		}
		return new ResultEntity(SystemStatusCodeEnum.SUCCESS, "发送控制指令成功");
	}

	// 设备工作流程控制指令(雷达分机指令)(单发,群发)
	@PostMapping("/sendExtensionInstructionsCMD/communication")
	//@LogConfig("设备工作流程控制指令(雷达分机指令)")
	public ResultEntity sendExtensionInstructions(@RequestBody ArrayList<RadarDeviceCMD> deviceWorkFlowCMD,
												  @RequestHeader String deviceHost, @RequestHeader String updateAll) {
   
		if (512 - deviceWorkFlowCMD.size() * 32 < 0) {
   
			return new ResultEntity(SystemStatusCodeEnum.ERROR, "指令条数已超出");
		} else {
   
			try {
   
				webSendToCService.sendExtensionInstructionsCMD(deviceWorkFlowCMD, deviceHost, updateAll, serialNumber);
			} catch (Exception e) {
   
				// e.printStackTrace();
				System.out.println("设备工作流程控制指令(雷达分机指令)");
				SysErrorLogEntity sysErrorLogEntity = new SysErrorLogEntity();
				sysErrorLogEntity.setHost(deviceHost);
				sysErrorLogEntity.setErrorMsg("发送设备工作流程控制指令(雷达分机指令)");
				sysErrorLogEntity.setErrorType("设备工作流程控制指令(雷达分机指令)");
				sysErrorLogEntity.setCreateTime(new Date());
				sysErrorLogService.saveError(sysErrorLogEntity);
			}
			return new ResultEntity(SystemStatusCodeEnum.SUCCESS, "发送雷达分机指令成功");
		}
	}

	// 设备工作流程控制指令(雷达系统指令)(单发,群发)
	@PostMapping("/sendSystemInstructionsCMD/communication")
	//@LogConfig("设备工作流程控制指令(雷达系统指令)")
	public ResultEntity sendSystemInstructions(@RequestBody ArrayList<SystemControlCMD> systemControlCMDs,
											   @RequestHeader String deviceHost, @RequestHeader String updateAll) {
   
		if (512 - systemControlCMDs.size() * 48 < 0) {
   
			return new ResultEntity(SystemStatusCodeEnum.ERROR, "指令条数已超出");
		} else {
   
			try {
   
				webSendToCService.sendSystemInstructionsCMD(systemControlCMDs, deviceHost, updateAll, serialNumber);
			} catch (Exception e) {
   
				System.out.println("设备工作流程控制指令(雷达系统指令)");
				SysErrorLogEntity sysErrorLogEntity = new SysErrorLogEntity();
				sysErrorLogEntity.setHost(deviceHost);
				sysErrorLogEntity.setErrorMsg("发送设备工作流程控制指令(雷达系统指令)");
				sysErrorLogEntity.setErrorType("设备工作流程控制指令(雷达系统指令)");
				sysErrorLogEntity.setCreateTime(new Date());
				sysErrorLogService.saveError(sysErrorLogEntity);
			}
			return new ResultEntity(SystemStatusCodeEnum.SUCCESS, "发送雷达系统指令成功");
		}
	}

	// 敌我系统控制(单发,群发)
	@PostMapping("/sendEnemyAndUsSystemCMD/communication")
	//@LogConfig("敌我系统控制")
	public ResultEntity sendEnemyAndUsCMD(@RequestHeader String deviceHost, @RequestHeader String updateAll,
										  @RequestBody ArrayList<EnemyAndUsCMD> enemyAndUsCMDs) throws IOException {
   
		if (512 - enemyAndUsCMDs.size() * 64 < 0) {
   
			return new ResultEntity(SystemStatusCodeEnum.ERROR, "指令条数已超出");
		} else {
   
			try {
   
				webSendToCService.sendEnemyAndUsCMD(enemyAndUsCMDs, deviceHost, updateAll, serialNumber);
			} catch (Exception e) {
   
				System.out.println("敌我系统控制");
				SysErrorLogEntity sysErrorLogEntity = new SysErrorLogEntity();
				sysErrorLogEntity.setHost(deviceHost);
				sysErrorLogEntity.setErrorMsg("发送敌我系统控制");
				sysErrorLogEntity.setErrorType("敌我系统控制");
				sysErrorLogEntity.setCreateTime(new Date());
				sysErrorLogService.saveError(sysErrorLogEntity);
			}

			return new ResultEntity(SystemStatusCodeEnum.SUCCESS, "发送敌我系统指令成功");
		}
	}

	// 查询所有
	@GetMapping
	public ResultEntity findAll() {
   
		return new ResultEntity(SystemStatusCodeEnum.SUCCESS, receiveInformationService.findAll());
	}
}

//发送的service层
package com.rengu.project.integrationoperations.service;

import com.rengu.project.integrationoperations.entity.*;
import com.rengu.project.integrationoperations.enums.SystemStatusCodeEnum;
import com.rengu.project.integrationoperations.exception.SystemException;
import com.rengu.project.integrationoperations.repository.CMDSerialNumberRepository;
import com.rengu.project.integrationoperations.repository.HostRepository;
import com.rengu.project.integrationoperations.repository.TimingTaskRepository;
import com.rengu.project.integrationoperations.thread.TCPThread;
import com.rengu.project.integrationoperations.util.JsonUtils;
import com.rengu.project.integrationoperations.util.SocketConfig;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.SocketChannel;
import java.text.SimpleDateFormat;
import java.util.*;

import static com.rengu.project.integrationoperations.util.SocketConfig.BinaryToDecimal;

/**
 * java端发送给c++端
 *
 * @Author: yaojiahao
 * @Date: 2019/4/12 13:32
 */
@Service
@Slf4j
public class WebSendToCService {
   
    private byte backups = 0;
    private final CMDSerialNumberRepository cmdSerialNumberRepository;
    private short shorts = 0;
    private final HostRepository hostRepository;// 当前连接的最大数·
    private final TimingTaskRepository timingTaskRepository;
    private final SchedulerFactoryBean schedulerFactoryBean;
    private SimpMessagingTemplate simpMessagingTemplate;
    DynamicJobService jobService;

    @Autowired
    private SysLogService sysLogService;

    public WebSendToCService(CMDSerialNumberRepository cmdSerialNumberRepository,
                             SchedulerFactoryBean schedulerFactoryBean, TimingTaskRepository timingTaskRepository,
                             HostRepository hostRepository) {
    //

        this.cmdSerialNumberRepository = cmdSerialNumberRepository;
        this.hostRepository = hostRepository;
        this.timingTaskRepository = timingTaskRepository;
//		this.jobService = jobService;
        this.schedulerFactoryBean = schedulerFactoryBean;
    }

    // 系统控制指令帧格式说明(头部固定信息)
    private void sendSystemControlCmdFormat(ByteBuffer byteBuffer, int dataLength, short purPoseAddress,
                                            short sourceAddress, byte regionID, byte themeID, short messageCategory, long sendingDateTime,
                                            int seriesNumber, int packageSum, int currentNum, int dataLengthSum, short version, int retain1,
                                            short retain2) {
   
        // 十六进制转换成十进制
        byteBuffer.putInt(2122389735); // 报文头 7E8118E7
        byteBuffer.putInt(dataLength); // 当前包数据长度
        // 获取当前pid (无法获取目标的pid,暂时拿源地址的PID)
        // String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
        byteBuffer.putShort(shorts); // 目的地址(设备ID号)
        byteBuffer.putShort(sourceAddress); // 源地址(设备ID号)
        byteBuffer.put(regionID); // 域ID(预留)
        byteBuffer.put(themeID); // 主题ID(预留)
        byteBuffer.putShort(messageCategory); // 信息类别号 (各种交换的信息格式报分配唯一的编号)
        // byteBuffer.putLong(getTimes()); // 发报日期时间
        byteBuffer.putLong((long) 0);
        byteBuffer.putInt(seriesNumber); // 序列号 (同批数据的序列号相同,不同批数据的序列号不同)
        byteBuffer.putInt(1); // 包总数 (当前发送的数据,总共分成几个包发送。默认一包)
        byteBuffer.putInt(currentNum); // 当前包号 (当前发送的数据包序号。从1开始,当序列号不同时,当前包号清零,从1开始。)
        byteBuffer.putInt(1536); // 数据总长度
        // 高八位 主版本号 低八位 副版本号 0001 1000
        byteBuffer.putShort((short) 24); // 版本号
        byteBuffer.putInt(retain1); // 保留字段
        byteBuffer.putShort(retain2); // 保留字段
    }

    /**
     * 3.4.6.3 设备自检指令
     *
     * @throws IOException
     */
    public void sendDeviceCheckCMD(DeviceCheckCMD deviceCheckCMD, String host, String updateAll, int serialNumber)
            throws IOException {
   
        // 群发消息
        if (updateAll.equals("1")) {
   
            List<AllHost> list = hostRepository.findAll();
            // 调用序号自增
            int serialNumbers = addSerialNum();
            for (AllHost allHost : list) {
   
                sendDeviceCheckCMD(deviceCheckCMD, allHost.getHost(), "0", serialNumbers);
            }
        } else {
   
            ByteBuffer byteBuffer = ByteBuffer.allocate(84);
            byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
            // 如果等于0 代表该数据并非是群发,因为同批数据序号无需自增,代表群发的消息序号共享同一个序号
            int serialNumber1;
            if (serialNumber == 0) {
   
                serialNumber1 = addSerialNum();
            } else {
   
                serialNumber1 = serialNumber;
            }
            // 头部固定信息 凡是为0的数据 都只是暂定数据 待后期修改
            sendSystemControlCmdFormat(byteBuffer, 84, backups, backups, backups, backups, (short) 12290, 0,
                    serialNumber1, 0, serialNumber1, 0, shorts, 0, shorts);
            // 报文内容
            byteBuffer.putInt(0); // 信息长度 待定
            byteBuffer.putLong(Long.parseLong(deviceCheckCMD.getTaskFlowNo()));// 任务流水号
            byteBuffer.put(Byte.parseByte(deviceCheckCMD.getCheckType())); // 自检类型

            byteBuffer.putShort(Short.parseShort(deviceCheckCMD.getCheckPeriod())); // 自检周期
            byte num = (byte) (Integer.parseInt(deviceCheckCMD.getCheckNum()));
            byteBuffer.put(num); // 自检数量
            byteBuffer.putInt(Integer.parseInt(deviceCheckCMD.getSingleMachineCode())); // 自检单机代码
            // 雷达
            byteBuffer.putShort(Short.parseShort(deviceCheckCMD.getRadarSelfChecking())); // 自检频率
            byteBuffer.put(Byte.parseByte(deviceCheckCMD.getRadarBranChoose()));// 带宽选择
            byteBuffer.put(Byte.parseByte(deviceCheckCMD.getRadarSelfChoose()));// 自检模式选择
            // 敌我
            byteBuffer.putShort(Short.parseShort(deviceCheckCMD.getEnemyAndUsSelfChecking())); // 自检频率
            byteBuffer.put(Byte.parseByte(deviceCheckCMD.getEnemyAndUsBranChoose()));// 带宽选择
            byteBuffer.put(Byte.parseByte(deviceCheckCMD.getEnemyAndUsSelfChoose()));// 自检模式选择

            byteBuffer.putInt(getByteCount(byteBuffer)); // 校验和
            // 帧尾
            getBigPackageTheTail(byteBuffer);
            // 发送信息
            sendMessage(host, byteBuffer);
            SysLogEntity sysLogEntity = new SysLogEntity();
            String action = JsonUtils.toJson(deviceCheckCMD);
            sysLogEntity.setUserAction("设备自检");
            sysLogEntity.setActionDescription(action);
            sysLogEntity.setCreateTime(new Date());
            sysLogEntity.setHost(host);
            sysLogService.saveLog(sysLogEntity);
        }
    }

    /**
     * 3.4.6.4 系统校时指令
     *
     * @throws IOException
     */
    public void sendSystemTiming(SystemSendTimingCMD systemSendTimingCMD, String host, String updateAll,
                                 int serialNumber) throws IOException {
   
        if (updateAll.equals("1")) {
   
            List<AllHost> list = hostRepository.findAll();
            int serialNumbers = addSerialNum();
            for (AllHost allHost : list) {
   
                sendSystemTiming(systemSendTimingCMD, allHost.getHost(), "0", serialNumbers);
            }
        } else {
   
            ByteBuffer byteBuffer = ByteBuffer.allocate(77);
            byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
            // 如果等于0 代表该数据并非是群发,因为同批数据序号无需自增,代表群发的消息序号共享同一个序号
            int serialNumber1;
            if (serialNumber == 0) {
   
                serialNumber1 = addSerialNum();
            } else {
   
                serialNumber1 = serialNumber;
            }
            // 头部固定信息 凡是为0的数据 都只是暂定数据 待后期修改
            sendSystemControlCmdFormat(byteBuffer, 77, shorts, shorts, backups, backups, (short) 12291, 0,
                    serialNumber1, 0, serialNumber1, 0, shorts, 0, shorts);
            // 报文内容
            byteBuffer.putInt(1); // 信息长度
            byteBuffer.putLong(Long.parseLong(systemSendTimingCMD.getTimeNow()));
            byteBuffer.put(Byte.parseByte(systemSendTimingCMD.getTimingPattern()));
            byteBuffer.putLong(Long.parseLong(systemSendTimingCMD.getTime()));
            byteBuffer.putInt(getByteCount(byteBuffer)); // 校验和
            getBigPackageTheTail(byteBuffer);
            // 发送信息
            sendMessage(host, byteBuffer);
            // 发送系统校时指令日志
            SysLogEntity sysLogEntity = new SysLogEntity();
            String str = JsonUtils.toJson(systemSendTimingCMD);
            sysLogEntity.setUserAction("系统校时指令");
            sysLogEntity.setActionDescription(str);
            sysLogEntity.setCreateTime(new Date());
            sysLogEntity.setHost(host);
            sysLogService.saveLog(sysLogEntity);
        }
    }

    /**
     * 3.4.6.5 设备复位
     *
     * @throws IOException
     */
    public void sendDeviceRestoration(DeviceRestorationSendCMD deviceRestorationSendCMD, String host, String updateAll,
                                      int serialNumber) throws IOException {
   
        if (updateAll.equals("1")) {
   
            List<AllHost> list = hostRepository.findAll();
            int serialNumbers = addSerialNum();
            for (AllHost allHost : list) {
   
                try {
   
                    sendDeviceRestoration(deviceRestorationSendCMD, allHost.getHost(), "0", serialNumbers);
                } catch (Exception e) {
   
                    // TODO: handle exception
                    e.printStackTrace();
                }

            }
        } else {
   
            ByteBuffer byteBuffer = ByteBuffer.allocate(69);
            byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
            // 如果等于0 代表该数据并非是群发,因为同批数据序号无需自增,代表群发的消息序号共享同一个序号
            int serialNumber1;
            if (serialNumber == 0) {
   
                serialNumber1 = addSerialNum();
            } else {
   
                serialNumber1 = serialNumber;
            }
            // 头部固定信息 凡是为0的数据 都只是暂定数据 待后期修改
            sendSystemControlCmdFormat(byteBuffer, 69, shorts, shorts, backups, backups, (short) 12292, 0,
                    serialNumber1, 0, serialNumber1, 0, shorts, 0, shorts);
            // 报文内容
            byteBuffer.putInt(1); // 信息长度
            byteBuffer.putLong(Long.parseLong(deviceRestorationSendCMD.getTimeNow())); // 任务流水号
            byteBuffer.put(Byte.parseByte(deviceRestorationSendCMD.getExecutePattern())); // 执行方式
            byteBuffer.putInt(getByteCount(byteBuffer)); // 校验和
            getBigPackageTheTail(byteBuffer);
            // 发送信息
            sendMessage(host, byteBuffer);
            // 记录操作日
            String type = JsonUtils.toJson(deviceRestorationSendCMD);
            SysLogEntity sysLogEntity = new SysLogEntity();
            sysLogEntity.setUserAction("远程开关机指令");
            sysLogEntity.setCreateTime(new Date());
            sysLogEntity.setHost(host);
            sysLogEntity.setActionDescription(type);
            sysLogService.saveLog(sysLogEntity);
        }
    }

    /**
     * 3.4.6.6 软件版本远程更新
     *
     * @throws IOException
     */
    public void sendSoftwareUpdateCMD(String timeNow, String cmd, String softwareID, String host, String updateAll,
                                      int serialNumber) throws IOException {
   
        if (updateAll.equals("1")) {
   
            List<AllHost> list = hostRepository.findAll();
            int serialNumbers = addSerialNum();
            for (AllHost allHost : list) {
   
                sendSoftwareUpdateCMD(timeNow, cmd, softwareID, allHost.getHost(), "0", serialNumbers);
            }
        } else {
   
            ByteBuffer byteBuffer = ByteBuffer.allocate(72);
            byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
            // 如果等于0 代表该数据并非是群发,因为同批数据序号无需自增,代表群发的消息序号共享同一个序号
            int serialNumber1;
            if (serialNumber == 0) {
   
                serialNumber1 = addSerialNum();
            } else {
   
                serialNumber1 = serialNumber;
            }
            // 头部固定信息 凡是为0的数据 都只是暂定数据 待后期修改
            sendSystemControlCmdFormat(byteBuffer, 72, shorts, shorts, backups, backups, (short) 12293, 0,
                    serialNumber1, 0, serialNumber1, 0, shorts, 0, shorts);
            // 报文内容
            byteBuffer.putInt(2); // 信息长度
            byteBuffer.putLong(Long.parseLong(timeNow)); // 任务流水号
            byteBuffer.putShort(Short.parseShort(cmd)); // 指令操作码
            byteBuffer.putShort(Short.parseShort(softwareID)); // 软件ID号
            byteBuffer.putInt(getByteCount(byteBuffer)); // 校验和
            getBigPackageTheTail(byteBuffer);
            // 发送信息
            sendMessage(host, byteBuffer);
        }
    }

    /**
     * 3.4.6.7 设备网络参数更新指令
     *
     * @throws IOException
     */
    public void sendDeviceNetworkCMD(SendDeviceNetWorkParam sendDeviceNetWorkParam, String host, String updateAll,
                                     int serialNumber) throws IOException {
   
        if (updateAll.equals("1")) {
   
            List<AllHost> list = hostRepository.findAll();
            int serialNumbers = addSerialNum();
            for (AllHost allHost : list) {
   
                sendDeviceNetworkCMD(sendDeviceNetWorkParam, allHost.getHost(), "0", serialNumbers);
            }
        } else {
   
            ByteBuffer byteBuffer = ByteBuffer.allocate(156);
            byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
            // 如果等于0 代表该数据并非是群发,因为同批数据序号无需自增,代表群发的消息序号共享同一个序号
            int serialNumber1;
            if (serialNumber == 0) {
   
                serialNumber1 = addSerialNum();
            } else {
   
                serialNumber1 = serialNumber;
            }
            // 头部固定信息 凡是为0的数据 都只是暂定数据 待后期修改
            sendSystemControlCmdFormat(byteBuffer, 156, shorts, shorts, backups, backups, (short) 12294, 0,
                    serialNumber1, 0, serialNumber1, 0, shorts, 0, shorts);
            // 报文内容
            byteBuffer.putInt(3); // 信息长度
            byteBuffer.putLong(Long.parseLong(sendDeviceNetWorkParam.getTaskFlowNo())); // 任务流水号
            byteBuffer.putShort(Short.parseShort(sendDeviceNetWorkParam.getCmd())); // 指令操作码
            byteBuffer.putShort(Short.parseShort(sendDeviceNetWorkParam.getNetworkID())); // 网络终端ID号

            // 1
            String networkIP1 = sendDeviceNetWorkParam.getNetworkIP1();
            byteBuffer.putInt(Integer.parseInt(networkIP1(networkIP1)));
            byteBuffer.put(getMac(sendDeviceNetWorkParam.getNetworkMacIP1()));// MAC地址1
            byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkMessage1())); // 网络端口信息1

            // 2
            // byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkIP2()));
            // // 网络IP地址2
            String networkIP2 = sendDeviceNetWorkParam.getNetworkIP2();
            byteBuffer.putInt(Integer.parseInt(networkIP1(networkIP2)));
            byteBuffer.put(getMac(sendDeviceNetWorkParam.getNetworkMacIP2()));// MAC地址2
            byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkMessage2())); // 网络端口信息2

            // 3
            // byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkIP3()));
            // // 网络IP地址3
            String networkIP3 = sendDeviceNetWorkParam.getNetworkIP3();
            byteBuffer.putInt(Integer.parseInt(networkIP1(networkIP3)));
            byteBuffer.put(getMac(sendDeviceNetWorkParam.getNetworkMacIP3()));// MAC地址3
            byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkMessage3())); // 网络端口信息3

            // 4
            // byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkIP4()));
            // // 网络IP地址4
            String networkIP4 = sendDeviceNetWorkParam.getNetworkIP4();
            byteBuffer.putInt(Integer.parseInt(networkIP1(networkIP4)));
            byteBuffer.put(getMac(sendDeviceNetWorkParam.getNetworkMacIP4()));// MAC地址4
            byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkMessage4())); // 网络端口信息4

            // 5
            // byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkIP5()));
            // // 网络IP地址5
            String networkIP5 = sendDeviceNetWorkParam.getNetworkIP5();
            byteBuffer.putInt(Integer.parseInt(networkIP1(networkIP5)));
            byteBuffer.put(getMac(sendDeviceNetWorkParam.getNetworkMacIP5()));// MAC地址5
            byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkMessage5())); // 网络端口信息5

            // 6
            // byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkIP6()));
            // // 网络IP地址6
            String networkIP6 = sendDeviceNetWorkParam.getNetworkIP6();
            byteBuffer.putInt(Integer.parseInt(networkIP1(networkIP6)));
            byteBuffer.put(getMac(sendDeviceNetWorkParam.getNetworkMacIP6()));// MAC地址6
            byteBuffer.putInt(Integer.parseInt(sendDeviceNetWorkParam.getNetworkMessage6())); // 网络端口信息6
            byteBuffer.putInt(getByteCount(byteBuffer)); // 校验和
            getBigPackageTheTail(byteBuffer);
            // 发送信息
            sendMessage(host, byteBuffer);
        }
    }

    /**
     * 3.4.6.8 设备工作流程控制指令
     *
     * @throws IOException
     */
    public void sendDeviceWorkFlowCMD(DeviceWorkFlowCMD deviceWorkFlowCMD, SystemControlCMD systemControlCMD,
                                      Integer count, String host, String updateAll, int serialNumber) throws IOException {
   
        if (updateAll.equals("1")) {
   
            List<AllHost> list = hostRepository.findAll();
            int serialNumbers = addSerialNum();
            for (AllHost allHost : list) {
   
                sendDeviceWorkFlowCMD(deviceWorkFlowCMD, systemControlCMD, count, allHost.getHost(), "0",
                        serialNumbers);
            }
        } else {
   
            ByteBuffer byteBuffer = ByteBuffer.allocate(1094);// 1094
            byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
            // 如果等于0 代表该数据并非是群发,因为同批数据序号无需自增,代表群发的消息序号共享同一个序号
            int serialNumber1;
            if (serialNumber == 0) {
   
                serialNumber1 = addSerialNum();
            } else {
   
                serialNumber1 = serialNumber;
            }
            // 头部固定信息 凡是为0的数据 都只是暂定数据 待后期修改
            sendSystemControlCmdFormat(byteBuffer, 1094, shorts, shorts, backups, backups, (short) 12295, 0,
                    serialNumber1, 0, serialNumber1, 0, shorts, 0, shorts);
            // 报文内容
            byteBuffer.putInt(1); // 信息长度
            byteBuffer.putLong(Long.parseLong(deviceWorkFlowCMD.getTaskFlowNo())); // 任务流水号
            byteBuffer.putShort(Short.parseShort(deviceWorkFlowCMD.getCmd())); // 指令有效标记
            // 分机控制指令(雷达侦查指令)
            for (int i = 1; i <= count; i++) {
   
                byteBuffer.putShort(SocketConfig.header); // 包头
                byte pulse = Byte.parseByte(deviceWorkFlowCMD.getPulse()); // 内外秒脉冲选择
                byteBuffer.put(pulse);
                byteBuffer.put(backups); // 备份
                // 分机控制字
                byte[] con = extensionControl(deviceWorkFlowCMD.getExtensionControlCharacter());
                byteBuffer.put(con[0]);
                byteBuffer.put(con[1]);
                byteBuffer.put(backups); // 备份
                byteBuffer.put(Byte.parseByte(deviceWorkFlowCMD.getThreshold())); // 检测门限调节
                byteBuffer.putShort((Short.parseShort(deviceWorkFlowCMD.getOverallpulse())));// 上传脉冲数
                byteBuffer.put(Byte.parseByte(deviceWorkFlowCMD.getMinamplitude()));// 最小幅度
                byte c = (byte) (Integer.parseInt(deviceWorkFlowCMD.getMaxamplitude()) & 0xff);
                byteBuffer.put(c);// 最大幅度
                byteBuffer.putShort(Short.parseShort(deviceWorkFlowCMD.getMinPulsewidth()));// 最小脉宽
                byteBuffer.putShort(Short.parseShort(deviceWorkFlowCMD.getMaxPulsewidth()));// 最大脉宽
                byteBuffer.putShort(Short.parseShort(deviceWorkFlowCMD.getFilterMaximumFrequency()));// 筛选最大频率
                byteBuffer.putShort(Short.parseShort(deviceWorkFlowCMD.getFilterMinimumFrequency()));// 筛选最小频率
                byteBuffer.putShort(Short.parseShort(deviceWorkFlowCMD.getShieldingMaximumFrequency()));// 屏蔽最大频率
                byteBuffer.putShort(Short.parseShort(deviceWorkFlowCMD.getShieldingMinimumFrequency()));// 屏蔽最小频率
                // 默认值更新标记
                if (deviceWorkFlowCMD.getDefalutUpdate().equals("0")) {
   
                    byteBuffer.put((byte) 0);
                } else if (deviceWorkFlowCMD.getDefalutUpdate().equals("1")) {
   
                    byteBuffer.put((byte) 1);
                }
                byteBuffer.putShort(shorts); // 备份
                byteBuffer.put(backups); // 备份
                byteBuffer.putShort(shorts); // 备份
                // 小包尾
                getPackageTheTail(byteBuffer);
                // 雷达系统控制指令
                byteBuffer.putShort(SocketConfig.header);// 包头1ACF
                byteBuffer.put(Byte.parseByte(systemControlCMD.getWorkPattern()));// 工作模式
                byteBuffer.put(Byte.parseByte(systemControlCMD.getWorkPeriod())); // 工作周期
                byteBuffer.putShort(Short.parseShort(systemControlCMD.getWorkPeriodNum()));// 工作周期数
                byteBuffer.putShort(Short.parseShort(systemControlCMD.getInitialFrequency())); // 起始频率
                byteBuffer.putShort(Short.parseShort(systemControlCMD.getTerminationFrequency())); // 终止频率
                byteBuffer.putShort(Short.parseShort(systemControlCMD.getSteppedFrequency()));// 频率步进
                byteBuffer.put(Byte.parseByte(systemControlCMD.getBandWidthSelection()));// 带宽选择
                byteBuffer.putShort(shorts);// 备份
                byteBuffer.put(backups); // 备份
                byteBuffer.put(Byte.parseByte(systemControlCMD.getAntennaSelection1()));// 天线1选择(页面不展示)
                byteBuffer.put(Byte.parseByte(systemControlCMD.getAntennaSelection2()));// 天线2选择(页面不展示)
                byteBuffer.putShort(shorts);// 备份
                // 射频一衰减(最新要求改成射频2:6-18Hz射频衰减1)
                // 0:不衰减 1:衰减30db
                if (systemControlCMD.getRadioFrequencyAttenuation2().equals("0")) {
   
                    byteBuffer.put((byte) 0);
                } else if (systemControlCMD.getRadioFrequencyAttenuation2().equals("1")) {
   
                    byteBuffer.put((byte) 1);
                }
                // 射频一长电缆均衡衰减控制
//				StringBuilder stringBuilders = new StringBuilder();
//				String balancedAttenuationRF1 = stringBuilders.reverse()
//						.append(systemControlCMD.getAttenuationControl1()).toString();
//				byte bytesAttenuationRF1 = (byte) BinaryToDecimal(Integer.parseInt(balancedAttenuationRF1));
//				byteBuffer.put(bytesAttenuationRF1);
                byteBuffer.put(backups); // 射频一长电缆均衡衰减控制
                byteBuffer.putShort(shorts); // 备份
                // 射频二衰减(改名为射频1:6-18Hz射频衰减)
                // 射频一衰减(最新要求改成射频2:6-18Hz射频衰减)
                // 0:不衰减 1:衰减30db
                if (systemControlCMD.getRadioFrequencyAttenuation1().equals("0")) {
   
                    byteBuffer.put((byte) 0);
                } else if (systemControlCMD.getRadioFrequencyAttenuation1().equals("1")) {
   
                    byteBuffer.put((byte) 1);
                }
                // 射频二长电缆均衡衰减控制(最新)
//				StringBuilder stringBuilderAttenuationRF2 = new StringBuilder();
//				String balancedAttenuationRF2 = stringBuilderAttenuationRF2.reverse()
//						.append(systemControlCMD.getAttenuationControl2()).toString();
//				byte bytesAttenuationRF2 = (byte) BinaryToDecimal(Integer.parseInt(balancedAttenuationRF2));
//				byteBuffer.put(bytesAttenuationRF2);
                byteBuffer.put(backups);// 射频二长电缆均衡衰减控制
                byteBuffer.putShort(shorts);
                // (最新为中频2衰减0.5dB)
                byte mid2 = (byte) ((byte) Double.parseDouble(systemControlCMD.getMidCut2()) * 0.5);
                byteBuffer.put(mid2); // 中频衰减1
                byteBuffer.putShort(shorts); // 备份
                byteBuffer.put(backups);
                // 中频1衰减(最新)
                byte mid1 = (byte) ((byte) Double.parseDouble(systemControlCMD.getMidCut1()) * 0.5);
                byteBuffer.put(mid1);
                // 衰减码控制方式
                byteBuffer.put(Byte.parseByte(systemControlCMD.getAttenuationCodeControlMode()));
                // 自检模式选择
                byteBuffer.put(Byte.parseByte(systemControlCMD.getRadarSelfChoose()));
                // 备份
                byteBuffer.put(backups);
                // 自检源衰减
                byteBuffer.put(Byte.parseByte(systemControlCMD.getSelfCheckingSourceAttenuation()));
                // 脉内引导批次开关
                byteBuffer.put(Byte.parseByte(systemControlCMD.getBatchNumberSwitch()));
                // 脉内引导批次号
                byteBuffer.put(backups);
                // byteBuffer.put(Byte.parseByte(systemControlCMD.getBatchNumber()));
                // 故障检测门限
                byteBuffer.put(Byte.parseByte(systemControlCMD.getFaultDetectionThreshold()));
                // 定时时间码

                // 转换2进制
                // 定时时间码
                String time = systemControlCMD.getTimingTimeCode();
                // 转换月
                String monthString = time.substring(0, 2);
                // 转换日
                String dayString = time.substring(2, 4);
                // 转换时
                String hourString = time.substring(4, 6);
                // 转换分
                String minString = time.substring(6, 8);
                // 转换秒
                String secondString = time.substring(8, 10);

                // 转2进制月
                String monthBinaryString = Integer.toBinaryString(Integer.parseUnsignedInt(monthString));
                int monthLeftNum = 4 - monthBinaryString.length();
                for<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值