Newer
Older
SensorHub / SensorHub.LampNB / Lamp.cs
root on 17 Sep 2021 14 KB first commit
using Newtonsoft.Json;
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.LampNBServer
{
    public class Lamp : 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 = "LampNB";

            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.kafkaSetResponseProduce(session, devCode, devName);
                return;
            }

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

            //具体业务处理
            int? pci = null;
            int? rsrp = null;
            int? snr = null;

            String softwareVersion = "";
            uint offset = 0;
            uint size = 0;

            String collectDate = "";
            List<String> startupList = new List<String>();

            List<int> states = new List<int>();
            List<float> electricities = new List<float>();
            List<float> voltages = new List<float>();

            List<float> activePoweres = new List<float>();
            List<float> reactivePoweres = new List<float>();
            List<float> apparentPoweres = new List<float>();

            List<float> activeEnergies = new List<float>();
            List<float> reactiveEnergies = new List<float>();
            List<float> apparentEnergies = new List<float>();

            List<DatasJson> lampDataList = new List<DatasJson>();
            List<State> loopStates = null;

            try
            {
                foreach (Tag tag in tags)
                {
                    if (!(tag is UploadTag))
                    {
                        //非业务处理
                        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;

                            if (voltages.Count > 0)
                            {
                                loopStates = new List<State>();
                                foreach (int s in sensorException0.states)
                                {
                                    State state = new State();
                                    state.state = s;
                                    loopStates.Add(state);
                                }
                            }
                            else
                            {
                                states = sensorException0.states;
                            }


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

                            continue;
                        }

                        if (tag != null && tag is PCITag)
                        {
                            PCITag pciTag = (PCITag)tag;
                            pci = pciTag.PCI;
                            continue;
                        }

                        if (tag != null && tag is RSRPTag)
                        {
                            RSRPTag rsrpTag = (RSRPTag)tag;
                            rsrp = rsrpTag.RSRP;
                            continue;
                        }

                        if (tag != null && tag is SNRTag)
                        {
                            SNRTag snrTag = (SNRTag)tag;
                            snr = snrTag.SNR;
                            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;
                        }

                        //非业务处理
                        if (tag != null && tag is SoftwareVersionTag)
                        {
                            SoftwareVersionTag versionTag = (SoftwareVersionTag)tag;
                            softwareVersion = versionTag.Version;
                            continue;
                        }

                        if (tag != null && tag is OffsetTag)
                        {
                            OffsetTag offsetTag = (OffsetTag)tag;
                            offset = offsetTag.Offset;
                            continue;
                        }

                        if (tag != null && tag is SizeTag)
                        {
                            SizeTag sizeTag = (SizeTag)tag;
                            size = sizeTag.Size;
                            continue;
                        }
                    }
                    else
                    {
                        //业务处理 
                        UploadTag uploadTag = tag as UploadTag;
                        switch (uploadTag.BizType)
                        {
                            case 14:
                                //电流
                                TagHandler eleHandler = new ElectricityTagHandler();
                                eleHandler.resolve(tag, session);

                                for (int i = 0; i < eleHandler.DataList.Count; i++)
                                {
                                    electricities.Add((float)eleHandler.DataList[i]);
                                }
                                break;
                            case 15:
                                //电压
                                TagHandler volHandler = new VoltageTagHandler();
                                volHandler.resolve(tag, session);

                                for (int i = 0; i < volHandler.DataList.Count; i++)
                                {
                                    voltages.Add((float)volHandler.DataList[i]);
                                }
                                break;
                            case 22:
                                //有功功率
                                TagHandler activePowerHandler = new ActivePowerTagHandler();
                                activePowerHandler.resolve(tag, session);

                                for (int i = 0; i < activePowerHandler.DataList.Count; i++)
                                {
                                    activePoweres.Add((float)activePowerHandler.DataList[i]);
                                }
                                break;
                            case 23:
                                //无功功率
                                TagHandler reactivePowerHandler = new ReactivePowerTagHandler();
                                reactivePowerHandler.resolve(tag, session);

                                for (int i = 0; i < reactivePowerHandler.DataList.Count; i++)
                                {
                                    reactivePoweres.Add((float)reactivePowerHandler.DataList[i]);
                                }
                                break;
                            //case 24:
                            //    //视在功率
                            //    TagHandler apparentPowerHandler = new ApparentPowerTagHandler();
                            //    apparentPowerHandler.resolve(tag, session);

                            //    for (int i = 0; i < apparentPowerHandler.DataList.Count; i++)
                            //    {
                            //        apparentPoweres.Add((float)apparentPowerHandler.DataList[i]);
                            //    }
                            //    break;
                            case 27:
                                //有功电能
                                TagHandler activeEnergyHandler = new ActiveEnergyTagHandler();
                                activeEnergyHandler.resolve(tag, session);

                                for (int i = 0; i < activeEnergyHandler.DataList.Count; i++)
                                {
                                    activeEnergies.Add((float)activeEnergyHandler.DataList[i]);
                                }
                                break;
                            case 28:
                                //无功电能
                                TagHandler reactiveEnergyHandler = new ReactiveEnergyTagHandler();
                                reactiveEnergyHandler.resolve(tag, session);

                                for (int i = 0; i < reactiveEnergyHandler.DataList.Count; i++)
                                {
                                    reactiveEnergies.Add((float)reactiveEnergyHandler.DataList[i]);
                                }
                                break;
                            //case 29:
                            //    //视在电能
                            //    TagHandler apparentEnergyHandler = new ApparentEnergyTagHandler();
                            //    apparentEnergyHandler.resolve(tag, session);

                            //    for (int i = 0; i < apparentEnergyHandler.DataList.Count; i++)
                            //    {
                            //        apparentEnergies.Add((float)apparentEnergyHandler.DataList[i]);
                            //    }
                            //    break;
                            default:
                                session.Logger.Info("未知业务类型!");
                                break;
                        }
                    }
                }


                if (voltages.Count > 0)
                {
                    for (int i = 0; i < voltages.Count; i++)
                    {
                        if (states.Count == 0)
                        {
                            lampDataList.Add(new LampData(0, electricities[i], voltages[i],
                                activePoweres[i], reactivePoweres[i], activeEnergies[i], reactiveEnergies[i]));
                        }
                        else
                        {
                            lampDataList.Add(new LampData(states[i], electricities[i], voltages[i],
                                activePoweres[i], reactivePoweres[i], activeEnergies[i], reactiveEnergies[i]));
                        }
                    }

                    if (electricities.Count == 4)
                    {
                        if (states.Count == 4)
                        {
                            lampDataList.Add(new LampData(states[3], electricities[3]));
                        }
                        else
                        {
                            lampDataList.Add(new LampData(0, electricities[3]));
                        }
                    }

                    //for (int i = 0; i < loopStates.Count; i++)
                    //{
                    //    lampDataList.Add(new LampData(loopStates[0]));
                    //}
                }
                else if (states.Count > 0)
                {
                    lampDataList.Add(new LampData(states[0]));
                }


                byte[] btPdu = new byte[2]; //2个字节
                btPdu[0] = Common.getRespOperType(operType, true);

                if (devCode.Substring(0, 2) == "72")//灯箱控制器
                {
                    btPdu[1] = 0x91;
                }
                else
                {
                    btPdu[1] = 0x90;
                }

                if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程
                {
                    Common.kafkaProduceVersinData(session, devName, devCode, softwareVersion);

                    if (devCode.Substring(0, 2) == "72")
                    {
                        devName = "LamphouseNB";
                    }
                    Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source);
                    return;
                }

                Common.senderNBConfig(session, devCode, btPdu, source);

                Common.kafkaProduce(session, devName, devCode, -1, pci, rsrp, snr, null, lampDataList, startupList, loopStates);
            }
            catch (Exception e)
            {
                session.Logger.Error(e.ToString());
            }
        }
    }
}