diff --git a/SensorHub.Servers/CasicReceiveFilter.cs b/SensorHub.Servers/CasicReceiveFilter.cs index 13de06c..6b270ce 100644 --- a/SensorHub.Servers/CasicReceiveFilter.cs +++ b/SensorHub.Servers/CasicReceiveFilter.cs @@ -59,6 +59,7 @@ String pduType = data.Substring(26, 4); String seq = data.Substring(30, 2); String source = "OTHER"; + String exist = "0"; //数据缓存 0:不存在,1:存在 //对tag进行TEA解密 Byte[] dat = new Byte[data.Length / 2 - 18]; @@ -70,7 +71,7 @@ result = Common.getDeviceTypeByPdu(pduType); result += ":" + preamble + "," + version + "," + leng + "," + deviceId + "," + routeFlag + "," + dstNodeAddr + "," + pduType + "," + - seq + "," + settings + "," + source; + seq + "," + settings + "," + source + "," + exist; } BasicRequestInfoParser m_Parser = new BasicRequestInfoParser(":", ","); return m_Parser.ParseRequestInfo(result); diff --git a/SensorHub.Servers/CasicReceiveFilter.cs b/SensorHub.Servers/CasicReceiveFilter.cs index 13de06c..6b270ce 100644 --- a/SensorHub.Servers/CasicReceiveFilter.cs +++ b/SensorHub.Servers/CasicReceiveFilter.cs @@ -59,6 +59,7 @@ String pduType = data.Substring(26, 4); String seq = data.Substring(30, 2); String source = "OTHER"; + String exist = "0"; //数据缓存 0:不存在,1:存在 //对tag进行TEA解密 Byte[] dat = new Byte[data.Length / 2 - 18]; @@ -70,7 +71,7 @@ result = Common.getDeviceTypeByPdu(pduType); result += ":" + preamble + "," + version + "," + leng + "," + deviceId + "," + routeFlag + "," + dstNodeAddr + "," + pduType + "," + - seq + "," + settings + "," + source; + seq + "," + settings + "," + source + "," + exist; } BasicRequestInfoParser m_Parser = new BasicRequestInfoParser(":", ","); return m_Parser.ParseRequestInfo(result); diff --git a/SensorHub.Tube/App.config b/SensorHub.Tube/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.Tube/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.Servers/CasicReceiveFilter.cs b/SensorHub.Servers/CasicReceiveFilter.cs index 13de06c..6b270ce 100644 --- a/SensorHub.Servers/CasicReceiveFilter.cs +++ b/SensorHub.Servers/CasicReceiveFilter.cs @@ -59,6 +59,7 @@ String pduType = data.Substring(26, 4); String seq = data.Substring(30, 2); String source = "OTHER"; + String exist = "0"; //数据缓存 0:不存在,1:存在 //对tag进行TEA解密 Byte[] dat = new Byte[data.Length / 2 - 18]; @@ -70,7 +71,7 @@ result = Common.getDeviceTypeByPdu(pduType); result += ":" + preamble + "," + version + "," + leng + "," + deviceId + "," + routeFlag + "," + dstNodeAddr + "," + pduType + "," + - seq + "," + settings + "," + source; + seq + "," + settings + "," + source + "," + exist; } BasicRequestInfoParser m_Parser = new BasicRequestInfoParser(":", ","); return m_Parser.ParseRequestInfo(result); diff --git a/SensorHub.Tube/App.config b/SensorHub.Tube/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.Tube/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.Tube/Program.cs b/SensorHub.Tube/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.Tube/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.Servers/CasicReceiveFilter.cs b/SensorHub.Servers/CasicReceiveFilter.cs index 13de06c..6b270ce 100644 --- a/SensorHub.Servers/CasicReceiveFilter.cs +++ b/SensorHub.Servers/CasicReceiveFilter.cs @@ -59,6 +59,7 @@ String pduType = data.Substring(26, 4); String seq = data.Substring(30, 2); String source = "OTHER"; + String exist = "0"; //数据缓存 0:不存在,1:存在 //对tag进行TEA解密 Byte[] dat = new Byte[data.Length / 2 - 18]; @@ -70,7 +71,7 @@ result = Common.getDeviceTypeByPdu(pduType); result += ":" + preamble + "," + version + "," + leng + "," + deviceId + "," + routeFlag + "," + dstNodeAddr + "," + pduType + "," + - seq + "," + settings + "," + source; + seq + "," + settings + "," + source + "," + exist; } BasicRequestInfoParser m_Parser = new BasicRequestInfoParser(":", ","); return m_Parser.ParseRequestInfo(result); diff --git a/SensorHub.Tube/App.config b/SensorHub.Tube/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.Tube/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.Tube/Program.cs b/SensorHub.Tube/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.Tube/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.Tube/Properties/AssemblyInfo.cs b/SensorHub.Tube/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c3706dc --- /dev/null +++ b/SensorHub.Tube/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.Tube")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.Tube")] +[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.Servers/CasicReceiveFilter.cs b/SensorHub.Servers/CasicReceiveFilter.cs index 13de06c..6b270ce 100644 --- a/SensorHub.Servers/CasicReceiveFilter.cs +++ b/SensorHub.Servers/CasicReceiveFilter.cs @@ -59,6 +59,7 @@ String pduType = data.Substring(26, 4); String seq = data.Substring(30, 2); String source = "OTHER"; + String exist = "0"; //数据缓存 0:不存在,1:存在 //对tag进行TEA解密 Byte[] dat = new Byte[data.Length / 2 - 18]; @@ -70,7 +71,7 @@ result = Common.getDeviceTypeByPdu(pduType); result += ":" + preamble + "," + version + "," + leng + "," + deviceId + "," + routeFlag + "," + dstNodeAddr + "," + pduType + "," + - seq + "," + settings + "," + source; + seq + "," + settings + "," + source + "," + exist; } BasicRequestInfoParser m_Parser = new BasicRequestInfoParser(":", ","); return m_Parser.ParseRequestInfo(result); diff --git a/SensorHub.Tube/App.config b/SensorHub.Tube/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.Tube/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.Tube/Program.cs b/SensorHub.Tube/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.Tube/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.Tube/Properties/AssemblyInfo.cs b/SensorHub.Tube/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c3706dc --- /dev/null +++ b/SensorHub.Tube/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.Tube")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.Tube")] +[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.Tube/SensorHub.Tube.csproj b/SensorHub.Tube/SensorHub.Tube.csproj new file mode 100644 index 0000000..a1c0b1b --- /dev/null +++ b/SensorHub.Tube/SensorHub.Tube.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81} + Library + SensorHub.Tube + SensorHub.Tube + 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.Servers/CasicReceiveFilter.cs b/SensorHub.Servers/CasicReceiveFilter.cs index 13de06c..6b270ce 100644 --- a/SensorHub.Servers/CasicReceiveFilter.cs +++ b/SensorHub.Servers/CasicReceiveFilter.cs @@ -59,6 +59,7 @@ String pduType = data.Substring(26, 4); String seq = data.Substring(30, 2); String source = "OTHER"; + String exist = "0"; //数据缓存 0:不存在,1:存在 //对tag进行TEA解密 Byte[] dat = new Byte[data.Length / 2 - 18]; @@ -70,7 +71,7 @@ result = Common.getDeviceTypeByPdu(pduType); result += ":" + preamble + "," + version + "," + leng + "," + deviceId + "," + routeFlag + "," + dstNodeAddr + "," + pduType + "," + - seq + "," + settings + "," + source; + seq + "," + settings + "," + source + "," + exist; } BasicRequestInfoParser m_Parser = new BasicRequestInfoParser(":", ","); return m_Parser.ParseRequestInfo(result); diff --git a/SensorHub.Tube/App.config b/SensorHub.Tube/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.Tube/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.Tube/Program.cs b/SensorHub.Tube/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.Tube/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.Tube/Properties/AssemblyInfo.cs b/SensorHub.Tube/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c3706dc --- /dev/null +++ b/SensorHub.Tube/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.Tube")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.Tube")] +[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.Tube/SensorHub.Tube.csproj b/SensorHub.Tube/SensorHub.Tube.csproj new file mode 100644 index 0000000..a1c0b1b --- /dev/null +++ b/SensorHub.Tube/SensorHub.Tube.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81} + Library + SensorHub.Tube + SensorHub.Tube + 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.Tube/Tube.cs b/SensorHub.Tube/Tube.cs new file mode 100644 index 0000000..aa7464c --- /dev/null +++ b/SensorHub.Tube/Tube.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.Tube +{ + public class Tube : 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 = "Tube"; + + 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] = 0x9C; + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "Tube"); + 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(getTubeAlarm(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 TubeTagHandler(); + 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 TubeDatasJson(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 getTubeAlarm(int state) + { + switch (state) + { + case 0: + return "TubeNormal";// 管盯正常 + case 1: + return "TubeCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "TubeError"; // 管盯传感器异常 + default: + return "TubeUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.Servers/CasicReceiveFilter.cs b/SensorHub.Servers/CasicReceiveFilter.cs index 13de06c..6b270ce 100644 --- a/SensorHub.Servers/CasicReceiveFilter.cs +++ b/SensorHub.Servers/CasicReceiveFilter.cs @@ -59,6 +59,7 @@ String pduType = data.Substring(26, 4); String seq = data.Substring(30, 2); String source = "OTHER"; + String exist = "0"; //数据缓存 0:不存在,1:存在 //对tag进行TEA解密 Byte[] dat = new Byte[data.Length / 2 - 18]; @@ -70,7 +71,7 @@ result = Common.getDeviceTypeByPdu(pduType); result += ":" + preamble + "," + version + "," + leng + "," + deviceId + "," + routeFlag + "," + dstNodeAddr + "," + pduType + "," + - seq + "," + settings + "," + source; + seq + "," + settings + "," + source + "," + exist; } BasicRequestInfoParser m_Parser = new BasicRequestInfoParser(":", ","); return m_Parser.ParseRequestInfo(result); diff --git a/SensorHub.Tube/App.config b/SensorHub.Tube/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.Tube/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.Tube/Program.cs b/SensorHub.Tube/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.Tube/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.Tube/Properties/AssemblyInfo.cs b/SensorHub.Tube/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c3706dc --- /dev/null +++ b/SensorHub.Tube/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.Tube")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.Tube")] +[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.Tube/SensorHub.Tube.csproj b/SensorHub.Tube/SensorHub.Tube.csproj new file mode 100644 index 0000000..a1c0b1b --- /dev/null +++ b/SensorHub.Tube/SensorHub.Tube.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81} + Library + SensorHub.Tube + SensorHub.Tube + 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.Tube/Tube.cs b/SensorHub.Tube/Tube.cs new file mode 100644 index 0000000..aa7464c --- /dev/null +++ b/SensorHub.Tube/Tube.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.Tube +{ + public class Tube : 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 = "Tube"; + + 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] = 0x9C; + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "Tube"); + 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(getTubeAlarm(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 TubeTagHandler(); + 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 TubeDatasJson(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 getTubeAlarm(int state) + { + switch (state) + { + case 0: + return "TubeNormal";// 管盯正常 + case 1: + return "TubeCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "TubeError"; // 管盯传感器异常 + default: + return "TubeUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.Tube/TubeDatasJson.cs b/SensorHub.Tube/TubeDatasJson.cs new file mode 100644 index 0000000..11c292f --- /dev/null +++ b/SensorHub.Tube/TubeDatasJson.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.Tube +{ + class TubeDatasJson : DatasJson + { + public float gas { get; set; } // 燃气浓度值 + + public TubeDatasJson(string uptime, float gas) + { + this.uptime = uptime; + this.gas = gas; + } + } +} diff --git a/SensorHub.Servers/CasicReceiveFilter.cs b/SensorHub.Servers/CasicReceiveFilter.cs index 13de06c..6b270ce 100644 --- a/SensorHub.Servers/CasicReceiveFilter.cs +++ b/SensorHub.Servers/CasicReceiveFilter.cs @@ -59,6 +59,7 @@ String pduType = data.Substring(26, 4); String seq = data.Substring(30, 2); String source = "OTHER"; + String exist = "0"; //数据缓存 0:不存在,1:存在 //对tag进行TEA解密 Byte[] dat = new Byte[data.Length / 2 - 18]; @@ -70,7 +71,7 @@ result = Common.getDeviceTypeByPdu(pduType); result += ":" + preamble + "," + version + "," + leng + "," + deviceId + "," + routeFlag + "," + dstNodeAddr + "," + pduType + "," + - seq + "," + settings + "," + source; + seq + "," + settings + "," + source + "," + exist; } BasicRequestInfoParser m_Parser = new BasicRequestInfoParser(":", ","); return m_Parser.ParseRequestInfo(result); diff --git a/SensorHub.Tube/App.config b/SensorHub.Tube/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.Tube/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.Tube/Program.cs b/SensorHub.Tube/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.Tube/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.Tube/Properties/AssemblyInfo.cs b/SensorHub.Tube/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c3706dc --- /dev/null +++ b/SensorHub.Tube/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.Tube")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.Tube")] +[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.Tube/SensorHub.Tube.csproj b/SensorHub.Tube/SensorHub.Tube.csproj new file mode 100644 index 0000000..a1c0b1b --- /dev/null +++ b/SensorHub.Tube/SensorHub.Tube.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81} + Library + SensorHub.Tube + SensorHub.Tube + 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.Tube/Tube.cs b/SensorHub.Tube/Tube.cs new file mode 100644 index 0000000..aa7464c --- /dev/null +++ b/SensorHub.Tube/Tube.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.Tube +{ + public class Tube : 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 = "Tube"; + + 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] = 0x9C; + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "Tube"); + 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(getTubeAlarm(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 TubeTagHandler(); + 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 TubeDatasJson(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 getTubeAlarm(int state) + { + switch (state) + { + case 0: + return "TubeNormal";// 管盯正常 + case 1: + return "TubeCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "TubeError"; // 管盯传感器异常 + default: + return "TubeUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.Tube/TubeDatasJson.cs b/SensorHub.Tube/TubeDatasJson.cs new file mode 100644 index 0000000..11c292f --- /dev/null +++ b/SensorHub.Tube/TubeDatasJson.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.Tube +{ + class TubeDatasJson : DatasJson + { + public float gas { get; set; } // 燃气浓度值 + + public TubeDatasJson(string uptime, float gas) + { + this.uptime = uptime; + this.gas = gas; + } + } +} diff --git a/SensorHub.Tube/TubeTagHandler.cs b/SensorHub.Tube/TubeTagHandler.cs new file mode 100644 index 0000000..eb5c48a --- /dev/null +++ b/SensorHub.Tube/TubeTagHandler.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.Tube +{ + class TubeTagHandler : 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 rqTag = tag as UploadTag; + Interval = rqTag.CollectInter; + CollecTime = rqTag.CollectTime; + int len = rqTag.Len; + String dataValue = rqTag.DataValue; + + session.Logger.Info("管盯燃气数据上传TAG:oid:" + rqTag.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.Servers/CasicReceiveFilter.cs b/SensorHub.Servers/CasicReceiveFilter.cs index 13de06c..6b270ce 100644 --- a/SensorHub.Servers/CasicReceiveFilter.cs +++ b/SensorHub.Servers/CasicReceiveFilter.cs @@ -59,6 +59,7 @@ String pduType = data.Substring(26, 4); String seq = data.Substring(30, 2); String source = "OTHER"; + String exist = "0"; //数据缓存 0:不存在,1:存在 //对tag进行TEA解密 Byte[] dat = new Byte[data.Length / 2 - 18]; @@ -70,7 +71,7 @@ result = Common.getDeviceTypeByPdu(pduType); result += ":" + preamble + "," + version + "," + leng + "," + deviceId + "," + routeFlag + "," + dstNodeAddr + "," + pduType + "," + - seq + "," + settings + "," + source; + seq + "," + settings + "," + source + "," + exist; } BasicRequestInfoParser m_Parser = new BasicRequestInfoParser(":", ","); return m_Parser.ParseRequestInfo(result); diff --git a/SensorHub.Tube/App.config b/SensorHub.Tube/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.Tube/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.Tube/Program.cs b/SensorHub.Tube/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.Tube/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.Tube/Properties/AssemblyInfo.cs b/SensorHub.Tube/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c3706dc --- /dev/null +++ b/SensorHub.Tube/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.Tube")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.Tube")] +[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.Tube/SensorHub.Tube.csproj b/SensorHub.Tube/SensorHub.Tube.csproj new file mode 100644 index 0000000..a1c0b1b --- /dev/null +++ b/SensorHub.Tube/SensorHub.Tube.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81} + Library + SensorHub.Tube + SensorHub.Tube + 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.Tube/Tube.cs b/SensorHub.Tube/Tube.cs new file mode 100644 index 0000000..aa7464c --- /dev/null +++ b/SensorHub.Tube/Tube.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.Tube +{ + public class Tube : 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 = "Tube"; + + 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] = 0x9C; + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "Tube"); + 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(getTubeAlarm(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 TubeTagHandler(); + 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 TubeDatasJson(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 getTubeAlarm(int state) + { + switch (state) + { + case 0: + return "TubeNormal";// 管盯正常 + case 1: + return "TubeCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "TubeError"; // 管盯传感器异常 + default: + return "TubeUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.Tube/TubeDatasJson.cs b/SensorHub.Tube/TubeDatasJson.cs new file mode 100644 index 0000000..11c292f --- /dev/null +++ b/SensorHub.Tube/TubeDatasJson.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.Tube +{ + class TubeDatasJson : DatasJson + { + public float gas { get; set; } // 燃气浓度值 + + public TubeDatasJson(string uptime, float gas) + { + this.uptime = uptime; + this.gas = gas; + } + } +} diff --git a/SensorHub.Tube/TubeTagHandler.cs b/SensorHub.Tube/TubeTagHandler.cs new file mode 100644 index 0000000..eb5c48a --- /dev/null +++ b/SensorHub.Tube/TubeTagHandler.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.Tube +{ + class TubeTagHandler : 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 rqTag = tag as UploadTag; + Interval = rqTag.CollectInter; + CollecTime = rqTag.CollectTime; + int len = rqTag.Len; + String dataValue = rqTag.DataValue; + + session.Logger.Info("管盯燃气数据上传TAG:oid:" + rqTag.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.sln b/SensorHub.sln index bf3d7bc..c942047 100644 --- a/SensorHub.sln +++ b/SensorHub.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31410.357 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorHub.Utility", "SensorHub.Utility\SensorHub.Utility.csproj", "{D8F11ED2-B70A-4541-93D0-2508DF14D7AB}" EndProject @@ -54,6 +54,8 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorHub.LampNBServer", "SensorHub.LampNB\SensorHub.LampNBServer.csproj", "{F9882CDD-522D-4493-9C90-6FEE56B0C00F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorHub.Tube", "SensorHub.Tube\SensorHub.Tube.csproj", "{D51363CE-EE08-4252-AD3A-6AEF13B5DF81}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -327,8 +329,23 @@ {F9882CDD-522D-4493-9C90-6FEE56B0C00F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {F9882CDD-522D-4493-9C90-6FEE56B0C00F}.Release|Mixed Platforms.Build.0 = Release|Any CPU {F9882CDD-522D-4493-9C90-6FEE56B0C00F}.Release|x86.ActiveCfg = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|x86.ActiveCfg = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|x86.Build.0 = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|Any CPU.Build.0 = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|x86.ActiveCfg = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {028CE286-6748-49A0-A53D-822675D009D8} + EndGlobalSection EndGlobal diff --git a/SensorHub.Servers/CasicReceiveFilter.cs b/SensorHub.Servers/CasicReceiveFilter.cs index 13de06c..6b270ce 100644 --- a/SensorHub.Servers/CasicReceiveFilter.cs +++ b/SensorHub.Servers/CasicReceiveFilter.cs @@ -59,6 +59,7 @@ String pduType = data.Substring(26, 4); String seq = data.Substring(30, 2); String source = "OTHER"; + String exist = "0"; //数据缓存 0:不存在,1:存在 //对tag进行TEA解密 Byte[] dat = new Byte[data.Length / 2 - 18]; @@ -70,7 +71,7 @@ result = Common.getDeviceTypeByPdu(pduType); result += ":" + preamble + "," + version + "," + leng + "," + deviceId + "," + routeFlag + "," + dstNodeAddr + "," + pduType + "," + - seq + "," + settings + "," + source; + seq + "," + settings + "," + source + "," + exist; } BasicRequestInfoParser m_Parser = new BasicRequestInfoParser(":", ","); return m_Parser.ParseRequestInfo(result); diff --git a/SensorHub.Tube/App.config b/SensorHub.Tube/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/SensorHub.Tube/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SensorHub.Tube/Program.cs b/SensorHub.Tube/Program.cs new file mode 100644 index 0000000..e85152b --- /dev/null +++ b/SensorHub.Tube/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.Tube/Properties/AssemblyInfo.cs b/SensorHub.Tube/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c3706dc --- /dev/null +++ b/SensorHub.Tube/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("SensorHub.Tube")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SensorHub.Tube")] +[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.Tube/SensorHub.Tube.csproj b/SensorHub.Tube/SensorHub.Tube.csproj new file mode 100644 index 0000000..a1c0b1b --- /dev/null +++ b/SensorHub.Tube/SensorHub.Tube.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81} + Library + SensorHub.Tube + SensorHub.Tube + 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.Tube/Tube.cs b/SensorHub.Tube/Tube.cs new file mode 100644 index 0000000..aa7464c --- /dev/null +++ b/SensorHub.Tube/Tube.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.Tube +{ + public class Tube : 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 = "Tube"; + + 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] = 0x9C; + + if (exist == "0")//数据没有缓存 + { + //判断是返回的设置确认数据帧, 回复第三方 + if (operType == "SetResponse") + { + Common.sendSetResponse(session, devCode, "Tube"); + 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(getTubeAlarm(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 TubeTagHandler(); + 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 TubeDatasJson(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 getTubeAlarm(int state) + { + switch (state) + { + case 0: + return "TubeNormal";// 管盯正常 + case 1: + return "TubeCommunicationFailure"; // 传感器通信失败 采集失败 + case 2: + return "TubeError"; // 管盯传感器异常 + default: + return "TubeUnknown"; // 管盯未知异常 + + } + } + } +} diff --git a/SensorHub.Tube/TubeDatasJson.cs b/SensorHub.Tube/TubeDatasJson.cs new file mode 100644 index 0000000..11c292f --- /dev/null +++ b/SensorHub.Tube/TubeDatasJson.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.Tube +{ + class TubeDatasJson : DatasJson + { + public float gas { get; set; } // 燃气浓度值 + + public TubeDatasJson(string uptime, float gas) + { + this.uptime = uptime; + this.gas = gas; + } + } +} diff --git a/SensorHub.Tube/TubeTagHandler.cs b/SensorHub.Tube/TubeTagHandler.cs new file mode 100644 index 0000000..eb5c48a --- /dev/null +++ b/SensorHub.Tube/TubeTagHandler.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.Tube +{ + class TubeTagHandler : 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 rqTag = tag as UploadTag; + Interval = rqTag.CollectInter; + CollecTime = rqTag.CollectTime; + int len = rqTag.Len; + String dataValue = rqTag.DataValue; + + session.Logger.Info("管盯燃气数据上传TAG:oid:" + rqTag.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.sln b/SensorHub.sln index bf3d7bc..c942047 100644 --- a/SensorHub.sln +++ b/SensorHub.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31410.357 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorHub.Utility", "SensorHub.Utility\SensorHub.Utility.csproj", "{D8F11ED2-B70A-4541-93D0-2508DF14D7AB}" EndProject @@ -54,6 +54,8 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorHub.LampNBServer", "SensorHub.LampNB\SensorHub.LampNBServer.csproj", "{F9882CDD-522D-4493-9C90-6FEE56B0C00F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorHub.Tube", "SensorHub.Tube\SensorHub.Tube.csproj", "{D51363CE-EE08-4252-AD3A-6AEF13B5DF81}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -327,8 +329,23 @@ {F9882CDD-522D-4493-9C90-6FEE56B0C00F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {F9882CDD-522D-4493-9C90-6FEE56B0C00F}.Release|Mixed Platforms.Build.0 = Release|Any CPU {F9882CDD-522D-4493-9C90-6FEE56B0C00F}.Release|x86.ActiveCfg = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|x86.ActiveCfg = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Debug|x86.Build.0 = Debug|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|Any CPU.Build.0 = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|x86.ActiveCfg = Release|Any CPU + {D51363CE-EE08-4252-AD3A-6AEF13B5DF81}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {028CE286-6748-49A0-A53D-822675D009D8} + EndGlobalSection EndGlobal diff --git a/TestClass/App.config b/TestClass/App.config index c8dc165..bd32d7c 100644 --- a/TestClass/App.config +++ b/TestClass/App.config @@ -30,6 +30,7 @@ + @@ -50,6 +51,7 @@ + @@ -148,6 +150,7 @@ + @@ -156,6 +159,7 @@ +