//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; // } // } //}