CZT
2023-10-07 a376b30e63684f1a0f5b7f45322801be9145c09f
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/analysis/AnalysisService.java
@@ -20,6 +20,7 @@
import com.ld.igds.protocol.beibo.grainv1.util.BeiboGrainServerUtils;
import com.ld.igds.util.BytesUtil;
import com.ld.igds.util.ContextUtil;
import com.ld.igds.util.NumberUtil;
import com.ld.igds.warn.WarnUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -51,7 +52,9 @@
    @Autowired
    private ExeOrderService exeOrderService;
    public static Map<String, Map<String, String>> contextMap = new HashMap<>();
    public static String result = "";
    public static Map<String, String> contextMap = new HashMap<>();
    public static double ERROR_CHECK_TAG = -100.0;
@@ -62,19 +65,32 @@
    public static double MAX_TEMP = -50.0;
    public static double MIN_TEMP = 50.0;
    public static void main(String[] args) {
        String str = "00000000FFEB90FEAA41E821EC21EA21EC21ED21EC21E921E221E921E921E921EC21E921ED21F021E521E521E221E421E321E321E121DE21D721E021DD21DC21DF21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
        System.out.println(str.substring(9*2, 10*2));
    }
    /**
     * 00000000FFEB90FEAA 41 E821EC21EA21EC21ED21EC21E921E221E921E921E921EC21E921ED21F021E521E521E221E421E321E321E121DE21D721E021DD21DC21DF21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
     * 00000000FFEB90FEAA41E821EC21EA21EC21ED21EC21E921E221E921E921E921EC21E921ED21F021E521E521E221E421E321E321E121DE21D721E021DD21DC21DF21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
     *
     * @param hexStr
     */
    public void analysis(String ip, int port, String hexStr) {
        ReMessage reMessage = ReMessageBuilder.getInstance().buildMessage(hexStr);
        result += hexStr;
        if(result.length() < 1066*2){
            log.info("分机------->>平台,报文长度不够,等待下一包数据");
            return;
        }
        log.info("分机------->>平台:信息报文={}", reMessage);
        //封装数据
        ReMessage reMessage = ReMessageBuilder.getInstance().buildMessage(result);
        reMessage.setIp(ip);
        reMessage.setPort(port);
        log.info("分机------->>平台:粮情完整报文信息={}", reMessage);
        result = "";
        if (!BeiboGrainServerUtils.MSG_START.startsWith(reMessage.getStartStr())) {
            log.error("分机------->>平台,解析粮情失败:报文起始符={}错误,不解析", reMessage.getStartStr());
            return;
        }
        //根据分机地址获取分机信息
@@ -100,8 +116,7 @@
            return;
        }
        DepotConf depotConf = commonService.getCacheDepotConf(
                exeRequest.getCompanyId(), exeRequest.getDepotId());
        DepotConf depotConf = commonService.getCacheDepotConf(exeRequest.getCompanyId(), exeRequest.getDepotId());
        if (null == depotConf) {
            String info = "粮情解析失败:分机=" + ser.getName() + "没有获取到粮情参数配置信息。";
            log.error("分机------>>>平台:" + info);
@@ -156,23 +171,6 @@
        }
        // 一分几多仓情况,考虑单仓采集和多仓采集
        // 单仓采集时候数据从0返回
        if (StringUtils.isEmpty(exeRequest.getDepotIds())) {
            depotConf.setCableEnd(depotConf.getCableEnd() - depotConf.getCableStart() + 1);
            depotConf.setCableStart(ser.getCableStart());
            if (DepotType.TYPE_02.getCode().equals(depotConf.getDepotType())) {
                analysisStep2(depotConf, ser, exeRequest, reMessage, sysConf);
            } else if (DepotType.TYPE_04.getCode().equals(depotConf.getDepotType())) {
                analysisStep2(depotConf, ser, exeRequest, reMessage, sysConf);
            } else {
                analysisStep1(depotConf, ser, exeRequest, reMessage, sysConf);
            }
            return;
        }
        // 批量采集所有关联一起采集,遍历执行
        for (DepotConf depotConfTemp : depotConfs) {
@@ -250,12 +248,22 @@
        int curRoot = 1;//所在根
        int curCir = 1;//所在圈
        int cirLay = 1;//当前圈的层
        int symbol = 0; //符号位
        for (int i = 0; i < strPoints.length() / 4; i++) {
            temp = strPoints.substring(i * 4, i * 4 + 4);
            if (temp == null) {
                temp = "0000";
            }
            tempValue = BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) / 10.0;
            //高低位转换后转为16位二进制字符串
            temp = BytesUtil.toBinary8StringSame(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)), 16);
            //符号位
            symbol = Integer.valueOf(temp.substring(0, 1));
            //获取温度值
            tempValue = BytesUtil.hexToInt(BytesUtil.binToHex(temp.substring(6))) * 0.0625;
            if(symbol == 1){
                tempValue = (1- BytesUtil.hexToInt(BytesUtil.binToHex(temp.substring(6))))*0.0625;
            }
            tempValue = NumberUtil.keepPrecision(tempValue, 1);
            //非正常值
            if (tempValue > ERROR_CHECK_TAG2) {
@@ -355,12 +363,23 @@
        List<Double> temps = new ArrayList<>();
        double tempValue;
        String temp;
        int symbol = 0;
        for (int i = 0; i < strPoints.length() / 4; i++) {
            temp = strPoints.substring(i * 4, i * 4 + 4);
            if (temp == null) {
                temp = "0000";
            }
            tempValue = BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) / 10.0;
            //高低位转换后转为16位二进制字符串
            temp = BytesUtil.toBinary8StringSame(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)), 16);
            //符号位
            symbol = Integer.valueOf(temp.substring(0, 1));
            //获取温度值
            tempValue = BytesUtil.hexToInt(BytesUtil.binToHex(temp.substring(6))) * 0.0625;
            if(symbol == 1){
                tempValue = (1- BytesUtil.hexToInt(BytesUtil.binToHex(temp.substring(6))))*0.0625;
            }
            tempValue = NumberUtil.keepPrecision(tempValue, 1);
            // 说明解析的数据有问题
            if (tempValue == ERROR_CHECK_TAG || tempValue == ERROR_CHECK_TAG2) {
                tempValue = Constant.ERROR_TEMP;
@@ -646,7 +665,7 @@
        return msg.getSerId() + "_" + curPacket;
    }
    private String buildContextKey(ReMessage msg, String depotId) {
        return msg.getCompanyId() + "_" + msg.getSerId() + "_" + depotId;
    private String buildContextKey(String companyId, String serId) {
        return companyId + "_" + serId;
    }
}