diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs new file mode 100644 index 0000000..0130a23 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs @@ -0,0 +1,64 @@ +using SensorHub.Servers; +using SensorHub.Servers.Commands.CASICCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideTagHandler : TagHandler + { + public override bool isThisTag(Tag tag) + { + if (!(tag is UploadTag)) + { + return false; + } + + UploadTag uploadTag = tag as UploadTag; + + return uploadTag.BizType == 5 ? true : false; + } + + public override void resolve(Tag tag, CasicSession session) + { + //TODO LIST:解析数据保存数据 + UploadTag hsTag = tag as UploadTag; + Interval = hsTag.CollectInter; + CollecTime = hsTag.CollectTime; + int len = hsTag.Len; + String dataValue = hsTag.DataValue; + + session.Logger.Info("硫化氢浓度数据上传TAG:oid:" + hsTag.Oid + " 采集间隔: " + + Interval + "采集时间:" + CollecTime + "上传数值:" + dataValue); + + DataList = new List(); + int num = len / 4; //上传的硫化氢浓度数据个数 + for (int i = 0; i < num; i++) + { + float density = strHexToFloat(dataValue.Substring(i * 8, 8)); + DataList.Add(density); + } + } + + //转float + private float strHexToFloat(String src) + { + if (src.Length != 8) + return 0; + + byte[] lBt ={ + byte.Parse(src.Substring(0,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(2,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(4,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(6,2),System.Globalization.NumberStyles.HexNumber) + + }; + float ss = BitConverter.ToSingle(lBt, 0); + return ss; + + } + } +} diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs new file mode 100644 index 0000000..0130a23 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs @@ -0,0 +1,64 @@ +using SensorHub.Servers; +using SensorHub.Servers.Commands.CASICCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideTagHandler : TagHandler + { + public override bool isThisTag(Tag tag) + { + if (!(tag is UploadTag)) + { + return false; + } + + UploadTag uploadTag = tag as UploadTag; + + return uploadTag.BizType == 5 ? true : false; + } + + public override void resolve(Tag tag, CasicSession session) + { + //TODO LIST:解析数据保存数据 + UploadTag hsTag = tag as UploadTag; + Interval = hsTag.CollectInter; + CollecTime = hsTag.CollectTime; + int len = hsTag.Len; + String dataValue = hsTag.DataValue; + + session.Logger.Info("硫化氢浓度数据上传TAG:oid:" + hsTag.Oid + " 采集间隔: " + + Interval + "采集时间:" + CollecTime + "上传数值:" + dataValue); + + DataList = new List(); + int num = len / 4; //上传的硫化氢浓度数据个数 + for (int i = 0; i < num; i++) + { + float density = strHexToFloat(dataValue.Substring(i * 8, 8)); + DataList.Add(density); + } + } + + //转float + private float strHexToFloat(String src) + { + if (src.Length != 8) + return 0; + + byte[] lBt ={ + byte.Parse(src.Substring(0,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(2,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(4,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(6,2),System.Globalization.NumberStyles.HexNumber) + + }; + float ss = BitConverter.ToSingle(lBt, 0); + return ss; + + } + } +} diff --git a/SensorHub.HydrogenSulfide/Program.cs b/SensorHub.HydrogenSulfide/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.HydrogenSulfide/Program.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.PipeWatcher +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs new file mode 100644 index 0000000..0130a23 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs @@ -0,0 +1,64 @@ +using SensorHub.Servers; +using SensorHub.Servers.Commands.CASICCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideTagHandler : TagHandler + { + public override bool isThisTag(Tag tag) + { + if (!(tag is UploadTag)) + { + return false; + } + + UploadTag uploadTag = tag as UploadTag; + + return uploadTag.BizType == 5 ? true : false; + } + + public override void resolve(Tag tag, CasicSession session) + { + //TODO LIST:解析数据保存数据 + UploadTag hsTag = tag as UploadTag; + Interval = hsTag.CollectInter; + CollecTime = hsTag.CollectTime; + int len = hsTag.Len; + String dataValue = hsTag.DataValue; + + session.Logger.Info("硫化氢浓度数据上传TAG:oid:" + hsTag.Oid + " 采集间隔: " + + Interval + "采集时间:" + CollecTime + "上传数值:" + dataValue); + + DataList = new List(); + int num = len / 4; //上传的硫化氢浓度数据个数 + for (int i = 0; i < num; i++) + { + float density = strHexToFloat(dataValue.Substring(i * 8, 8)); + DataList.Add(density); + } + } + + //转float + private float strHexToFloat(String src) + { + if (src.Length != 8) + return 0; + + byte[] lBt ={ + byte.Parse(src.Substring(0,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(2,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(4,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(6,2),System.Globalization.NumberStyles.HexNumber) + + }; + float ss = BitConverter.ToSingle(lBt, 0); + return ss; + + } + } +} diff --git a/SensorHub.HydrogenSulfide/Program.cs b/SensorHub.HydrogenSulfide/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.HydrogenSulfide/Program.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.PipeWatcher +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1d85286 --- /dev/null +++ b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.HydrogenSulfide")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.HydrogenSulfide")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d51363ce-ee08-4252-ad3a-6aef13b5df81")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs new file mode 100644 index 0000000..0130a23 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs @@ -0,0 +1,64 @@ +using SensorHub.Servers; +using SensorHub.Servers.Commands.CASICCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideTagHandler : TagHandler + { + public override bool isThisTag(Tag tag) + { + if (!(tag is UploadTag)) + { + return false; + } + + UploadTag uploadTag = tag as UploadTag; + + return uploadTag.BizType == 5 ? true : false; + } + + public override void resolve(Tag tag, CasicSession session) + { + //TODO LIST:解析数据保存数据 + UploadTag hsTag = tag as UploadTag; + Interval = hsTag.CollectInter; + CollecTime = hsTag.CollectTime; + int len = hsTag.Len; + String dataValue = hsTag.DataValue; + + session.Logger.Info("硫化氢浓度数据上传TAG:oid:" + hsTag.Oid + " 采集间隔: " + + Interval + "采集时间:" + CollecTime + "上传数值:" + dataValue); + + DataList = new List(); + int num = len / 4; //上传的硫化氢浓度数据个数 + for (int i = 0; i < num; i++) + { + float density = strHexToFloat(dataValue.Substring(i * 8, 8)); + DataList.Add(density); + } + } + + //转float + private float strHexToFloat(String src) + { + if (src.Length != 8) + return 0; + + byte[] lBt ={ + byte.Parse(src.Substring(0,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(2,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(4,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(6,2),System.Globalization.NumberStyles.HexNumber) + + }; + float ss = BitConverter.ToSingle(lBt, 0); + return ss; + + } + } +} diff --git a/SensorHub.HydrogenSulfide/Program.cs b/SensorHub.HydrogenSulfide/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.HydrogenSulfide/Program.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.PipeWatcher +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1d85286 --- /dev/null +++ b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.HydrogenSulfide")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.HydrogenSulfide")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d51363ce-ee08-4252-ad3a-6aef13b5df81")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj new file mode 100644 index 0000000..7bde57f --- /dev/null +++ b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952} + Library + SensorHub.HydrogenSulfide + SensorHub.HydrogenSulfide + v4.5 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + ..\bin\Newtonsoft.Json.dll + + + ..\bin\SuperSocket.SocketBase.dll + + + + + + + + + + + + + + + + + + {9bf5d683-f4f2-4d3d-8163-edb3c3d6eafc} + SensorHub.Servers + + + {d8f11ed2-b70a-4541-93d0-2508df14d7ab} + SensorHub.Utility + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs new file mode 100644 index 0000000..0130a23 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs @@ -0,0 +1,64 @@ +using SensorHub.Servers; +using SensorHub.Servers.Commands.CASICCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideTagHandler : TagHandler + { + public override bool isThisTag(Tag tag) + { + if (!(tag is UploadTag)) + { + return false; + } + + UploadTag uploadTag = tag as UploadTag; + + return uploadTag.BizType == 5 ? true : false; + } + + public override void resolve(Tag tag, CasicSession session) + { + //TODO LIST:解析数据保存数据 + UploadTag hsTag = tag as UploadTag; + Interval = hsTag.CollectInter; + CollecTime = hsTag.CollectTime; + int len = hsTag.Len; + String dataValue = hsTag.DataValue; + + session.Logger.Info("硫化氢浓度数据上传TAG:oid:" + hsTag.Oid + " 采集间隔: " + + Interval + "采集时间:" + CollecTime + "上传数值:" + dataValue); + + DataList = new List(); + int num = len / 4; //上传的硫化氢浓度数据个数 + for (int i = 0; i < num; i++) + { + float density = strHexToFloat(dataValue.Substring(i * 8, 8)); + DataList.Add(density); + } + } + + //转float + private float strHexToFloat(String src) + { + if (src.Length != 8) + return 0; + + byte[] lBt ={ + byte.Parse(src.Substring(0,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(2,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(4,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(6,2),System.Globalization.NumberStyles.HexNumber) + + }; + float ss = BitConverter.ToSingle(lBt, 0); + return ss; + + } + } +} diff --git a/SensorHub.HydrogenSulfide/Program.cs b/SensorHub.HydrogenSulfide/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.HydrogenSulfide/Program.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.PipeWatcher +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1d85286 --- /dev/null +++ b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.HydrogenSulfide")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.HydrogenSulfide")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d51363ce-ee08-4252-ad3a-6aef13b5df81")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj new file mode 100644 index 0000000..7bde57f --- /dev/null +++ b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952} + Library + SensorHub.HydrogenSulfide + SensorHub.HydrogenSulfide + v4.5 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + ..\bin\Newtonsoft.Json.dll + + + ..\bin\SuperSocket.SocketBase.dll + + + + + + + + + + + + + + + + + + {9bf5d683-f4f2-4d3d-8163-edb3c3d6eafc} + SensorHub.Servers + + + {d8f11ed2-b70a-4541-93d0-2508df14d7ab} + SensorHub.Utility + + + + \ No newline at end of file diff --git a/SensorHub.Methane/Methane.cs b/SensorHub.Methane/Methane.cs index a046030..8513d89 100644 --- a/SensorHub.Methane/Methane.cs +++ b/SensorHub.Methane/Methane.cs @@ -191,8 +191,8 @@ } } - //Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs new file mode 100644 index 0000000..0130a23 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs @@ -0,0 +1,64 @@ +using SensorHub.Servers; +using SensorHub.Servers.Commands.CASICCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideTagHandler : TagHandler + { + public override bool isThisTag(Tag tag) + { + if (!(tag is UploadTag)) + { + return false; + } + + UploadTag uploadTag = tag as UploadTag; + + return uploadTag.BizType == 5 ? true : false; + } + + public override void resolve(Tag tag, CasicSession session) + { + //TODO LIST:解析数据保存数据 + UploadTag hsTag = tag as UploadTag; + Interval = hsTag.CollectInter; + CollecTime = hsTag.CollectTime; + int len = hsTag.Len; + String dataValue = hsTag.DataValue; + + session.Logger.Info("硫化氢浓度数据上传TAG:oid:" + hsTag.Oid + " 采集间隔: " + + Interval + "采集时间:" + CollecTime + "上传数值:" + dataValue); + + DataList = new List(); + int num = len / 4; //上传的硫化氢浓度数据个数 + for (int i = 0; i < num; i++) + { + float density = strHexToFloat(dataValue.Substring(i * 8, 8)); + DataList.Add(density); + } + } + + //转float + private float strHexToFloat(String src) + { + if (src.Length != 8) + return 0; + + byte[] lBt ={ + byte.Parse(src.Substring(0,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(2,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(4,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(6,2),System.Globalization.NumberStyles.HexNumber) + + }; + float ss = BitConverter.ToSingle(lBt, 0); + return ss; + + } + } +} diff --git a/SensorHub.HydrogenSulfide/Program.cs b/SensorHub.HydrogenSulfide/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.HydrogenSulfide/Program.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.PipeWatcher +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1d85286 --- /dev/null +++ b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.HydrogenSulfide")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.HydrogenSulfide")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d51363ce-ee08-4252-ad3a-6aef13b5df81")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj new file mode 100644 index 0000000..7bde57f --- /dev/null +++ b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952} + Library + SensorHub.HydrogenSulfide + SensorHub.HydrogenSulfide + v4.5 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + ..\bin\Newtonsoft.Json.dll + + + ..\bin\SuperSocket.SocketBase.dll + + + + + + + + + + + + + + + + + + {9bf5d683-f4f2-4d3d-8163-edb3c3d6eafc} + SensorHub.Servers + + + {d8f11ed2-b70a-4541-93d0-2508df14d7ab} + SensorHub.Utility + + + + \ No newline at end of file diff --git a/SensorHub.Methane/Methane.cs b/SensorHub.Methane/Methane.cs index a046030..8513d89 100644 --- a/SensorHub.Methane/Methane.cs +++ b/SensorHub.Methane/Methane.cs @@ -191,8 +191,8 @@ } } - //Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { diff --git a/SensorHub.Servers/TelecomReceiveFilter.cs b/SensorHub.Servers/TelecomReceiveFilter.cs index d28a40f..616139d 100644 --- a/SensorHub.Servers/TelecomReceiveFilter.cs +++ b/SensorHub.Servers/TelecomReceiveFilter.cs @@ -82,24 +82,24 @@ } //////////////////////////////////////////////////////////////////////// - if (routeFlag == "03") - { - //对tag进行TEA解密 - Byte[] dat = new Byte[data.Length / 2 - 18]; - Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); - - TEA.decrypt(ref dat, dat.Length); - settings = BitConverter.ToString(dat, 0, dat.Length).Replace("-", "").Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); - } - else - { + // if (routeFlag == "03") + // { + // //对tag进行TEA解密 + // Byte[] dat = new Byte[data.Length / 2 - 18]; + // Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); + // + // TEA.decrypt(ref dat, dat.Length); + // settings = BitConverter.ToString(dat, 0, dat.Length).Replace("-", "").Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); + // } + // else + // { //对tag进行sm4解密 Byte[] dat = new Byte[data.Length / 2 - 18]; Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); String plainText = SM4Utils.sm4Decrypt(dat, deviceId); settings = plainText.Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); - } + // } result = Common.getDeviceTypeByPdu(pduType); diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs new file mode 100644 index 0000000..0130a23 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs @@ -0,0 +1,64 @@ +using SensorHub.Servers; +using SensorHub.Servers.Commands.CASICCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideTagHandler : TagHandler + { + public override bool isThisTag(Tag tag) + { + if (!(tag is UploadTag)) + { + return false; + } + + UploadTag uploadTag = tag as UploadTag; + + return uploadTag.BizType == 5 ? true : false; + } + + public override void resolve(Tag tag, CasicSession session) + { + //TODO LIST:解析数据保存数据 + UploadTag hsTag = tag as UploadTag; + Interval = hsTag.CollectInter; + CollecTime = hsTag.CollectTime; + int len = hsTag.Len; + String dataValue = hsTag.DataValue; + + session.Logger.Info("硫化氢浓度数据上传TAG:oid:" + hsTag.Oid + " 采集间隔: " + + Interval + "采集时间:" + CollecTime + "上传数值:" + dataValue); + + DataList = new List(); + int num = len / 4; //上传的硫化氢浓度数据个数 + for (int i = 0; i < num; i++) + { + float density = strHexToFloat(dataValue.Substring(i * 8, 8)); + DataList.Add(density); + } + } + + //转float + private float strHexToFloat(String src) + { + if (src.Length != 8) + return 0; + + byte[] lBt ={ + byte.Parse(src.Substring(0,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(2,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(4,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(6,2),System.Globalization.NumberStyles.HexNumber) + + }; + float ss = BitConverter.ToSingle(lBt, 0); + return ss; + + } + } +} diff --git a/SensorHub.HydrogenSulfide/Program.cs b/SensorHub.HydrogenSulfide/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.HydrogenSulfide/Program.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.PipeWatcher +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1d85286 --- /dev/null +++ b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.HydrogenSulfide")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.HydrogenSulfide")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d51363ce-ee08-4252-ad3a-6aef13b5df81")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj new file mode 100644 index 0000000..7bde57f --- /dev/null +++ b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952} + Library + SensorHub.HydrogenSulfide + SensorHub.HydrogenSulfide + v4.5 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + ..\bin\Newtonsoft.Json.dll + + + ..\bin\SuperSocket.SocketBase.dll + + + + + + + + + + + + + + + + + + {9bf5d683-f4f2-4d3d-8163-edb3c3d6eafc} + SensorHub.Servers + + + {d8f11ed2-b70a-4541-93d0-2508df14d7ab} + SensorHub.Utility + + + + \ No newline at end of file diff --git a/SensorHub.Methane/Methane.cs b/SensorHub.Methane/Methane.cs index a046030..8513d89 100644 --- a/SensorHub.Methane/Methane.cs +++ b/SensorHub.Methane/Methane.cs @@ -191,8 +191,8 @@ } } - //Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { diff --git a/SensorHub.Servers/TelecomReceiveFilter.cs b/SensorHub.Servers/TelecomReceiveFilter.cs index d28a40f..616139d 100644 --- a/SensorHub.Servers/TelecomReceiveFilter.cs +++ b/SensorHub.Servers/TelecomReceiveFilter.cs @@ -82,24 +82,24 @@ } //////////////////////////////////////////////////////////////////////// - if (routeFlag == "03") - { - //对tag进行TEA解密 - Byte[] dat = new Byte[data.Length / 2 - 18]; - Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); - - TEA.decrypt(ref dat, dat.Length); - settings = BitConverter.ToString(dat, 0, dat.Length).Replace("-", "").Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); - } - else - { + // if (routeFlag == "03") + // { + // //对tag进行TEA解密 + // Byte[] dat = new Byte[data.Length / 2 - 18]; + // Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); + // + // TEA.decrypt(ref dat, dat.Length); + // settings = BitConverter.ToString(dat, 0, dat.Length).Replace("-", "").Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); + // } + // else + // { //对tag进行sm4解密 Byte[] dat = new Byte[data.Length / 2 - 18]; Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); String plainText = SM4Utils.sm4Decrypt(dat, deviceId); settings = plainText.Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); - } + // } result = Common.getDeviceTypeByPdu(pduType); diff --git a/SensorHub.Tube/Tube.cs b/SensorHub.Tube/Tube.cs index aa7464c..e8f3f88 100644 --- a/SensorHub.Tube/Tube.cs +++ b/SensorHub.Tube/Tube.cs @@ -191,8 +191,8 @@ } } - //Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs new file mode 100644 index 0000000..0130a23 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs @@ -0,0 +1,64 @@ +using SensorHub.Servers; +using SensorHub.Servers.Commands.CASICCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideTagHandler : TagHandler + { + public override bool isThisTag(Tag tag) + { + if (!(tag is UploadTag)) + { + return false; + } + + UploadTag uploadTag = tag as UploadTag; + + return uploadTag.BizType == 5 ? true : false; + } + + public override void resolve(Tag tag, CasicSession session) + { + //TODO LIST:解析数据保存数据 + UploadTag hsTag = tag as UploadTag; + Interval = hsTag.CollectInter; + CollecTime = hsTag.CollectTime; + int len = hsTag.Len; + String dataValue = hsTag.DataValue; + + session.Logger.Info("硫化氢浓度数据上传TAG:oid:" + hsTag.Oid + " 采集间隔: " + + Interval + "采集时间:" + CollecTime + "上传数值:" + dataValue); + + DataList = new List(); + int num = len / 4; //上传的硫化氢浓度数据个数 + for (int i = 0; i < num; i++) + { + float density = strHexToFloat(dataValue.Substring(i * 8, 8)); + DataList.Add(density); + } + } + + //转float + private float strHexToFloat(String src) + { + if (src.Length != 8) + return 0; + + byte[] lBt ={ + byte.Parse(src.Substring(0,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(2,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(4,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(6,2),System.Globalization.NumberStyles.HexNumber) + + }; + float ss = BitConverter.ToSingle(lBt, 0); + return ss; + + } + } +} diff --git a/SensorHub.HydrogenSulfide/Program.cs b/SensorHub.HydrogenSulfide/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.HydrogenSulfide/Program.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.PipeWatcher +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1d85286 --- /dev/null +++ b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.HydrogenSulfide")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.HydrogenSulfide")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d51363ce-ee08-4252-ad3a-6aef13b5df81")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj new file mode 100644 index 0000000..7bde57f --- /dev/null +++ b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952} + Library + SensorHub.HydrogenSulfide + SensorHub.HydrogenSulfide + v4.5 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + ..\bin\Newtonsoft.Json.dll + + + ..\bin\SuperSocket.SocketBase.dll + + + + + + + + + + + + + + + + + + {9bf5d683-f4f2-4d3d-8163-edb3c3d6eafc} + SensorHub.Servers + + + {d8f11ed2-b70a-4541-93d0-2508df14d7ab} + SensorHub.Utility + + + + \ No newline at end of file diff --git a/SensorHub.Methane/Methane.cs b/SensorHub.Methane/Methane.cs index a046030..8513d89 100644 --- a/SensorHub.Methane/Methane.cs +++ b/SensorHub.Methane/Methane.cs @@ -191,8 +191,8 @@ } } - //Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { diff --git a/SensorHub.Servers/TelecomReceiveFilter.cs b/SensorHub.Servers/TelecomReceiveFilter.cs index d28a40f..616139d 100644 --- a/SensorHub.Servers/TelecomReceiveFilter.cs +++ b/SensorHub.Servers/TelecomReceiveFilter.cs @@ -82,24 +82,24 @@ } //////////////////////////////////////////////////////////////////////// - if (routeFlag == "03") - { - //对tag进行TEA解密 - Byte[] dat = new Byte[data.Length / 2 - 18]; - Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); - - TEA.decrypt(ref dat, dat.Length); - settings = BitConverter.ToString(dat, 0, dat.Length).Replace("-", "").Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); - } - else - { + // if (routeFlag == "03") + // { + // //对tag进行TEA解密 + // Byte[] dat = new Byte[data.Length / 2 - 18]; + // Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); + // + // TEA.decrypt(ref dat, dat.Length); + // settings = BitConverter.ToString(dat, 0, dat.Length).Replace("-", "").Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); + // } + // else + // { //对tag进行sm4解密 Byte[] dat = new Byte[data.Length / 2 - 18]; Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); String plainText = SM4Utils.sm4Decrypt(dat, deviceId); settings = plainText.Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); - } + // } result = Common.getDeviceTypeByPdu(pduType); diff --git a/SensorHub.Tube/Tube.cs b/SensorHub.Tube/Tube.cs index aa7464c..e8f3f88 100644 --- a/SensorHub.Tube/Tube.cs +++ b/SensorHub.Tube/Tube.cs @@ -191,8 +191,8 @@ } } - //Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { diff --git a/SensorHub.Well/Well.cs b/SensorHub.Well/Well.cs index 3c95b15..22a75ff 100644 --- a/SensorHub.Well/Well.cs +++ b/SensorHub.Well/Well.cs @@ -119,8 +119,8 @@ } } - //Common.sendMessage(session, "Well", devCode, -1, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, -1, null, null, null, eventList, datasList, startupList); + Common.sendMessage(session, "Well", devCode, -1, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, -1, null, null, null, eventList, datasList, startupList); if (source != "433") //433井盖不要求回复 { diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs new file mode 100644 index 0000000..0130a23 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs @@ -0,0 +1,64 @@ +using SensorHub.Servers; +using SensorHub.Servers.Commands.CASICCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideTagHandler : TagHandler + { + public override bool isThisTag(Tag tag) + { + if (!(tag is UploadTag)) + { + return false; + } + + UploadTag uploadTag = tag as UploadTag; + + return uploadTag.BizType == 5 ? true : false; + } + + public override void resolve(Tag tag, CasicSession session) + { + //TODO LIST:解析数据保存数据 + UploadTag hsTag = tag as UploadTag; + Interval = hsTag.CollectInter; + CollecTime = hsTag.CollectTime; + int len = hsTag.Len; + String dataValue = hsTag.DataValue; + + session.Logger.Info("硫化氢浓度数据上传TAG:oid:" + hsTag.Oid + " 采集间隔: " + + Interval + "采集时间:" + CollecTime + "上传数值:" + dataValue); + + DataList = new List(); + int num = len / 4; //上传的硫化氢浓度数据个数 + for (int i = 0; i < num; i++) + { + float density = strHexToFloat(dataValue.Substring(i * 8, 8)); + DataList.Add(density); + } + } + + //转float + private float strHexToFloat(String src) + { + if (src.Length != 8) + return 0; + + byte[] lBt ={ + byte.Parse(src.Substring(0,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(2,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(4,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(6,2),System.Globalization.NumberStyles.HexNumber) + + }; + float ss = BitConverter.ToSingle(lBt, 0); + return ss; + + } + } +} diff --git a/SensorHub.HydrogenSulfide/Program.cs b/SensorHub.HydrogenSulfide/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.HydrogenSulfide/Program.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.PipeWatcher +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1d85286 --- /dev/null +++ b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.HydrogenSulfide")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.HydrogenSulfide")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d51363ce-ee08-4252-ad3a-6aef13b5df81")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj new file mode 100644 index 0000000..7bde57f --- /dev/null +++ b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952} + Library + SensorHub.HydrogenSulfide + SensorHub.HydrogenSulfide + v4.5 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + ..\bin\Newtonsoft.Json.dll + + + ..\bin\SuperSocket.SocketBase.dll + + + + + + + + + + + + + + + + + + {9bf5d683-f4f2-4d3d-8163-edb3c3d6eafc} + SensorHub.Servers + + + {d8f11ed2-b70a-4541-93d0-2508df14d7ab} + SensorHub.Utility + + + + \ No newline at end of file diff --git a/SensorHub.Methane/Methane.cs b/SensorHub.Methane/Methane.cs index a046030..8513d89 100644 --- a/SensorHub.Methane/Methane.cs +++ b/SensorHub.Methane/Methane.cs @@ -191,8 +191,8 @@ } } - //Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { diff --git a/SensorHub.Servers/TelecomReceiveFilter.cs b/SensorHub.Servers/TelecomReceiveFilter.cs index d28a40f..616139d 100644 --- a/SensorHub.Servers/TelecomReceiveFilter.cs +++ b/SensorHub.Servers/TelecomReceiveFilter.cs @@ -82,24 +82,24 @@ } //////////////////////////////////////////////////////////////////////// - if (routeFlag == "03") - { - //对tag进行TEA解密 - Byte[] dat = new Byte[data.Length / 2 - 18]; - Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); - - TEA.decrypt(ref dat, dat.Length); - settings = BitConverter.ToString(dat, 0, dat.Length).Replace("-", "").Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); - } - else - { + // if (routeFlag == "03") + // { + // //对tag进行TEA解密 + // Byte[] dat = new Byte[data.Length / 2 - 18]; + // Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); + // + // TEA.decrypt(ref dat, dat.Length); + // settings = BitConverter.ToString(dat, 0, dat.Length).Replace("-", "").Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); + // } + // else + // { //对tag进行sm4解密 Byte[] dat = new Byte[data.Length / 2 - 18]; Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); String plainText = SM4Utils.sm4Decrypt(dat, deviceId); settings = plainText.Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); - } + // } result = Common.getDeviceTypeByPdu(pduType); diff --git a/SensorHub.Tube/Tube.cs b/SensorHub.Tube/Tube.cs index aa7464c..e8f3f88 100644 --- a/SensorHub.Tube/Tube.cs +++ b/SensorHub.Tube/Tube.cs @@ -191,8 +191,8 @@ } } - //Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { diff --git a/SensorHub.Well/Well.cs b/SensorHub.Well/Well.cs index 3c95b15..22a75ff 100644 --- a/SensorHub.Well/Well.cs +++ b/SensorHub.Well/Well.cs @@ -119,8 +119,8 @@ } } - //Common.sendMessage(session, "Well", devCode, -1, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, -1, null, null, null, eventList, datasList, startupList); + Common.sendMessage(session, "Well", devCode, -1, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, -1, null, null, null, eventList, datasList, startupList); if (source != "433") //433井盖不要求回复 { diff --git a/SensorHub.sln b/SensorHub.sln index 70f3934..01d25af 100644 --- a/SensorHub.sln +++ b/SensorHub.sln @@ -58,6 +58,8 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorHub.WellPlus", "SensorHub.WellPlus\SensorHub.WellPlus.csproj", "{AC7C9615-3528-48C2-B7E1-EC810BD0E4DB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorHub.HydrogenSulfide", "SensorHub.HydrogenSulfide\SensorHub.HydrogenSulfide.csproj", "{37BE668E-8F6E-4045-8875-8E7D4EE6D952}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -355,6 +357,18 @@ {AC7C9615-3528-48C2-B7E1-EC810BD0E4DB}.Release|Mixed Platforms.Build.0 = Release|Any CPU {AC7C9615-3528-48C2-B7E1-EC810BD0E4DB}.Release|x86.ActiveCfg = Release|Any CPU {AC7C9615-3528-48C2-B7E1-EC810BD0E4DB}.Release|x86.Build.0 = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|x86.ActiveCfg = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|x86.Build.0 = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|Any CPU.Build.0 = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|x86.ActiveCfg = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SensorHub.HydrogenSulfide/App.config b/SensorHub.HydrogenSulfide/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.HydrogenSulfide/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfide.cs b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs new file mode 100644 index 0000000..8691d2f --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfide.cs @@ -0,0 +1,223 @@ +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; + +namespace SensorHub.HydrogenSulfide +{ + public class HydrogenSulfide : CommandBase + { + 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 exist = requestInfo.Parameters[10]; + + String devName = "HydrogenSulfide"; + + 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); + + byte[] btPdu = new byte[2]; //2个字节 + btPdu[0] = Common.getRespOperType(operType, source == "433" ? true : false); + btPdu[1] = 0x9E; // 最高位=1表示不拆包; 0x1E = 30 表示设备类型=30 + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "HydrogenSulfide"); + return; + } + + //获取电量信息,系统时间,传递给对应的handler + List tags = Common.getTags(settings, session); + + //具体业务处理 + String collectDate = ""; + int cell = -1; + int? pci = null; + int? rsrp = null; + int? snr = null; + + String softwareVersion = ""; + uint offset = 0; + uint size = 0; + + List eventList = new List(); + List datasList = new List(); + List startupList = new List(); + + foreach (Tag tag in tags) + { + if (!(tag is UploadTag)) + { + //非业务处理 + if (tag != null && tag is CellTag) + { + CellTag cellTag = (CellTag)tag; + cell = cellTag.Cell; + 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 SystemDateTag) + { + SystemDateTag systemDateTag = (SystemDateTag)tag; + collectDate = systemDateTag.CollectDate; + continue; + } + + if (tag != null && tag is SensorException0Tag) + { + SensorException0Tag sensorException0 = tag as SensorException0Tag; + int state = sensorException0.state; + + if (state == 0) continue; + + eventList.Add(getHydrogenSulfideAlarm(state)); + + 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; + } + + //非业务处理 + 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 5: + //气体浓度 + TagHandler pWatcherHandler = new HydrogenSulfideTagHandler(); + pWatcherHandler.resolve(tag, session); + + DateTime baseTime = Convert.ToDateTime(collectDate + " " + pWatcherHandler.CollecTime); + for (int i = 0; i < pWatcherHandler.DataList.Count; i++) + { + DateTime upTime = baseTime.AddMinutes(i * pWatcherHandler.Interval); + String uptime = upTime.ToString("yyyy") + upTime.ToString("MM") + upTime.ToString("dd") + + upTime.ToString("HH") + upTime.ToString("mm") + upTime.ToString("ss"); + + datasList.Add(new HydrogenSulfideDatasJson(uptime, (float)pWatcherHandler.DataList[i])); + } + + break; + default: + session.Logger.Info("未知业务类型!"); + break; + } + } + } + + // Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + + if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 + { + Common.remoteUpgrade(session, operType, devName, devCode, btPdu, softwareVersion, size, offset, source); + return; + } + } + + Common.sendConfig(session, devCode, routeFlag, source, btPdu); + } + + private String getHydrogenSulfideAlarm(int state) + { + switch (state) + { + case 0: + return "HydrogenSulfideNormal";// 硫化氢正常 + case 1: + return "HydrogenSulfideCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "HydrogenSulfideError"; // 硫化氢传感器异常 + default: + return "HydrogenSulfideUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs new file mode 100644 index 0000000..8160915 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideDatasJson.cs @@ -0,0 +1,20 @@ +using SensorHub.Servers.JsonFormat; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideDatasJson : DatasJson + { + public float hs { get; set; } // 硫化氢气体浓度值 + + public HydrogenSulfideDatasJson(string uptime, float hs) + { + this.uptime = uptime; + this.hs = hs; + } + } +} diff --git a/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs new file mode 100644 index 0000000..0130a23 --- /dev/null +++ b/SensorHub.HydrogenSulfide/HydrogenSulfideTagHandler.cs @@ -0,0 +1,64 @@ +using SensorHub.Servers; +using SensorHub.Servers.Commands.CASICCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.HydrogenSulfide +{ + class HydrogenSulfideTagHandler : TagHandler + { + public override bool isThisTag(Tag tag) + { + if (!(tag is UploadTag)) + { + return false; + } + + UploadTag uploadTag = tag as UploadTag; + + return uploadTag.BizType == 5 ? true : false; + } + + public override void resolve(Tag tag, CasicSession session) + { + //TODO LIST:解析数据保存数据 + UploadTag hsTag = tag as UploadTag; + Interval = hsTag.CollectInter; + CollecTime = hsTag.CollectTime; + int len = hsTag.Len; + String dataValue = hsTag.DataValue; + + session.Logger.Info("硫化氢浓度数据上传TAG:oid:" + hsTag.Oid + " 采集间隔: " + + Interval + "采集时间:" + CollecTime + "上传数值:" + dataValue); + + DataList = new List(); + int num = len / 4; //上传的硫化氢浓度数据个数 + for (int i = 0; i < num; i++) + { + float density = strHexToFloat(dataValue.Substring(i * 8, 8)); + DataList.Add(density); + } + } + + //转float + private float strHexToFloat(String src) + { + if (src.Length != 8) + return 0; + + byte[] lBt ={ + byte.Parse(src.Substring(0,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(2,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(4,2),System.Globalization.NumberStyles.HexNumber), + byte.Parse(src.Substring(6,2),System.Globalization.NumberStyles.HexNumber) + + }; + float ss = BitConverter.ToSingle(lBt, 0); + return ss; + + } + } +} diff --git a/SensorHub.HydrogenSulfide/Program.cs b/SensorHub.HydrogenSulfide/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.HydrogenSulfide/Program.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SensorHub.PipeWatcher +{ + class Program + { + static void Main(string[] args) + { + } + } +} diff --git a/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1d85286 --- /dev/null +++ b/SensorHub.HydrogenSulfide/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.HydrogenSulfide")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.HydrogenSulfide")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d51363ce-ee08-4252-ad3a-6aef13b5df81")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj new file mode 100644 index 0000000..7bde57f --- /dev/null +++ b/SensorHub.HydrogenSulfide/SensorHub.HydrogenSulfide.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952} + Library + SensorHub.HydrogenSulfide + SensorHub.HydrogenSulfide + v4.5 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + ..\bin\Newtonsoft.Json.dll + + + ..\bin\SuperSocket.SocketBase.dll + + + + + + + + + + + + + + + + + + {9bf5d683-f4f2-4d3d-8163-edb3c3d6eafc} + SensorHub.Servers + + + {d8f11ed2-b70a-4541-93d0-2508df14d7ab} + SensorHub.Utility + + + + \ No newline at end of file diff --git a/SensorHub.Methane/Methane.cs b/SensorHub.Methane/Methane.cs index a046030..8513d89 100644 --- a/SensorHub.Methane/Methane.cs +++ b/SensorHub.Methane/Methane.cs @@ -191,8 +191,8 @@ } } - //Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { diff --git a/SensorHub.Servers/TelecomReceiveFilter.cs b/SensorHub.Servers/TelecomReceiveFilter.cs index d28a40f..616139d 100644 --- a/SensorHub.Servers/TelecomReceiveFilter.cs +++ b/SensorHub.Servers/TelecomReceiveFilter.cs @@ -82,24 +82,24 @@ } //////////////////////////////////////////////////////////////////////// - if (routeFlag == "03") - { - //对tag进行TEA解密 - Byte[] dat = new Byte[data.Length / 2 - 18]; - Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); - - TEA.decrypt(ref dat, dat.Length); - settings = BitConverter.ToString(dat, 0, dat.Length).Replace("-", "").Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); - } - else - { + // if (routeFlag == "03") + // { + // //对tag进行TEA解密 + // Byte[] dat = new Byte[data.Length / 2 - 18]; + // Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); + // + // TEA.decrypt(ref dat, dat.Length); + // settings = BitConverter.ToString(dat, 0, dat.Length).Replace("-", "").Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); + // } + // else + // { //对tag进行sm4解密 Byte[] dat = new Byte[data.Length / 2 - 18]; Array.Copy(src, 16, dat, 0, data.Length / 2 - 18); String plainText = SM4Utils.sm4Decrypt(dat, deviceId); settings = plainText.Substring(0, Convert.ToInt32(leng, 16) * 2 - 12 * 2); - } + // } result = Common.getDeviceTypeByPdu(pduType); diff --git a/SensorHub.Tube/Tube.cs b/SensorHub.Tube/Tube.cs index aa7464c..e8f3f88 100644 --- a/SensorHub.Tube/Tube.cs +++ b/SensorHub.Tube/Tube.cs @@ -191,8 +191,8 @@ } } - //Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + Common.sendMessage(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, cell, pci, rsrp, snr, eventList, datasList, startupList); if (softwareVersion != "" || size != 0 || offset != 0)//进入远程升级流程 { diff --git a/SensorHub.Well/Well.cs b/SensorHub.Well/Well.cs index 3c95b15..22a75ff 100644 --- a/SensorHub.Well/Well.cs +++ b/SensorHub.Well/Well.cs @@ -119,8 +119,8 @@ } } - //Common.sendMessage(session, "Well", devCode, -1, eventList, datasList, startupList); - Common.kafkaProduce(session, devName, devCode, -1, null, null, null, eventList, datasList, startupList); + Common.sendMessage(session, "Well", devCode, -1, eventList, datasList, startupList); + // Common.kafkaProduce(session, devName, devCode, -1, null, null, null, eventList, datasList, startupList); if (source != "433") //433井盖不要求回复 { diff --git a/SensorHub.sln b/SensorHub.sln index 70f3934..01d25af 100644 --- a/SensorHub.sln +++ b/SensorHub.sln @@ -58,6 +58,8 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorHub.WellPlus", "SensorHub.WellPlus\SensorHub.WellPlus.csproj", "{AC7C9615-3528-48C2-B7E1-EC810BD0E4DB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorHub.HydrogenSulfide", "SensorHub.HydrogenSulfide\SensorHub.HydrogenSulfide.csproj", "{37BE668E-8F6E-4045-8875-8E7D4EE6D952}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -355,6 +357,18 @@ {AC7C9615-3528-48C2-B7E1-EC810BD0E4DB}.Release|Mixed Platforms.Build.0 = Release|Any CPU {AC7C9615-3528-48C2-B7E1-EC810BD0E4DB}.Release|x86.ActiveCfg = Release|Any CPU {AC7C9615-3528-48C2-B7E1-EC810BD0E4DB}.Release|x86.Build.0 = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|x86.ActiveCfg = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Debug|x86.Build.0 = Debug|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|Any CPU.Build.0 = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|x86.ActiveCfg = Release|Any CPU + {37BE668E-8F6E-4045-8875-8E7D4EE6D952}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TestClass/App.config b/TestClass/App.config index dfa376d..2757ed8 100644 --- a/TestClass/App.config +++ b/TestClass/App.config @@ -154,33 +154,35 @@ + - - - - + + + + - + - - - - - - - - + + + + + + + + - - - - + + + + - + +