Newer
Older
SensorHub / SensorHub.Servers / Commands / CASICCommands / CasicCmd.cs
root on 17 Sep 2021 26 KB first commit
//using System;
//using System.Collections.Generic;
//using SuperSocket.SocketBase.Command;
//using SuperSocket.SocketBase.Protocol;
//using SensorHub.Utility;
//using System.Collections;
//using System.Text;
//using System.Runtime.Caching;

//namespace SensorHub.Servers.Commands.CASICCommands
//{
//    [CasicCommandFilter]//往数据库写连接设备操作日志
//    public class CasicCmd : CommandBase<CasicSession, StringRequestInfo>
//    {
//        public override string Name
//        {
//            get
//            {
//                return "Casic";
//            }
//        }

//        public String getDeviceTypeByPdu(String pduType)
//        {
//            Int16 btpduType = Int16.Parse(pduType, System.Globalization.NumberStyles.HexNumber);
//            int deviceType = btpduType & 0x7F;
//            String devType = "";
//            switch (deviceType)
//            {
//                case 0:
//                    devType = "未知设备";
//                    break;
//                case 1:
//                    devType = "多功能漏损监测仪";
//                    break;
//                case 2:
//                    devType = "噪声记录仪";
//                    break;
//                case 3:
//                    devType = "排水监控一体机";
//                    break;
//                case 4:
//                    devType = "燃气智能监测终端";
//                    break;
//                case 5:
//                    devType = "集中器";
//                    break;
//                case 6:
//                    devType = "井盖传感器";
//                    break;
//                case 7:
//                    devType = "液位监测仪";
//                    break;
//                case 8:
//                    devType = "温度压力监测仪";
//                    break;
//                case 10:
//                    devType = "远传水表";
//                    break;
//                case 11:
//                    devType = "保温层下腐蚀速率监测仪";
//                    break;
//                case 12:
//                    devType = "保温层下腐蚀环境监测仪";
//                    break;
//                case 15:
//                    devType = "消防栓防盗水装置";
//                    break;
//                case 16:
//                    devType = "单灯控制器";
//                    break;
//                case 17:
//                    devType = "灯箱控制器";
//                    break;
//                case 20:
//                    devType = "温湿度监测仪";
//                    break;
//                default:
//                    devType = "undefiend";
//                    break;
//            }
//            return devType;
//        }

//        public String getOpeTypeByPdu(String pduType)
//        {
//            Int16 btpduType = Int16.Parse(pduType, System.Globalization.NumberStyles.HexNumber);

//            int opearType = (btpduType >> 8) & 0xFF;
//            String result="";
//            switch (opearType) 
//            {
//                case 1:
//                    result =  "GetRequest";
//                    break;
//                case 2:
//                    result = "GetResponse";
//                    break;
//                case 3:
//                    result = "SetRequest";
//                    break;
//                case 4:
//                    result = "TrapRequest";
//                    break;
//                case 5:
//                    result = "TrapResponse";
//                    break;
//                case 6:
//                    result = "OnlineRequest";
//                    break;
//                case 7:
//                    result = "OnlineResponse";
//                    break;
//                case 8:
//                    result = "StartupRequest";
//                    break;
//                case 9:
//                    result = "StartupResponse";
//                    break;
//                case 10:
//                    result = "WakeupRequest";
//                    break;
//                case 11:
//                    result = "WakeupResponse";
//                    break;
//                case 13:
//                    result = "ClientRequest";
//                    break;
//                case 12:
//                    result = "SetResponse";
//                    break;
//                default:
//                    result = "undefined";
//                    break;
//            }
//            return result;
//        }

//        public String getSensorCodeByRequestInfo(String settings, String devType)
//        {
//            if (devType == "多功能漏损监测仪")
//            {
//                if (settings.Contains("10000104"))
//                    return "000031";//流量
//                else if (settings.Contains("10000110"))
//                    return "000033";//压力
//                else if (settings.Contains("10000120"))
//                    return "000032";//噪声
//                else 
//                    return "";
//            }
//            else
//                return "";
//        }

//        private bool isfinishe(String pduType)
//        {
//            Int16 btpduType = Int16.Parse(pduType, System.Globalization.NumberStyles.HexNumber);
//            int flag = btpduType & 0x80;
//            return flag == 128 ? true : false; 
//        }

//        private List<Tag> getTags(String strTags,CasicSession session)
//        {
//            List<Tag> tags = new List<Tag>();
//            try
//            {
//                int i = 0;
//                while (i < strTags.Length)
//                {
//                    //get each tag from strTag and construct tag list; 
//                    String oid = strTags.Substring(i, 8);

//                    int len = Int16.Parse(strTags.Substring(i + 8, 4), System.Globalization.NumberStyles.HexNumber);
//                    String value = strTags.Substring(i + 12, len * 2);
//                    i = i + 12 + 2 * len;
//                    //TODO LIST:Construct a tag according to oid
//                    Tag tag = TagFactory.create(oid, len, value);
//                    tags.Add(tag);
//                }
//            }
//            catch (Exception e)
//            {
//                session.Logger.Error("集中器挂载设备上传协议出错:" + e.Message);
//            }
//            return tags;
//        }

//        private CellTag getCellTag(List<Tag> tags)
//        {
//            foreach (Tag tag in tags)
//            {
//                if (tag!=null && tag is CellTag)
//                {
//                    return (CellTag)tag;
//                }
//            }
//            return null;
//        }

//        private SystemDateTag getSystemDateTag(List<Tag> tags)
//        {
//            foreach (Tag tag in tags)
//            {
//                if (tag != null && tag is SystemDateTag)
//                {
//                    return (SystemDateTag)tag;
//                }
//            }
//            return null;
//        }

//        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 deviceId = 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 telecomDeviceId = requestInfo.Parameters[9];//电信平台设备编号

//            if (routeFlag == "06")
//            {
//                session.Send("HTTP/1.1 200 OK\r\n\r\n\r\n");
//                session.Close();
//            }

//            //print the receving data
//            String devType = getDeviceTypeByPdu(pduType);
//            String operType = getOpeTypeByPdu(pduType);
//            session.Logger.Info("AD接收数据:" + requestInfo.Body);
//            session.Logger.Info("当前版本:" + version);
//            session.Logger.Info("设备编号:" + deviceId);
//            session.Logger.Info("路由标志:" + routeFlag);
//            session.Logger.Info("目标节点地址:" + dstNodeAddr);
//            session.Logger.Info("设备类型:" + devType);
//            session.Logger.Info("操作类型:" + operType);
//            session.Logger.Info("序列seq:" + seq);

//            if (devType == "集中器")
//            {
//                if (session.HubAddr == null)
//                {
//                    foreach (CasicSession s in session.AppServer.GetAllSessions())
//                    {
//                        if (deviceId == s.HubAddr && s.Connected)
//                        {
//                            session.HubAddr = deviceId;
//                            s.Close();
//                            goto Label;
//                        }
//                    }

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

//                    String message = "{\"messagetype\":\"ConcentratorData\",\"devcode\":\""
//                     + deviceId + "\",\"status\":\"online\",\"eventtime\":\""
//                     + timeStamp + "\"}";

//                    Client client = new Client(session);
//                    //client.SetMessageCache(timeStamp.ToString(), message);//缓存发送的消息
//                    client.SendMessage(message);
//                }
//            }
//            else
//            {
//                session.HubAddr = deviceId;
//            }

//        Label:
//            //判断是返回的设置确认数据帧,更新DeviceConfig表
//            //判断是返回的设置确认数据帧, 回复第三方
//            if (operType == "SetResponse")
//            {
//                DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); //当地时区
//                long timeStamp = (long)(DateTime.Now - startTime).TotalMilliseconds; //相差毫秒数

//                String message = "{\"messagetype\":\"LiquidConfigAck\",\"devcode\":\""
//                 + deviceId + "\",\"eventtime\":\""
//                 + timeStamp + "\"}";

//                Client client = new Client(session);
//                //client.SetMessageCache(timeStamp.ToString(), message);//缓存发送的消息
//                client.SendMessage(message);
//                return;
//            }

//            //TODO LIST:更新会话中session信息
//            this.updateSessionInfo(session, requestInfo);

//            //upload periodically or config query according to oid
//            //获取电量信息,系统时间,传递给对应的handler
//            List<Tag> tags = this.getTags(settings, session);
//            CellTag cellTag = this.getCellTag(tags);
//            SystemDateTag systemDateTag = this.getSystemDateTag(tags);

//            try
//            {
//                //TODO LIST:处理主动上报的数据、参数查询参数设置
//                TagHandler systemDateHandler = new SystemDateTagHandler();
//                //TagHandler liquidHandler = new LiquidTagHandler();
//                //TagHandler wellHandler = new WellTagHandler();//井盖、消防栓
//                TagHandler sysTimeHandler = new SystemTimeTagHandler();
//                TagHandler wakeupHandler = new WakeUpTagHandler();
//                TagHandler cellTagHandler = new CellTagHandler();
//                //TagHandler waterMeterHadler = new WaterMeterTagHandler();
//                TagHandler tempHandler = new TempTagHandler();
//                //TagHandler humidityHandler = new HumidityTagHandler();
//                //TagHandler pressHandler = new PressTagHandler();
//                //TagHandler fsslHandler = new FSSLTagHandler();
//                TagHandler fshjHandler = new FSHJTagHandler();
//                TagHandler rqHandler = new RQTagHandler();
//                TagHandler djNoiseHandler = new DjNoiseTagHandler();
//                TagHandler djPressHandler = new DjPressTagHandler();
//                TagHandler djFlowHandler = new DjFlowTagHandler();
//                TagHandler elecHandler = new ElectricityTagHandler();//路灯电流
//                TagHandler volHandler = new VoltageTagHandler();//路灯电压
//                TagHandler sensorException0TagHandler = new SensorException0TagHandler();
//                TagHandler sensorException1TagHandler = new SensorException1TagHandler();
//                TagHandler sensorException2TagHandler = new SensorException2TagHandler();
//                TagHandler sensorStartupTagHandler = new SensorStartupTagHandler();

//                systemDateHandler.NextHandler = liquidHandler;
//                liquidHandler.NextHandler = waterMeterHadler;
//                waterMeterHadler.NextHandler = wellHandler;
//                wellHandler.NextHandler = tempHandler;
//                tempHandler.NextHandler = humidityHandler;
//                humidityHandler.NextHandler = pressHandler;
//                pressHandler.NextHandler = rqHandler;
//                rqHandler.NextHandler = sysTimeHandler;
//                sysTimeHandler.NextHandler = wakeupHandler;
//                wakeupHandler.NextHandler = cellTagHandler;
//                cellTagHandler.NextHandler = fsslHandler;
//                fsslHandler.NextHandler = fshjHandler;
//                fshjHandler.NextHandler = djNoiseHandler;
//                djNoiseHandler.NextHandler = djPressHandler;
//                djPressHandler.NextHandler = djFlowHandler;
//                djFlowHandler.NextHandler = elecHandler;
//                elecHandler.NextHandler = volHandler;
//                volHandler.NextHandler = sensorException0TagHandler;
//                sensorException0TagHandler.NextHandler = sensorException1TagHandler;
//                sensorException1TagHandler.NextHandler = sensorException2TagHandler;
//                sensorException2TagHandler.NextHandler = sensorStartupTagHandler;

//                foreach (Tag tag in tags)
//                {
//                    //采用责任链的方式来处理各个tag:
//                    //目前已经处理噪声、液位、系统时间、系统日期tag
//                    systemDateHandler.handleTag(tag, deviceId, cellTag,
//                        systemDateTag, session);
//                }

//                if (routeFlag == "03" || routeFlag == "06") //GPRS,3G网络,电信平台
//                {
//                    senderGPRSConfig(operType, version, deviceId, pduType, seq, routeFlag, dstNodeAddr, devType, session, telecomDeviceId);
//                }
//                else //433
//                {
//                    sender433Config(operType, version, deviceId, pduType, seq, routeFlag, dstNodeAddr, devType, session);
//                }
//            }
//            catch (Exception e)
//            {
//                session.Logger.Error(e.ToString());
//            }
//        }

//        public void sender433Config(string operType, string version, string deviceId, string pduType, string seq,
//            string routeFlag, string dstNodeAddr, string devType,CasicSession session)
//        {
//            //下发返回的信息
//            if ((operType != "GetResponse") &&
//                isfinishe(pduType) &&
//                (operType == "TrapRequest" || operType == "OnlineRequest") && devType != "井盖传感器")
//            {
//                HeadConfig headConfig = new HeadConfig(version, deviceId, pduType, seq, routeFlag, dstNodeAddr);
//                TrapRespConfig trapResp = new TrapRespConfig(headConfig);
//                SystemTimeConfig sysTimeConfig = new SystemTimeConfig(trapResp);

//                if (session.devMaps.ContainsKey(deviceId))
//                {
//                    CasicSession.DeviceDTO dto = session.devMaps[deviceId];
//                    trapResp.NoSeq = dto.Seq;
//                }

//                byte[] btConfig = sysTimeConfig.getConfig(new byte[0]);

//                //全部加分包返回帧

//                session.Logger.Info(devType + ":" + deviceId + " CRC校验前数据:" + BitConverter.ToString(btConfig));
//                String strCrc = StringUtil.To16HexString((String.Format("{0:X}", (int)CodeUtils.CRC16_AD(btConfig))));
//                session.Logger.Info(devType + ":" + deviceId + " 生成的CRC校验:" + strCrc);
//                byte[] btcrc =
//                        {
//                            CodeUtils.String2Byte(strCrc.Substring(0, 2)),
//                            CodeUtils.String2Byte(strCrc.Substring(2, 2))
//                        };
//                byte[] afcrc = new byte[btConfig.Length + 2];
//                btConfig.CopyTo(afcrc, 0);
//                btcrc.CopyTo(afcrc, btConfig.Length);

//                session.Logger.Info(devType + ":" + deviceId + " CRC校验后数据:" + BitConverter.ToString(afcrc));
//                session.Send(afcrc, 0, afcrc.Length);

//                CasicSession.DeviceDTO dto0 = session.devMaps[deviceId];
//                dto0.Seq = 0x00;
//                session.devMaps[deviceId] = dto0;
//            }
//        }
        
//        private void updateSessionInfo(CasicSession session, StringRequestInfo requestInfo)
//        {
//            String deviceId = requestInfo.Parameters[3];
//            String pduType = requestInfo.Parameters[6];
//            String devType = getDeviceTypeByPdu(pduType);
//            String seq = requestInfo.Parameters[7];
//            String sessionKey = deviceId;
//            byte btSeq = byte.Parse(seq, System.Globalization.NumberStyles.HexNumber);

//            if (!session.devMaps.ContainsKey(sessionKey))
//            {
//                CasicSession.DeviceDTO dev = new CasicSession.DeviceDTO();
//                dev.DevCode = deviceId;
//                dev.DevType = devType;
//                dev.Detail = requestInfo.Body;
//                dev.Company = "203";
//                dev.Status = "在线";
//                dev.IsWakeUp = false;
//                dev.Seq = (UInt16) (0x01 << (btSeq - 1));
//                session.devMaps.Add(sessionKey, dev);
//            }
//            else
//            {
//                //更新序列状态
//                CasicSession.DeviceDTO dto = session.devMaps[sessionKey];
                
//                /*if (btSeq == 1)
//                    dto.Seq = 0x00;
//                 * */
//                dto.Seq = (UInt16)(dto.Seq | 0x01 << (btSeq - 1));//by yan:0x01接收到,左移btSeq-1位,或dto.Seq
                
//                session.devMaps[sessionKey] = dto;
//            }
//        }

//        //private void senderGPRSConfig(string devType, string deviceId, string version, CasicSession session)
//        private void senderGPRSConfig(string operType, string version, string deviceId, string pduType, string seq,
//            string routeFlag, string dstNodeAddr, string devType,CasicSession session,string telecomDeviceId)
//        {
//            Dictionary<String, String> setMap = null;
//            //Model.DeviceConfigInfo config = null;
//            String sensorType = "";
//            CasicSender sender = new CasicSender(null);

//            if (devType == "燃气智能监测终端")
//            {
//                //重传次数、采集间隔、上传周期
//                string[] settingsName = new string[] { "rq_rept", "rq_itr", "rq_period","ip","port" };
//                setMap = getSettings(deviceId, "000044", settingsName);
//            }
//            else if (devType == "液位监测仪")
//            {
//                //报警阈值、重传次数、高度
//                string[] settingsName = new string[] { "yw_thresh", "yw_rept", "yw_height", "ip", "port" };
//                setMap = getSettings(deviceId, "000034", settingsName);
//            }
//            else if (devType == "温度压力监测仪")
//            {
//                //采集间隔、重传次数、采集次数、采集开始时间
//                string[] settingsName = new string[] { "tmp_itr", "tmp_rept", "tmp_cnt", "tmp_stime", "ip", "port" };
//                setMap = getSettings(deviceId, "000050", settingsName);      
//            }
//            else if (devType == "噪声记录仪")
//            {
//                //采集开始时间、采集间隔、采集次数、重试次数
//                string[] settingsName = new string[] { "sl_stime", "sl_itrl", "sl_cnt", "sl_rept", "ip", "port" };
//                setMap = getSettings(deviceId, "000032", settingsName);             
//            }
//            else if (devType == "保温层下腐蚀环境监测仪")
//            {
//                string[] settingsName = new string[] { "fshj_stime", "fshj_itrl", "fshj_rept", "fshj_cnt", "ip", "port" };
//                setMap = getSettings(deviceId, "000041", settingsName);  
//            }
//            else if (devType == "保温层下腐蚀速率监测仪")
//            {
//                string[] settingsName = new string[] { "fssl_stime", "fssl_itrl", "fssl_rept", "fssl_cnt", "ip", "port" };
//                setMap = getSettings(deviceId, "000040", settingsName);  
//            }
//            else if (devType == "消防栓防盗水装置")
//            {
//                string[] settingsName = new string[] { "startCollectTime", "reportNums", "ip", "port" };
//                setMap = getSettings(deviceId, "000043", settingsName);  
//            }
//            else if (devType == "多功能漏损监测仪")//有问题,待修改
//            {
//                List<DeviceConfigInfo> dgnConfigList = new BLL.DeviceConfig().getDeviceConfigListByDeviceCodeAndSensorCode(
//                    deviceId, "000051");

//                List<Model.DeviceConfigInfo> validConfigs =
//                    new BLL.DeviceConfig().removeTimeoutConfig(dgnConfigList);

//                if (validConfigs != null && validConfigs.Count != 0)
//                {
//                    foreach (DeviceConfigInfo configInfo in validConfigs)
//                    {
//                        if (!session.devMaps.ContainsKey(deviceId) ||
//                            session.devMaps[deviceId].SensorCode != configInfo.SensorCode)
//                            continue;
//                        else
//                        {
//                            String content = configInfo.FrameContent;
//                            String[] slParams = content.Split(',');

//                            String sensorCode = ""; //add by yan 标识多功能三个探头
//                            sensorType = configInfo.SensorCode;

//                            switch (configInfo.SensorCode)
//                            {
//                                case "000031": //流量
//                                    sensorCode = "1";
//                                    break;
//                                case "000033": //压力
//                                    sensorCode = "2";
//                                    break;
//                                case "000032": //噪声
//                                    sensorCode = "3";
//                                    break;
//                                default:
//                                    break;
//                            }

//                            String startCollectTime = slParams[0]; //采集开始时间
//                            String collectInterval = slParams[1]; //采集间隔
//                            String collectNums = slParams[2]; //采集次数
//                            String startReportTime = slParams[3]; //上报开始时间
//                            String reportNums = slParams[4]; //每天上报次数
//                            String downThresh = "";
//                            String upThresh = "";
//                            if (sensorCode == "2")
//                            {
//                                downThresh = slParams[6];
//                                upThresh = slParams[5];
//                            }

//                            Dictionary<String, String> setMaps = new Dictionary<String, String>();//???
//                            setMaps.Add("startCollectTime", startCollectTime);
//                            setMaps.Add("collectInterval", collectInterval);
//                            setMaps.Add("collectNums", collectNums);
//                            setMaps.Add("startReportTime", startReportTime);
//                            setMaps.Add("reportNums", reportNums);
//                            setMaps.Add("sensorCode", sensorCode); //add by yan
//                            if (sensorCode == "2")
//                            {
//                                setMaps.Add("downThresh", downThresh);
//                                setMaps.Add("upThresh", upThresh);
//                            }
//                        }
//                    }
//                }
//            }
        

//            if (routeFlag == "03")
//            {
//                sender.doSendCasicConfig(deviceId, version, devType, setMap, session, "3", sensorType, false, operType);
//            }
//            else if (routeFlag == "06")//电信NB平台
//            {
//                sender.doSendTelecomConfig(deviceId, version, devType, setMap, session, "3", sensorType, telecomDeviceId);
//            }
//            else 
//            {
//                session.Logger.Error("3G网络下发配置时路由标识错误!");
//            }
            
//        }

//        //从数据库取得下发参数
//        private Dictionary<String, String> getSettings(string deviceId, string sensorId, string[] settingsName)
//        {
//            Dictionary<String, String> setMap = new Dictionary<String, String>();
//            Model.DeviceConfigInfo config = null;
//            config = new BLL.DeviceConfig().GetDeviceConfByDeviceCodeAndSensorCode(
//                deviceId, sensorId);
//            List<Model.DeviceConfigInfo> configs = new List<DeviceConfigInfo>();
//            if (config != null)
//            {
//                configs.Add(config);
//            }
//            List<Model.DeviceConfigInfo> validConfigs =
//                new BLL.DeviceConfig().removeTimeoutConfig(configs);
//            if (validConfigs != null && validConfigs.Count != 0)
//            {
//                String content = validConfigs[0].FrameContent;
//                String[] slParams = content.Split(',');

//                for (int i = 0; i < settingsName.Length; i++)
//                {
//                    setMap.Add(settingsName[i], slParams[i]);
//                }
//            }
//            return setMap;
//        }
//    }
//}