Newer
Older
br-data-forwarding / src / main / java / com / casic / senitnel / service / SentinelFrameServiceImpl.java
package com.casic.senitnel.service;

import com.casic.common.CasicFrame;
import com.casic.common.CasicFrameBuildFactory;
import com.casic.common.CasicProtocol;
import com.casic.common.general.DataFrame;
import com.casic.common.general.EventFrame;
import com.casic.common.general.ReplyFrame;
import com.casic.dao.model.DataMonitorPipeOther;
import com.casic.dao.model.DeviceWellView;
import com.casic.dao.service.IDataSentinelOtherService;
import com.casic.dao.service.IDeviceWellViewService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;


@Service
@Slf4j
public class SentinelFrameServiceImpl implements ISentinelFrameService {

    @Resource
    private CasicProtocol protocol;

    @Resource
    IDataSentinelOtherService sentinelDataService;

    @Resource
    IDeviceWellViewService deviceService;

    public CasicFrame dataParse(String frame) {
        // 1. 判断帧结构
        boolean frameValid = protocol.checkFrame(frame);
        if (frameValid) {
            // 2. 获取帧结构中的关键字段信息
            String deviceId = protocol.getDeviceId(frame);
            String deviceType = protocol.getDeviceType(frame);
            String messageType = protocol.getMessageType(frame);
            String messageBody = protocol.getMessageBody(frame).toUpperCase();
            String uptime = protocol.getUptime(frame);
            String sequence = protocol.getMessageSequence(frame);

            String manufacturerCode = protocol.getManufacturerCode(frame);
            CasicFrame sentinelFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode, deviceType);

            if (sentinelFrame != null) {
                sentinelFrame.setDeviceCode(deviceId);
                sentinelFrame.setUptime(uptime);
                sentinelFrame.setMessageType(messageType);
                sentinelFrame.setSequence(sequence);

                // 心跳类的消息不解析MessageBody
                if (!sentinelFrame.getMessageType().equals("00")) {
                    sentinelFrame.setMessageBody(protocol.parseMessageBody(messageBody));
                    sentinelFrame.parseMessageBody();
                }

                log.info("收到设备消息:{}", sentinelFrame);
                return sentinelFrame;
            }
        } else {
            log.error("消息帧解析异常");
        }

        return null;
    }

    @Override
    public String replyMessage(String deviceCode, String sequence) {
        CasicFrame reply = new ReplyFrame();
        reply.setDeviceType("21"); // 设备类型为 燃气监测桩(防第三方破坏)
        reply.setDeviceCode(deviceCode);
        reply.setSequence(sequence);
        reply.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻

        return protocol.buildReplyFrameStr(reply);
    }

    @Override
    public String doBuildCommand(CasicFrame cmd) {
        return protocol.buildFrameStr(cmd);
    }

    @Override
    public void afterAction(CasicFrame frame) {
        // 数据消息帧 进行存库操作
        if (frame instanceof DataFrame) {
            String devCode = frame.getDeviceCode();
            DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(devCode);
            String wellCode = "";
            if (devWellView != null) {
                wellCode = devWellView.getWellCode();
            }
            List<Serializable> dataList = ((DataFrame) frame).toDataModelList();
            if (dataList != null) {
                for (Serializable item : dataList) {
                    DataMonitorPipeOther data = (DataMonitorPipeOther) item;
                    data.setWellCode(wellCode);
                    sentinelDataService.save(data);
                }
            }
        }
    }
}