jiazx0107@163.com
2024-01-04 013c5f28422defd9b47abbe17a827be693872a26
调整优化正来电子粮情协议
已添加2个文件
已修改6个文件
443 ■■■■ 文件已修改
src/main/java/com/fzzy/protocol/ProtocolScheduled.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/protocol/data/THDto.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/protocol/zldz/analysis/AnalysisGrain.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/protocol/zldz/analysis/AnalysisTH.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/protocol/zldz/cmd/CommandBuilder1128.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/protocol/zldz/server/HeartbeatProviderImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/protocol/zldz/server/SessionListener.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/protocol/zldz/service/ZldzGatewayGrainService.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/protocol/ProtocolScheduled.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.fzzy.protocol;
import com.fzzy.api.data.GatewayDeviceProtocol;
import com.fzzy.gateway.GatewayUtils;
import com.fzzy.gateway.data.BaseReqData;
import com.fzzy.gateway.entity.GatewayDevice;
import com.fzzy.protocol.zldz.service.ZldzGatewayGrainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.Date;
/**
 * åè®®ç›¸å…³çš„定时器,全局定时器,包含所有的协议,逻辑处理是否执行
 */
@Slf4j
@Component(ProtocolScheduled.BEAN_ID)
public class ProtocolScheduled {
    public static final String BEAN_ID = "protocol.Scheduled";
    @Resource
    private ZldzGatewayGrainService zldzGatewayGrainService;
    /**
     * ä»Ž6-19点每小时执行一次
     * cron = "0 0 6-19 * * ? *"
     */
    @Scheduled(cron = "0 0 6-19 * * ? ")
    public void scheduled() {
        Date cur = new Date();
        log.info("--------------系统执行定时数据同步操作--------------");
        //正来电子协议-定时任务
        this.scheduledZldz(cur);
    }
    /**
     * æ­£æ¥ç”µå­å®šæ—¶ä»»åŠ¡
     *
     * @param cur
     */
    private void scheduledZldz(Date cur) {
        //获取设备列表
        Collection<GatewayDevice> list = GatewayUtils.allCacheDevice();
        try {
            BaseReqData reqData;
            for (GatewayDevice device : list) {
                if (null == device.getSyncProtocol()) continue;
                if (!GatewayDeviceProtocol.GRAIN_FZZY_ZLDZ_WEB.getCode().equals(device.getSyncProtocol())) {
                    continue;
                }
                reqData = new BaseReqData();
                reqData.setDeviceId(device.getDeviceId());
                reqData.setProductId(device.getProductId());
                reqData.setDeviceName(device.getDeviceName());
                reqData.setDevice(device);
                zldzGatewayGrainService.syncGrainTh(reqData);
                Thread.sleep(500);
            }
        } catch (Exception e) {
        }
    }
}
src/main/java/com/fzzy/protocol/data/THDto.java
@@ -8,32 +8,31 @@
/**
 * ä¸šåŠ¡æ•°æ®ï¼šç²®é£Ÿæ¸©åº¦æ¹¿åº¦ç»Ÿè®¡ä¿¡æ¯
 *
 * @author Andy
 *
 * @author Andy
 */
@Data
public class THDto implements Serializable {
    private static final long serialVersionUID = 1L;
    private String serId;//所属分机
    private static final long serialVersionUID = 1L;
    private String thAddr = "1";//所属通道
    private String serId;//所属分机
    @PropertyDef(label = "所属仓库", description = "仓库编号")
    private String depotId;
    private String thAddr = "1";//所属通道
    @PropertyDef(label = "仓内温度", description = "单位℃")
    private Double tempIn;
    @PropertyDef(label = "所属仓库", description = "仓库编号")
    private String depotId;
    @PropertyDef(label = "仓内湿度", description = "单位%RH")
    private Double humidityIn;
    @PropertyDef(label = "接收时间")
    private Date receiveDate = new Date();
    @PropertyDef(label = "仓内温度", description = "单位℃")
    private Double tempIn;
    private String remark;
    @PropertyDef(label = "仓内湿度", description = "单位%RH")
    private Double humidityIn;
    @PropertyDef(label = "接收时间")
    private Date receiveDate = new Date();
    private String remark;
}
src/main/java/com/fzzy/protocol/zldz/analysis/AnalysisGrain.java
@@ -1,11 +1,22 @@
package com.fzzy.protocol.zldz.analysis;
import com.alibaba.fastjson.JSONObject;
import com.fzzy.api.data.GatewayDeviceType;
import com.fzzy.api.utils.BytesUtil;
import com.fzzy.api.utils.ContextUtil;
import com.fzzy.api.utils.NumberUtil;
import com.fzzy.gateway.GatewayUtils;
import com.fzzy.gateway.api.GatewayDeviceReportService;
import com.fzzy.gateway.api.GatewayRemoteManager;
import com.fzzy.gateway.data.BaseReqData;
import com.fzzy.gateway.data.WeatherWebDto;
import com.fzzy.gateway.entity.GatewayDevice;
import com.fzzy.gateway.hx2023.ScConstant;
import com.fzzy.gateway.hx2023.data.*;
import com.fzzy.io.request.BaseRequest;
import com.fzzy.protocol.ProtocolUtils;
import com.fzzy.protocol.bhzn.v0.cmd.ReMessageBuilder;
import com.fzzy.protocol.data.THDto;
import com.fzzy.protocol.zldz.data.ReMessage;
import com.fzzy.protocol.zldz.service.ZldzGatewayGrainService;
import lombok.extern.slf4j.Slf4j;
@@ -33,6 +44,10 @@
    @Resource
    private ZldzGatewayGrainService zldzGatewayGrainService;
    @Resource
    private GatewayRemoteManager gatewayRemoteManager;
    public static Map<String, Map<String, String>> contextMap = new HashMap<>();
@@ -249,8 +264,6 @@
            // å¤‡ç”¨å€¼
            if (tempValue == ERROR_CHECK_TAG) {
                tempValue = ProtocolUtils.ERROR_TEMP;
                //验证是不是锥形仓补偿值
                curLay = (i % layMax) + 1;
                curRoot = (i / layMax) + 1;
@@ -298,9 +311,7 @@
     * @param packetMap
     * @param sumPackets
     */
    private void analysisStep1(ReMessage msg,
                               GatewayDevice device, BaseReqData reqData,
                               Map<String, String> packetMap, int sumPackets) {
    private void analysisStep1(ReMessage msg, GatewayDevice device, BaseReqData reqData, Map<String, String> packetMap, int sumPackets) {
        // èŽ·å–å®Œæ•´çš„ç²®æƒ…åŒ…ä¿¡æ¯
        String strPoints = "";
        for (int i = 1; i <= sumPackets; i++) {
@@ -343,7 +354,7 @@
        // å°†é›†åˆè§£æžæˆåæ ‡æ•°æ®
        addPoint1(temps, msg, device, reqData);
        addPoint1(temps, device, reqData, cableX, cableY, cableZ);
    }
    private String buildCurKey(ReMessage msg, int curPacket) {
@@ -360,11 +371,131 @@
     * @param temps
     * @throws Exception
     */
    private void addPoint1(List<Double> temps, ReMessage msg,
                           GatewayDevice device, BaseReqData reqData) {
        //TODO
    private void addPoint1(List<Double> temps, GatewayDevice device, BaseReqData reqData, int cableX, int cableY, int cableZ) {
        //数据封装
        GrainData grain = new GrainData();
        grain.setMessageId(ScConstant.getMessageId());
        grain.setDeviceId(device.getDeviceId());
        grain.setTimestamp(System.currentTimeMillis() + "");
        ClientHeaders headers = new ClientHeaders();
        headers.setDeviceName(device.getDeviceName());
        headers.setProductId(device.getProductId());
        headers.setOrgId(device.getOrgId());
        headers.setMsgId(reqData.getMessageId());
        grain.setHeaders(headers);
        GrainOutPut outPut = new GrainOutPut();
        double max = ReMessageBuilder.MAX_TEMP, min = ReMessageBuilder.MIN_TEMP, sumT = 0.0, sumNum = cableX * cableY * cableZ;
        List<GrainTemp> temperature = new ArrayList<>();
        //根号
        int cableNum = 1, position = 0;
        double curTemp;
        int x = 0, y = 0, z = 0;
        for (int i = 0; i < temps.size(); i++) {
            curTemp = temps.get(i);
            position = i;
            z = i % cableZ + 1;
            x = i / (cableZ * cableY);
            y = x * (cableZ * cableY);
            y = (i - y) / cableZ;
            //根号
            cableNum = (i / cableZ) + 1;
            temperature.add(new GrainTemp(cableNum + "", z + "", curTemp + "", position + ""));
            //求最大最小值
            if (curTemp < -900) {
                sumNum--;
            } else {
                sumT += curTemp;
                if (curTemp > max) {
                    max = curTemp;
                }
                if (curTemp < min) {
                    min = curTemp;
                }
            }
        }
        if (sumNum == 0) {
            sumNum = 1;
            log.warn("---当前粮情采集异常--");
        }
        //过滤比较用的最大最小值
        if (max == ReMessageBuilder.MAX_TEMP) {
            max = 0.0;
        }
        if (min == ReMessageBuilder.MIN_TEMP) {
            min = 0.0;
        }
        outPut.setTemperature(temperature);
        outPut.setAvgTemperature(NumberUtil.keepPrecision((sumT / sumNum), 1) + "");
        outPut.setMinTemperature(min + "");
        outPut.setMaxTemperature(min + "");
        List<GrainTH> ths = new ArrayList<>();
        THDto thDto = ProtocolUtils.getCacheTh(device.getDeviceId());
        if (null == thDto) thDto = new THDto();
        ths.add(new GrainTH(thDto.getTempIn() != null ? thDto.getTempIn() + "" : "", thDto.getHumidityIn() != null ? thDto.getHumidityIn() + "" : "", "1"));
        outPut.setTemperatureAndhumidity(ths);
        grain.setOutput(JSONObject.toJSONString(outPut));
        GatewayDevice gatewayDeviceWeather = GatewayUtils.getCacheByDeviceTypeOne(GatewayDeviceType.TYPE_09.getCode());
        //系统气象站信息
        WeatherWebDto weather = WeatherWebDto.contextMap.get("default");
        //气象信息
        GrainWeather weatherStation = new GrainWeather();
        weatherStation.setMessageId(ScConstant.getMessageId());
        weatherStation.setMessgeId(weatherStation.getMessageId());
        if (null != gatewayDeviceWeather) {
            weatherStation.setId(gatewayDeviceWeather.getDeviceId());
        } else {
            weatherStation.setId(device.getDeviceId());
        }
        weatherStation.setAirPressure(weather.getPressure());
        weatherStation.setHumidity(weather.getHumidity());
        weatherStation.setPm(weather.getAir_pm25());
        weatherStation.setRadiation("0");
        weatherStation.setRainfallAmount(weather.getWea());
        weatherStation.setTemperature(weather.getTem());
        weatherStation.setWindDirection(weather.getWin());
        weatherStation.setWindPower(weather.getWin_meter());
        weatherStation.setWindSpeed(weather.getWin_speed());
        grain.setWeatherStation(JSONObject.toJSONString(weatherStation));
        //封装好的数据
        log.info("---粮情机械封装完成----开始执行推送");
        reqData.setData(JSONObject.toJSONString(grain));
        doPushGrain(reqData);
    }
    private void doPushGrain(BaseReqData reqData) {
        GatewayDeviceReportService reportService = gatewayRemoteManager.getDeviceReportService(reqData.getDevice().getPushProtocol());
        if (null == reportService) {
            log.error("------------粮情推送失败,系统不存在当前协议执行类----{}", reqData.getDevice().getDeviceName());
            return;
        }
        reportService.reportGrainData(reqData);
    }
    /**
     * åœ†ç­’仓解析步骤
     *
src/main/java/com/fzzy/protocol/zldz/analysis/AnalysisTH.java
@@ -27,11 +27,11 @@
     * è§£æžä»“库温湿度信息,将信息放在缓存中,以便粮情使用
     *
     * @param msg
     * @param ser
     * @param device
     */
    public void analysis8828(ReMessage msg, GatewayDevice ser) {
    public void analysis8828(ReMessage msg, GatewayDevice device) {
        log.debug("-----------analysis8828------------{}.{}", ser.getIp(), ser.getPort());
        log.debug("-----------analysis8828------------{}.{}", device.getIp(), device.getPort());
        String content = msg.getBody().getContent();
@@ -55,8 +55,8 @@
            t = BytesUtil.hexToInt("FF" + temp);
        }
        if (t == ERROR_TH_TAG) {
            log.error("{}温湿度解析异常,原因:没有检测到传感器", ser.getDeviceName());
            th.setRemark(ser.getDeviceName() + "温湿度解析异常,原因:没有检测到传感器");
            log.error("{}温湿度解析异常,原因:没有检测到传感器", device.getDeviceName());
            th.setRemark(device.getDeviceName() + "温湿度解析异常,原因:没有检测到传感器");
        } else {
            th.setTempIn(Double.valueOf(t));
        }
@@ -70,17 +70,17 @@
            h = BytesUtil.hexToInt("FF" + temp);
        }
        if (h == ERROR_TH_TAG) {
            log.error("{}温湿度解析异常,原因:没有检测到传感器", ser.getDeviceName());
            th.setRemark(ser.getDeviceName() + "温湿度解析异常,原因:没有检测到传感器");
            log.error("{}温湿度解析异常,原因:没有检测到传感器", device.getDeviceName());
            th.setRemark(device.getDeviceName() + "温湿度解析异常,原因:没有检测到传感器");
        } else {
            th.setHumidityIn(Double.valueOf(h));
        }
        th.setSerId(ser.getId());
        th.setSerId(device.getDeviceId());
        th.setThAddr(thAddr + "");
        //存放缓存
        ProtocolUtils.addTh2Map(ser.getDeviceId(), th);
        ProtocolUtils.addTh2Map(device.getDeviceId(), th);
        log.info("仓温仓湿解析完成={}", th);
    }
src/main/java/com/fzzy/protocol/zldz/cmd/CommandBuilder1128.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.fzzy.protocol.zldz.cmd;
import com.fzzy.api.data.ApiCommonDevice;
import com.fzzy.api.utils.BytesUtil;
import com.fzzy.gateway.data.BaseReqData;
import com.fzzy.gateway.entity.GatewayDevice;
import com.fzzy.protocol.zldz.data.Message;
import com.fzzy.protocol.zldz.data.MessageBody;
import com.fzzy.protocol.zldz.server.ZldzServerUtil;
/**
 * ä»“温仓湿命令
 *
 * @author Andy
 */
public class CommandBuilder1128 extends CommandBuilder {
    private final static CommandBuilder1128 instance = new CommandBuilder1128();
    private CommandBuilder1128() {
    }
    public static CommandBuilder1128 getInstance() {
        return instance;
    }
    public Message buildMessage(BaseReqData reqData, ApiCommonDevice commonDevice) {
        Message message = new Message();
        message.setBegin(ZldzServerUtil.MSG_START);
        // è°ƒæ•´Message头部信息
        buildHeader(message, reqData, commonDevice);
        //包头校验
        buildCrc8(message);
        // åˆ›å»ºæ¶ˆæ¯ä½“
        buildBody(message, reqData);
        // æ·»åŠ æ ¡éªŒ
        buildCrc16(message);
        message.setEnd(ZldzServerUtil.MSG_END);
        // ç”Ÿæˆæ•´ä½“命令信息和BYte信息
        build(message);
        return message;
    }
    public void buildHeader(Message message, BaseReqData reqData, ApiCommonDevice commonDevice) {
        GatewayDevice device = reqData.getDevice();
        String hexCompanyId = BytesUtil.getTargetId(commonDevice.getOrgId(), true);
        hexCompanyId = BytesUtil.tran_LH(hexCompanyId);
        message.setSourceId(hexCompanyId);
        message.setSendId(hexCompanyId);
        message.setCompanyId(hexCompanyId);
        message.setTargetId(BytesUtil.tran_LH(BytesUtil.getTargetId(device.getDeviceSn(), true)));
        message.setMessageType(BytesUtil.tran_LH(ZldzServerUtil.MSG_TYPE_1128));
    }
    public void buildBody(Message message, BaseReqData reqData) {
        GatewayDevice device = reqData.getDevice();
        MessageBody body = new MessageBody();
        body.setLength(2);
        body.setContent(BytesUtil.tran_LH(BytesUtil.getTargetId(device.getThAddr(), true)));
        message.setBody(body);
    }
}
src/main/java/com/fzzy/protocol/zldz/server/HeartbeatProviderImpl.java
@@ -17,7 +17,7 @@
    @Override
    public byte[] provide(IoSession session) {
        log.debug("========系统开始执行心跳=========={}---{}", session.getCompanyId(), session.getBusinessKey());
        log.debug("========系统开始执行心跳=========-{}", session.getBusinessKey());
        return null;
    }
src/main/java/com/fzzy/protocol/zldz/server/SessionListener.java
@@ -35,21 +35,25 @@
        Constant.updateCacheOnline(session.getAddress(), session.getPort());
        /***********************设备上线后主动获取配置信息******************/
        try {
            /***********************设备上线后主动获取配置信息******************/
        BaseRequest request = new BaseRequest();
        request.setIp(session.getAddress());
        request.setPort(session.getPort());
        request.setCompanyId(ZldzServerUtil.DEFAULT_COMPANY);
        // Step1 ç”Ÿæˆåœ¨çº¿æµ‹è¯•命令
        Message message = OnLineCommandBuilder.getInstance().buildMessage(request);
        // å‘送命令
        InvokeResult result = session.invoke(message.getByteMsg());
        //如果命令发送失败,直接踢掉连接
        if (!InvokeResult.SUCCESS.getCode().equals(result.getCode())) {
            session.destroy();
            BaseRequest request = new BaseRequest();
            request.setIp(session.getAddress());
            request.setPort(session.getPort());
            request.setCompanyId(ZldzServerUtil.DEFAULT_COMPANY);
            // Step1 ç”Ÿæˆåœ¨çº¿æµ‹è¯•命令
            Message message = OnLineCommandBuilder.getInstance().buildMessage(request);
            // å‘送命令
            InvokeResult result = session.invoke(message.getByteMsg());
            //如果命令发送失败,直接踢掉连接
            if (!InvokeResult.SUCCESS.getCode().equals(result.getCode())) {
                session.destroy();
            }
            log.info("平台------->>分机---设备上线,自动发送设备配置信息请求命令--{}", message);
        } catch (Exception e) {
            log.error("平台------->>分机---设备上线,自动发送设备配置信息请求命令失败--{}", session.getAddress());
        }
        log.info("平台------->>分机---设备上线,自动发送设备配置信息请求命令--{}",message);
    }
    /**
@@ -69,8 +73,9 @@
        if (null == gatewayDeviceService) {
            gatewayDeviceService = SpringUtil.getBean(GatewayDeviceService.class);
        }
        gatewayDeviceService.OfflineByCommonDevice(commonDevice);
        //踢出连接
        session.destroy();
    }
}
src/main/java/com/fzzy/protocol/zldz/service/ZldzGatewayGrainService.java
@@ -92,8 +92,55 @@
    @Override
    public BaseResp syncGrainTh(BaseReqData reqData) {
        BaseResp resp = new BaseResp();
        GatewayDevice device = reqData.getDevice();
        //获取连接中的设备信息
        ApiCommonDevice apiCommonDevice = Constant.getCommonDeviceCache(device.getDeviceSn());
        if (null == apiCommonDevice) {
            resp.setCode(500);
            resp.setMsg("系统未获取到下行连接设备信息,无法执行");
            log.error("----------------系统未获取到下行连接设备信息,无法执行---------");
            return resp;
        }
        if (Constant.YN_N.equals(apiCommonDevice.getStatus())) {
            resp.setCode(500);
            resp.setMsg("下行设备不在线---无法执行----" + device.getDeviceName());
            log.error("下行设备不在线---无法执行----" + device.getDeviceName());
            return resp;
        }
        device.setIp(apiCommonDevice.getIp());
        device.setPort(apiCommonDevice.getPort());
        reqData.setDevice(device);
        try {
            //生成温度命令
            Message message = CommandBuilder1128.getInstance().getInstance().buildMessage(reqData, apiCommonDevice);
            log.error("平台------>>>>控制柜:发送温湿度检测命令-{}", message);
            // å‘送命令
            InvokeResult result = ZldzServerEngine.push(apiCommonDevice.getIp(), apiCommonDevice.getPort(), message.getByteMsg());
            // å°è£…返回信息
            if (!InvokeResult.SUCCESS.getCode().equals(result.getCode())) {
                log.error("平台------>>>>控制柜:发送温湿度检测命令-失败{}", result.getMessage());
                resp.setCode(500);
                resp.setMsg("平台------>>>>控制柜:发送温湿度检测命令-失败:" + result.getMessage());
            }
        } catch (Exception e) {
            log.error("温湿度检测异常:{}", e);
            resp.setCode(500);
            resp.setMsg("平台------>>>>控制柜:发送温湿度检测命令:" + e.getMessage());
            return resp;
        }
        return resp;
    }