Newer
Older
SensorHub / SensorHub.CorrEnv / CorrEnv.cs
root on 17 Sep 2021 10 KB first commit
using SensorHub.Servers;
using SensorHub.Servers.Commands.CASICCommands;
using SensorHub.Servers.JsonFormat;
using SuperSocket.SocketBase.Command;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SensorHub.CorrEnv
{
    public class CorrEnv : CommandBase<CasicSession, StringRequestInfo>
    {
        public override void ExecuteCommand(CasicSession session, StringRequestInfo requestInfo)
        {
            //TODO: construct the receving casic data
            String preamble = requestInfo.Parameters[0];
            String version = requestInfo.Parameters[1];
            String leng = requestInfo.Parameters[2];
            String devCode = requestInfo.Parameters[3];
            String routeFlag = requestInfo.Parameters[4];
            String dstNodeAddr = requestInfo.Parameters[5];
            String pduType = requestInfo.Parameters[6];
            String seq = requestInfo.Parameters[7];
            String settings = requestInfo.Parameters[8];
            String source = requestInfo.Parameters[9];

            String devName = "CorrEnv";

            if (source.Contains("-"))
            {
                session.Send("HTTP/1.1 200 OK\r\n\r\n\r\n");
                session.Close();
            }

            //print the receving data
            String devType = "保温层下腐蚀环境监测仪";
            String operType = Common.getOpeTypeByPdu(pduType);
            session.Logger.Info("AD接收数据:" + requestInfo.Body);
            session.Logger.Info("设备类型:" + devType);
            session.Logger.Info("操作类型:" + operType);
            session.Logger.Info("会话:" + session.HubAddr + "," + session.SessionID);

            //判断是返回的设置确认数据帧, 回复第三方
            if (operType == "SetResponse")
            {
                Common.sendSetResponse(session, devCode, devName);
                return;
            }

            List<Tag> tags = Common.getTags(settings, session);

            //具体业务处理
            String collectDate = "";
            int cell = 0;
            List<String> eventList = new List<String>();
            List<DatasJson> datasList = new List<DatasJson>();
            List<String> startupList = new List<String>();
            

            foreach (Tag tag in tags)
            {
                if (!(tag is UploadTag))
                {
                    if (tag != null && tag is CellTag)
                    {
                        CellTag cellTag = tag as CellTag;
                        cell = cellTag.Cell;
                        continue;
                    }

                    //非业务处理
                    if (tag != null && tag is SystemDateTag)
                    {
                        SystemDateTag systemDateTag = tag as SystemDateTag;
                        collectDate = systemDateTag.CollectDate;
                        continue;
                    }

                    if (tag != null && tag is SensorException0Tag)
                    {
                        SensorException0Tag sensorException0 = tag as SensorException0Tag;
                        int state = sensorException0.state;

                        if (state == 0) continue;

                        eventList = getEnvListByState(state, 0);

                        session.Logger.Info("通道一发送容错信息:oid:" + tag.Oid + ";value:" + state);
                        continue;
                    }

                    if (tag != null && tag is SensorException1Tag)
                    {
                        SensorException1Tag sensorException1 = tag as SensorException1Tag;
                        int state = sensorException1.state;

                        if (state == 0) continue;

                        byte byteState = Convert.ToByte(state);

                        if ((byteState & 0x01) == 0x01)
                        {
                            eventList.Add(getCorrEnvAlarm(9));
                        }

                        if ((byteState & 0x40) == 0x40)
                        {
                            eventList.Add(getCorrEnvAlarm(10));
                        }

                        if ((byteState & 0x80) == 0x80)
                        {
                            eventList.Add(getCorrEnvAlarm(11));
                        }

                        session.Logger.Info("通道二发送容错信息:oid:" + tag.Oid + ";value:" + state);
                        continue;
                    }

                    if (tag != null && tag is SensorStartupTag)
                    {
                        SensorStartupTag sensorStartup = tag as SensorStartupTag;
                        String imei = sensorStartup.IMEI;
                        String iccid = sensorStartup.ICCID;

                        startupList.Add(imei);
                        startupList.Add(iccid);

                        session.Logger.Info("设备开机上报,设备编号DEVCODE:" + devCode + " IMEI:" + imei + " ICCID:" + iccid);
                        continue;
                    }
                }
                else
                {
                    //业务处理 
                    UploadTag uploadTag = tag as UploadTag;
                    switch (uploadTag.BizType)
                    {
                        case 12:
                            //温度、电压、布尔类型
                            TagHandler envHandler = new CorrEnvTagHandler();
                            envHandler.resolve(tag, session);

                            DateTime baseTime = Convert.ToDateTime(collectDate + " " + envHandler.CollecTime);

                            for (int i = 0; i < envHandler.DataList.Count / 11; i++)
                            {
                                DateTime upTime = baseTime.AddMinutes(i * envHandler.Interval);
                                String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd")
                                    + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss");


                                List<bool> inundate = new List<bool>();
                                inundate.Add((bool)envHandler.DataList[i + 5]);
                                inundate.Add((bool)envHandler.DataList[i + 6]);
                                inundate.Add((bool)envHandler.DataList[i + 7]);
                                inundate.Add((bool)envHandler.DataList[i + 8]);
                                inundate.Add((bool)envHandler.DataList[i + 9]);
                                inundate.Add((bool)envHandler.DataList[i + 10]);

                                datasList.Add(new CorrEnvDatasJson(
                                    uptime,
                                    (float)envHandler.DataList[i],
                                    (float)envHandler.DataList[i + 1],
                                    (float)envHandler.DataList[i + 2],
                                    (float)envHandler.DataList[i + 3],
                                    (float)envHandler.DataList[i + 4],
                                    inundate));
                            }

                            break;
                        default:
                            session.Logger.Info("未知业务类型!");
                            break;
                    }
                }
            }

            Common.sendMessage(session, devName, devCode, cell, eventList, datasList, startupList);

            byte[] btPdu = new byte[2]; //2个字节
            btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false);
            btPdu[1] = 0x8C;

            Common.sendConfig(session, devCode, routeFlag, source, btPdu);
        }

        private List<String> getEnvListByState(int state, int enumState)
        {
            List<String> envList = new List<String>();

            byte byteState = Convert.ToByte(state);

            for (int i = 0; i < 8; i++)
            {
                int flag = (byteState >> i) & 0x01;
                if (flag == 0)
                {
                    continue;
                }

                envList.Add(getCorrEnvAlarm(flag + i));
            }

            //envList.Add(getCorrEnvAlarm((byteState >> 4) & 0x01 + 4));
            //envList.Add(getCorrEnvAlarm((byteState >> 5) & 0x01 + 5));
            //envList.Add(getCorrEnvAlarm((byteState >> 6) & 0x01 + 6));
            //envList.Add(getCorrEnvAlarm((byteState >> 7) & 0x01 + 7));
            //envList.Add(getCorrEnvAlarm((byteState >> 0) & 0x01 + 0));
            //envList.Add(getCorrEnvAlarm((byteState >> 1) & 0x01 + 1));
            //envList.Add(getCorrEnvAlarm((byteState >> 2) & 0x01 + 2));
            //envList.Add(getCorrEnvAlarm((byteState >> 3) & 0x01 + 3));

            return envList;
        }

        private String getCorrEnvAlarm(int state)
        {
            switch (state)
            {
                case 0:
                    return "CorrEnvNormal";//腐蚀环境正常
                case 1:
                    return "CorrEnvTemp1Overrun"; //1路温度超限报警
                case 2:
                    return "CorrEnvTemp2Overrun"; //2路温度超限报警
                case 3:
                    return "CorrEnvTemp3Overrun"; //3路温度超限报警
                case 4:
                    return "CorrEnvTemp4Overrun"; //4路温度超限报警
                case 5:
                    return "CorrEnvTemp1Fail"; //1路温度采集失败
                case 6:
                    return "CorrEnvTemp2Fail"; //2路温度采集失败
                case 7:
                    return "CorrEnvTemp3Fail"; //3路温度采集失败
                case 8:
                    return "CorrEnvTemp4Fail"; //4路温度采集失败
                case 9:
                    return "CorrEnvPotentialOverrun"; //电位数据超限报警
                case 10:
                    return "CorrEnvADC1Fail"; //ADC1通信失败
                case 11:
                    return "CorrEnvADC2Fail"; //ADC2通信失败
                case 12:
                    return "CorrEnvError"; //腐蚀环境监测仪设备异常报警
                default:
                    return "CorrEnvUnknown"; //腐蚀环境未知异常
            }
        }

    }
}