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.CorrEnv { public class CorrEnv : 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 = "CorrEnv"; 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, devName); return; } List<Tag> tags = Common.getTags(settings, session); //具体业务处理 String collectDate = ""; int cell = 0; List<String> eventList = new List<String>(); List<DatasJson> datasList = new List<DatasJson>(); List<String> startupList = new List<String>(); foreach (Tag tag in tags) { if (!(tag is UploadTag)) { if (tag != null && tag is CellTag) { CellTag cellTag = tag as CellTag; cell = cellTag.Cell; continue; } //非业务处理 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 = getEnvListByState(state, 0); session.Logger.Info("通道一发送容错信息:oid:" + tag.Oid + ";value:" + state); continue; } if (tag != null && tag is SensorException1Tag) { SensorException1Tag sensorException1 = tag as SensorException1Tag; int state = sensorException1.state; if (state == 0) continue; byte byteState = Convert.ToByte(state); if ((byteState & 0x01) == 0x01) { eventList.Add(getCorrEnvAlarm(9)); } if ((byteState & 0x40) == 0x40) { eventList.Add(getCorrEnvAlarm(10)); } if ((byteState & 0x80) == 0x80) { eventList.Add(getCorrEnvAlarm(11)); } session.Logger.Info("通道二发送容错信息:oid:" + tag.Oid + ";value:" + state); 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; } } else { //业务处理 UploadTag uploadTag = tag as UploadTag; switch (uploadTag.BizType) { case 12: //温度、电压、布尔类型 TagHandler envHandler = new CorrEnvTagHandler(); envHandler.resolve(tag, session); DateTime baseTime = Convert.ToDateTime(collectDate + " " + envHandler.CollecTime); for (int i = 0; i < envHandler.DataList.Count / 11; i++) { DateTime upTime = baseTime.AddMinutes(i * envHandler.Interval); String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); List<bool> inundate = new List<bool>(); inundate.Add((bool)envHandler.DataList[i + 5]); inundate.Add((bool)envHandler.DataList[i + 6]); inundate.Add((bool)envHandler.DataList[i + 7]); inundate.Add((bool)envHandler.DataList[i + 8]); inundate.Add((bool)envHandler.DataList[i + 9]); inundate.Add((bool)envHandler.DataList[i + 10]); datasList.Add(new CorrEnvDatasJson( uptime, (float)envHandler.DataList[i], (float)envHandler.DataList[i + 1], (float)envHandler.DataList[i + 2], (float)envHandler.DataList[i + 3], (float)envHandler.DataList[i + 4], inundate)); } break; default: session.Logger.Info("未知业务类型!"); break; } } } Common.sendMessage(session, devName, devCode, cell, eventList, datasList, startupList); byte[] btPdu = new byte[2]; //2个字节 btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); btPdu[1] = 0x8C; Common.sendConfig(session, devCode, routeFlag, source, btPdu); } private List<String> getEnvListByState(int state, int enumState) { List<String> envList = new List<String>(); byte byteState = Convert.ToByte(state); for (int i = 0; i < 8; i++) { int flag = (byteState >> i) & 0x01; if (flag == 0) { continue; } envList.Add(getCorrEnvAlarm(flag + i)); } //envList.Add(getCorrEnvAlarm((byteState >> 4) & 0x01 + 4)); //envList.Add(getCorrEnvAlarm((byteState >> 5) & 0x01 + 5)); //envList.Add(getCorrEnvAlarm((byteState >> 6) & 0x01 + 6)); //envList.Add(getCorrEnvAlarm((byteState >> 7) & 0x01 + 7)); //envList.Add(getCorrEnvAlarm((byteState >> 0) & 0x01 + 0)); //envList.Add(getCorrEnvAlarm((byteState >> 1) & 0x01 + 1)); //envList.Add(getCorrEnvAlarm((byteState >> 2) & 0x01 + 2)); //envList.Add(getCorrEnvAlarm((byteState >> 3) & 0x01 + 3)); return envList; } private String getCorrEnvAlarm(int state) { switch (state) { case 0: return "CorrEnvNormal";//腐蚀环境正常 case 1: return "CorrEnvTemp1Overrun"; //1路温度超限报警 case 2: return "CorrEnvTemp2Overrun"; //2路温度超限报警 case 3: return "CorrEnvTemp3Overrun"; //3路温度超限报警 case 4: return "CorrEnvTemp4Overrun"; //4路温度超限报警 case 5: return "CorrEnvTemp1Fail"; //1路温度采集失败 case 6: return "CorrEnvTemp2Fail"; //2路温度采集失败 case 7: return "CorrEnvTemp3Fail"; //3路温度采集失败 case 8: return "CorrEnvTemp4Fail"; //4路温度采集失败 case 9: return "CorrEnvPotentialOverrun"; //电位数据超限报警 case 10: return "CorrEnvADC1Fail"; //ADC1通信失败 case 11: return "CorrEnvADC2Fail"; //ADC2通信失败 case 12: return "CorrEnvError"; //腐蚀环境监测仪设备异常报警 default: return "CorrEnvUnknown"; //腐蚀环境未知异常 } } } }