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.LampNBServer { public class Lamp : 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 = "LampNB"; 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.kafkaSetResponseProduce(session, devCode, devName); return; } List<Tag> tags = Common.getTags(settings, session); //具体业务处理 int? pci = null; int? rsrp = null; int? snr = null; String softwareVersion = ""; uint offset = 0; uint size = 0; String collectDate = ""; List<String> startupList = new List<String>(); List<int> states = new List<int>(); List<float> electricities = new List<float>(); List<float> voltages = new List<float>(); List<float> activePoweres = new List<float>(); List<float> reactivePoweres = new List<float>(); List<float> apparentPoweres = new List<float>(); List<float> activeEnergies = new List<float>(); List<float> reactiveEnergies = new List<float>(); List<float> apparentEnergies = new List<float>(); List<DatasJson> lampDataList = new List<DatasJson>(); List<State> loopStates = null; 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; if (voltages.Count > 0) { loopStates = new List<State>(); foreach (int s in sensorException0.states) { State state = new State(); state.state = s; loopStates.Add(state); } } else { states = sensorException0.states; } session.Logger.Info("通道一发送容错信息:oid:" + tag.Oid); continue; } if (tag != null && tag is PCITag) { PCITag pciTag = (PCITag)tag; pci = pciTag.PCI; continue; } if (tag != null && tag is RSRPTag) { RSRPTag rsrpTag = (RSRPTag)tag; rsrp = rsrpTag.RSRP; continue; } if (tag != null && tag is SNRTag) { SNRTag snrTag = (SNRTag)tag; snr = snrTag.SNR; 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; } //非业务处理 if (tag != null && tag is SoftwareVersionTag) { SoftwareVersionTag versionTag = (SoftwareVersionTag)tag; softwareVersion = versionTag.Version; continue; } if (tag != null && tag is OffsetTag) { OffsetTag offsetTag = (OffsetTag)tag; offset = offsetTag.Offset; continue; } if (tag != null && tag is SizeTag) { SizeTag sizeTag = (SizeTag)tag; size = sizeTag.Size; continue; } } else { //业务处理 UploadTag uploadTag = tag as UploadTag; switch (uploadTag.BizType) { case 14: //电流 TagHandler eleHandler = new ElectricityTagHandler(); eleHandler.resolve(tag, session); for (int i = 0; i < eleHandler.DataList.Count; i++) { electricities.Add((float)eleHandler.DataList[i]); } break; case 15: //电压 TagHandler volHandler = new VoltageTagHandler(); volHandler.resolve(tag, session); for (int i = 0; i < volHandler.DataList.Count; i++) { voltages.Add((float)volHandler.DataList[i]); } break; case 22: //有功功率 TagHandler activePowerHandler = new ActivePowerTagHandler(); activePowerHandler.resolve(tag, session); for (int i = 0; i < activePowerHandler.DataList.Count; i++) { activePoweres.Add((float)activePowerHandler.DataList[i]); } break; case 23: //无功功率 TagHandler reactivePowerHandler = new ReactivePowerTagHandler(); reactivePowerHandler.resolve(tag, session); for (int i = 0; i < reactivePowerHandler.DataList.Count; i++) { reactivePoweres.Add((float)reactivePowerHandler.DataList[i]); } break; //case 24: // //视在功率 // TagHandler apparentPowerHandler = new ApparentPowerTagHandler(); // apparentPowerHandler.resolve(tag, session); // for (int i = 0; i < apparentPowerHandler.DataList.Count; i++) // { // apparentPoweres.Add((float)apparentPowerHandler.DataList[i]); // } // break; case 27: //有功电能 TagHandler activeEnergyHandler = new ActiveEnergyTagHandler(); activeEnergyHandler.resolve(tag, session); for (int i = 0; i < activeEnergyHandler.DataList.Count; i++) { activeEnergies.Add((float)activeEnergyHandler.DataList[i]); } break; case 28: //无功电能 TagHandler reactiveEnergyHandler = new ReactiveEnergyTagHandler(); reactiveEnergyHandler.resolve(tag, session); for (int i = 0; i < reactiveEnergyHandler.DataList.Count; i++) { reactiveEnergies.Add((float)reactiveEnergyHandler.DataList[i]); } break; //case 29: // //视在电能 // TagHandler apparentEnergyHandler = new ApparentEnergyTagHandler(); // apparentEnergyHandler.resolve(tag, session); // for (int i = 0; i < apparentEnergyHandler.DataList.Count; i++) // { // apparentEnergies.Add((float)apparentEnergyHandler.DataList[i]); // } // break; default: session.Logger.Info("未知业务类型!"); break; } } } if (voltages.Count > 0) { for (int i = 0; i < voltages.Count; i++) { if (states.Count == 0) { lampDataList.Add(new LampData(0, electricities[i], voltages[i], activePoweres[i], reactivePoweres[i], activeEnergies[i], reactiveEnergies[i])); } else { lampDataList.Add(new LampData(states[i], electricities[i], voltages[i], activePoweres[i], reactivePoweres[i], activeEnergies[i], reactiveEnergies[i])); } } if (electricities.Count == 4) { if (states.Count == 4) { lampDataList.Add(new LampData(states[3], electricities[3])); } else { lampDataList.Add(new LampData(0, electricities[3])); } } //for (int i = 0; i < loopStates.Count; i++) //{ // lampDataList.Add(new LampData(loopStates[0])); //} } else if (states.Count > 0) { lampDataList.Add(new LampData(states[0])); } byte[] btPdu = new byte[2]; //2个字节 btPdu[0] = Common.getRespOperType(operType, true); if (devCode.Substring(0, 2) == "72")//灯箱控制器 { btPdu[1] = 0x91; } else { btPdu[1] = 0x90; } if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { Common.kafkaProduceVersinData(session, devName, devCode, softwareVersion); if (devCode.Substring(0, 2) == "72") { devName = "LamphouseNB"; } Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); return; } Common.senderNBConfig(session, devCode, btPdu, source); Common.kafkaProduce(session, devName, devCode, -1, pci, rsrp, snr, null, lampDataList, startupList, loopStates); } catch (Exception e) { session.Logger.Error(e.ToString()); } } } }