Newer
Older
SensorHub / SensorHub.Lamphouse / Lamphouse.cs
root on 17 Sep 2021 9 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.Lamphouse
{
    public class Lamphouse : 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];

            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, "Lamphouse");
                return;
            }

            if (operType == "TrapResponse" || operType == "SetRequest" || operType == "GetRequest")
            {
                session.Logger.Info("绝壁是硬件发的!");
                return;
            }
 
            List<Tag> tags = Common.getTags(settings, session);

            //具体业务处理
            String collectDate = "";
            List<String> eventList = new List<String>();
            List<DatasJson> datasList = new List<DatasJson>();
            String uptime = null;//数据采集时间

            float electricity = -1.0f;
            float voltage = -1.0f;

            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;
                            int state = sensorException0.state;

                            if (state == 0) continue;

                            eventList.Add(getLamphouseAlarm(state));

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

                    }
                    else
                    {
                        //业务处理 
                        UploadTag uploadTag = tag as UploadTag;
                        switch (uploadTag.BizType)
                        {
                            case 14:
                                //电流
                                TagHandler eleHandler = new ElectricityTagHandler();
                                eleHandler.resolve(tag, session);

                                if (eleHandler.DataList.Count > 0)
                                {
                                    DateTime upTime = Convert.ToDateTime(collectDate + " " + eleHandler.CollecTime);
                                    uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd")
                                        + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss");

                                    electricity = (float)eleHandler.DataList[0];
                                }

                                break;
                            case 15:
                                //电压
                                TagHandler volHandler = new VoltageTagHandler();
                                volHandler.resolve(tag, session);

                                if (volHandler.DataList.Count > 0)
                                {
                                    voltage = (float)volHandler.DataList[0];
                                }

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

                if (uptime != null)
                {
                    datasList.Add(new LamphouseDatasJson(uptime, electricity, voltage));
                }

                sendMessage(session, "Lamphouse", devCode, -1, eventList, datasList, null);

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

                Common.sender433Config(session, devCode, btPdu, 0x05);
            }
            catch (Exception e)
            {
                session.Logger.Error(e.ToString());
            }
        }

        private void sendMessage(CasicSession session, String devName, String devCode, int cell, List<String> eventList, List<DatasJson> datasList, List<String> startupList)
        {
            DateTime now = DateTime.Now;
            String logtime = now.ToString("yyyy") + now.ToString("MM") + now.ToString("dd")
                            + now.ToString("HH") + now.ToString("mm") + now.ToString("ss");

            DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); //当地时区
            long timeStamp = (long)(now - startTime).TotalMilliseconds; //相差毫秒数

            try
            {
                if (eventList != null && eventList.Count > 0)
                {
                    String message = JsonConvert.SerializeObject(new Json("Event", devName, devCode,
                            new LamphouseEventJson(devName + "Event", eventList, datasList, logtime), timeStamp));

                    //Client client = new Client();
                    //if (client.InitClient())
                    //{
                    //    session.Logger.Info("往第三方发送数据:" + message);
                    //    client.SendMessage(message);
                    //}
                    //else
                    //{
                    //    session.Logger.Info("Client初始化失败,未连接上第三方服务器");
                    //}

                    if (Common.SendMessage(message))
                    {
                        session.Logger.Info("往第三方发送数据:" + message);
                    }
                    else
                    {
                        session.Logger.Info("未连接上第三方服务器");
                    }

                    return;
                }


                if (datasList != null && datasList.Count > 0)
                {
                    String message = JsonConvert.SerializeObject(new Json("Data", devName, devCode,
                          new DataJson(devName + "Data", cell, datasList, logtime), timeStamp));

                    //Client client = new Client();
                    //if (client.InitClient())
                    //{
                    //    session.Logger.Info("往第三方发送数据:" + message);
                    //    client.SendMessage(message);
                    //}
                    //else
                    //{
                    //    session.Logger.Info("Client初始化失败,未连接上第三方服务器");
                    //}

                    if (Common.SendMessage(message))
                    {
                        session.Logger.Info("往第三方发送数据:" + message);
                    }
                    else
                    {
                        session.Logger.Info("未连接上第三方服务器");
                    }
                }

            }
            catch (Exception ex)
            {
                session.Logger.Error("往第三方发送数据出错:" + ex.Message);
            }
        }

        private String getLamphouseAlarm(int state)
        {
            switch (state)
            {
                case 0:
                    return "LamphouseNormal";//正常
                case 1:
                    return "LamphouseTurnOnFail"; //闭合异常
                case 2:
                    return "LamphouseTurnOffFail"; //断开异常
                case 3:
                    return "LamphouseLowElectricityAlarm"; //电流低于阈值告警
                default:
                    return "LamphouseUnknown"; //未知异常
            }
        }
    }
}