/** * 发送203所自研设备:渗漏预警仪、液位监测仪、井盖传感器的配置信息 * **/ private bool sendCasicConfig(DeviceDTO dto, Dictionary <String, String> settings) { //判断设备是否已经唤醒 //TODO LIST:获取会话信息,发送数据 /* * var server0 = bootstrap.GetServerByName(CASIC_SERVER_NAME); * CasicServer casicServer0 = server0 as CasicServer; * CasicSession session0 = casicServer0.GetSessionByID(dto.SessionId) as CasicSession; * CasicSession.DeviceDTO dev = session0.devMaps[dto.Name]; * if (!dev.IsWakeUp && dev.DevType!="集中器") * { * return false; * } * */ String[] parameters = dto.Tag.Split(','); //TODO: construct the receving casic data String preamble = parameters[0]; byte btpreamble = byte.Parse(preamble, System.Globalization.NumberStyles.HexNumber); String version = parameters[1]; byte btVersion = byte.Parse(version, System.Globalization.NumberStyles.HexNumber); String deviceId = parameters[3];//6个字节 byte[] btDevId = new byte[6]; btDevId[0] = byte.Parse(deviceId.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); btDevId[1] = byte.Parse(deviceId.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); btDevId[2] = byte.Parse(deviceId.Substring(4, 2), System.Globalization.NumberStyles.HexNumber); btDevId[3] = byte.Parse(deviceId.Substring(6, 2), System.Globalization.NumberStyles.HexNumber); btDevId[4] = byte.Parse(deviceId.Substring(8, 2), System.Globalization.NumberStyles.HexNumber); btDevId[5] = byte.Parse(deviceId.Substring(10, 2), System.Globalization.NumberStyles.HexNumber); String routeFlag = parameters[4]; byte btRouteFlag = byte.Parse(routeFlag, System.Globalization.NumberStyles.HexNumber); String dstNodeAddr = parameters[5];//2个字节 byte[] btDstNode = new byte[2]; btDstNode[0] = byte.Parse(dstNodeAddr.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); btDstNode[1] = byte.Parse(dstNodeAddr.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); String seq = parameters[7]; byte btSeq = byte.Parse(seq, System.Globalization.NumberStyles.HexNumber); byte[] btPdu = new byte[2];; //2个字节 byte[] tag = null; switch (dto.TypeName) { case "渗漏预警仪": btPdu[0] = 0x03; btPdu[1] = 0x82; tag = this.getNosieTag(settings); break; case "液位监测仪": btPdu[0] = 0x03; btPdu[1] = 0x87; tag = this.getYWTag(settings); break; case "集中器": btPdu[0] = 0x03; btPdu[1] = 0x85; tag = this.getHubTag(settings); break; case "温度压力监测仪": btPdu[0] = 0x03; btPdu[1] = 0x88; tag = this.getTempTag(settings); break; /* * case "压力计": * btPdu[0] = 0x03; * btPdu[1] = 0x89; * tag = this.getPressTag(settings); * break; * */ case "远传水表": btPdu[0] = 0x03; btPdu[1] = 0x8A; tag = this.getWaterMeterTag(settings); break; case "井盖传感器": btPdu[0] = 0x03; btPdu[1] = 0x86; break; default: break; } int totalLen = 6 + 1 + 2 + 2 + 1 + tag.Length; byte[] btLens = new byte[2]; byte[] btlens0 = BitConverter.GetBytes(totalLen); btLens[0] = btlens0[1]; btLens[1] = btlens0[0]; //wrap the whole data byte[] result = new byte[1 + 1 + 2 + 6 + 1 + 2 + 2 + 1 + tag.Length]; result[0] = btpreamble; result[1] = btVersion; btLens.CopyTo(result, 2); btDevId.CopyTo(result, 4); result[10] = btRouteFlag; btDstNode.CopyTo(result, 11); btPdu.CopyTo(result, 13); result[15] = btSeq; tag.CopyTo(result, 16); // session.Logger.Info("CRC校验前数据:" + BitConverter.ToString(result)); //增加CRC校验 String strCrc = StringUtil.To16HexString(String.Format("{0:X}", (int)CodeUtils.CRC16_AD(result))); byte[] btcrc = { CodeUtils.String2Byte(strCrc.Substring(0, 2)), CodeUtils.String2Byte(strCrc.Substring(2, 2)) }; byte[] afcrc = new byte[result.Length + 2]; result.CopyTo(afcrc, 0); btcrc.CopyTo(afcrc, result.Length); //TODO LIST:获取会话信息,发送数据 var server = bootstrap.GetServerByName(CASIC_SERVER_NAME); CasicServer casicServer = server as CasicServer; CasicSession session = casicServer.GetSessionByID(dto.SessionId) as CasicSession; session.Logger.Info("手动下发渗漏噪声配置信息:" + BitConverter.ToString(afcrc)); session.Send(afcrc, 0, afcrc.Length); return(true); }
public override void ExecuteCommand(CasicSession session, StringRequestInfo requestInfo) { //casicSession = session; //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 crcs = requestInfo.Parameters[9]; //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); //update the device code //devCode = deviceId; //如果是集中器更新session,如果不是把设备切换成在线 if (devType == "集中器") { session.HubAddr = deviceId; new BLL.AlarmConcentrator().setHubOnLine(deviceId); } else { new BLL.DevHub().setOnLineByDevcode(deviceId); } //判断是返回的设置确认数据帧,更新DeviceConfig表 if (operType == "SetResponse") { new BLL.DeviceConfig().clearDeviceConfigByDevCode(deviceId); 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 noiseHandler = new NoiseTagHandler(); 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 pressHandler = new PressTagHandler(); TagHandler tempHandler = new TempTagHandler(); TagHandler fsslHandler = new FSSLTagHandler(); TagHandler fshjHandler = new FSHJTagHandler(); TagHandler rqHandler = new RQTagHandler(); TagHandler sensorExp0 = new SensorException0TagHandler(); TagHandler sensorExp1 = new SensorException1TagHandler(); systemDateHandler.NextHandler = noiseHandler; noiseHandler.NextHandler = liquidHandler; liquidHandler.NextHandler = waterMeterHadler; waterMeterHadler.NextHandler = wellHandler; wellHandler.NextHandler = tempHandler; tempHandler.NextHandler = pressHandler; pressHandler.NextHandler = rqHandler; rqHandler.NextHandler = sysTimeHandler; sysTimeHandler.NextHandler = wakeupHandler; wakeupHandler.NextHandler = cellTagHandler; cellTagHandler.NextHandler = fsslHandler; fsslHandler.NextHandler = fshjHandler; fshjHandler.NextHandler = sensorExp0; sensorExp0.NextHandler = sensorExp1; foreach (Tag tag in tags) { //采用责任链的方式来处理各个tag: //目前已经处理噪声、液位、系统时间、系统日期tag systemDateHandler.handleTag(tag, deviceId, cellTag, systemDateTag, session); } if (routeFlag == "03") //GPRS { senderGPRSConfig(devType, deviceId, version, session); } else //433 { //下发返回的信息 if ((operType != "GetResponse") && (devType != "井盖传感器") && isfinishe(pduType) && (operType == "TrapRequest" || operType == "OnlineRequest") ) { 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; } } } catch (Exception e) { session.Logger.Error(e.ToString()); } }
public void wakeUpCasicDev(DeviceDTO dto) { //判断当前是够已经唤醒,如果已经唤醒则不再下发配置信息 //判断设备是否已经唤醒 //TODO LIST:获取会话信息,发送数据 var server0 = bootstrap.GetServerByName(CASIC_SERVER_NAME); CasicServer casicServer0 = server0 as CasicServer; CasicSession session0 = casicServer0.GetSessionByID(dto.SessionId) as CasicSession; CasicSession.DeviceDTO dev = session0.devMaps[dto.Name]; if (dev.IsWakeUp || dev.DevType == "集中器") { return; } String[] parameters = dto.Tag.Split(','); //TODO: construct the receving casic data String preamble = parameters[0]; byte btpreamble = byte.Parse(preamble, System.Globalization.NumberStyles.HexNumber); String version = parameters[1]; byte btVersion = byte.Parse(version, System.Globalization.NumberStyles.HexNumber); String deviceId = parameters[3];//6个字节 byte[] btDevId = new byte[6]; btDevId[0] = byte.Parse(deviceId.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); btDevId[1] = byte.Parse(deviceId.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); btDevId[2] = byte.Parse(deviceId.Substring(4, 2), System.Globalization.NumberStyles.HexNumber); btDevId[3] = byte.Parse(deviceId.Substring(6, 2), System.Globalization.NumberStyles.HexNumber); btDevId[4] = byte.Parse(deviceId.Substring(8, 2), System.Globalization.NumberStyles.HexNumber); btDevId[5] = byte.Parse(deviceId.Substring(10, 2), System.Globalization.NumberStyles.HexNumber); String routeFlag = parameters[4]; byte btRouteFlag = byte.Parse(routeFlag, System.Globalization.NumberStyles.HexNumber); String dstNodeAddr = parameters[5];//2个字节 byte[] btDstNode = new byte[2]; btDstNode[0] = byte.Parse(dstNodeAddr.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); btDstNode[1] = byte.Parse(dstNodeAddr.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); String sPtuType = parameters[6];//2个字节 Int16 btpduType = Int16.Parse(sPtuType, System.Globalization.NumberStyles.HexNumber); Int16 opearType = (Int16)(btpduType & 0x7F); Int16 pdu = (Int16)(2688 + opearType); //0X0A80 byte[] btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; // btDstNode[0] = byte.Parse(dstNodeAddr.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); // btDstNode[1] = byte.Parse(dstNodeAddr.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); String seq = parameters[7]; byte btSeq = byte.Parse(seq, System.Globalization.NumberStyles.HexNumber); byte[] tag = { 0x60, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00 }; byte[] totoalLen = { 0x00, 0x13 }; //wrap the whole data byte[] result = new byte[1 + 1 + 2 + 6 + 1 + 2 + 2 + 1 + 7]; result[0] = btpreamble; result[1] = btVersion; totoalLen.CopyTo(result, 2); btDevId.CopyTo(result, 4); result[10] = btRouteFlag; btDstNode.CopyTo(result, 11); btPdu.CopyTo(result, 13); result[15] = btSeq; tag.CopyTo(result, 16); //增加CRC校验 String strCrc = StringUtil.To16HexString(String.Format("{0:X}", (int)CodeUtils.CRC16_AD(result))); byte[] btcrc = { CodeUtils.String2Byte(strCrc.Substring(0, 2)), CodeUtils.String2Byte(strCrc.Substring(2, 2)) }; byte[] afcrc = new byte[result.Length + 2]; result.CopyTo(afcrc, 0); btcrc.CopyTo(afcrc, result.Length); //TODO LIST:获取会话信息,发送数据 var server = bootstrap.GetServerByName(CASIC_SERVER_NAME); CasicServer casicServer = server as CasicServer; CasicSession session = casicServer.GetSessionByID(dto.SessionId) as CasicSession; session.Logger.Info("下发唤醒信息:" + "设备编号:" + deviceId + "" + BitConverter.ToString(afcrc)); session.Send(afcrc, 0, afcrc.Length); }
public override void ExecuteCommand(AdlerSession session, StringRequestInfo requestInfo) { adlerSession = session; String preamble = requestInfo.Parameters[0]; String version = requestInfo.Parameters[1]; String leng = requestInfo.Parameters[2]; String deviceId = requestInfo.Parameters[3]; String pduType = requestInfo.Parameters[4]; String seq = requestInfo.Parameters[5]; String settings = requestInfo.Parameters[6]; //减去结尾回车换行符号,减去总的字节数 String crcs = requestInfo.Parameters[7]; //print the receving data session.Logger.Info("AD接收数据:" + requestInfo.Body); session.Logger.Info("当前版本:" + version); session.Logger.Info("设备编号:" + deviceId); session.Logger.Info("设备类型" + getDeviceTypeByPdu(pduType)); session.Logger.Info("操作类型" + getOpeTypeByPdu(pduType)); //update the device code devCode = deviceId; //upload periodically or config query according to oid List <Tag> tags = this.getTags(settings); try { //TODO LIST:处理主动上报的数据、参数查询、参数设置 TagHandler systemDateHandler = new SystemDateTagHandler(); TagHandler flowHandler = new FlowTagHandler(); TagHandler pressHandler = new PressTagHandler(); TagHandler noiseHandler = new NoiseTagHandler(); TagHandler liquidHandler = new LiquidTagHandler(); TagHandler sysTimeHandler = new SystemTimeTagHandler(); systemDateHandler.NextHandler = flowHandler; flowHandler.NextHandler = pressHandler; pressHandler.NextHandler = noiseHandler; noiseHandler.NextHandler = liquidHandler; liquidHandler.NextHandler = sysTimeHandler; foreach (Tag tag in tags) { //采用责任链的方式来处理各个tag: //目前已经处理噪声、流量、压力、系统日期tag systemDateHandler.handleTag(tag); } //TODO LIST:必须首先设置SetRequest,并且第一个tag必须是设置系统是时间,相关需要设置的值 if (isfinishe(pduType)) { //TODO LIST:查询数据库是否有配置信息,无则下载配置文件中的默认配置信息 SensorHub.Model.DeviceConfigInfo conf = (new DeviceConfig()).GetDeviceConfByDeviceCodeAndSensorCode(deviceId, "000034"); if (conf == null) { //TODO LIST:有新的配置项目,按照下面方式追加即可 // byte[] config = ApplicationContext.getInstance().getDefaultADSettting(version,deviceId,pduType,seq); HeadConfig headConfig = new HeadConfig(version, deviceId, pduType, seq); PortConfig portConfig = new PortConfig(headConfig); IpConfig ipConfig = new IpConfig(portConfig); CollectSettingcConfig setConfig = new CollectSettingcConfig(ipConfig); SystemTimeConfig sysTimeConfig = new SystemTimeConfig(setConfig); byte[] btConfig = sysTimeConfig.getConfig(new byte[0]); session.Logger.Info("CRC校验前数据:" + BitConverter.ToString(btConfig)); //增加CRC校验 String strCrc = String.Format("{0:X}", (int)CodeUtils.CRC16_AD(btConfig)); 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("CRC校验后数据:" + BitConverter.ToString(afcrc)); //编码下发: byte[] enCodedConfig = CodeUtils.adEncode(afcrc); session.Send(enCodedConfig, 0, enCodedConfig.Length); session.Logger.Info("编码后下发数据:" + BitConverter.ToString(enCodedConfig)); //解码下发数据用于验证 byte[] temp = enCodedConfig.CloneRange(0, enCodedConfig.Length - 2); session.Logger.Info("编码前下发数据:" + BitConverter.ToString(CodeUtils.adDecode(temp))); } } } catch (Exception e) { session.Logger.Error(e.ToString()); } }