diff --git a/src/JT809.DotNetty.Abstractions/Dtos/JT809SystemCollectInfoDto.cs b/src/JT809.DotNetty.Abstractions/Dtos/JT809SystemCollectInfoDto.cs
new file mode 100644
index 0000000..9dbb411
--- /dev/null
+++ b/src/JT809.DotNetty.Abstractions/Dtos/JT809SystemCollectInfoDto.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace JT809.DotNetty.Abstractions.Dtos
+{
+ public class JT809SystemCollectInfoDto
+ {
+ ///
+ /// 进程Id
+ ///
+ public int ProcessId { get; set; }
+ ///
+ /// 进程分配内存
+ /// 单位MB
+ ///
+ public double WorkingSet64 { get; set; }
+ ///
+ /// 进程分配内存峰值
+ /// 单位MB
+ ///
+ public double PeakWorkingSet64 { get; set; }
+ ///
+ /// 进程分配私有内存
+ /// 单位MB
+ ///
+ public double PrivateMemorySize64 { get; set; }
+ ///
+ /// 进程执行CPU总处理时间
+ ///
+ public TimeSpan CPUTotalProcessorTime { get; set; }
+ }
+}
diff --git a/src/JT809.DotNetty.Abstractions/IJT809SessionPublishing.cs b/src/JT809.DotNetty.Abstractions/IJT809SessionPublishing.cs
new file mode 100644
index 0000000..c86f05e
--- /dev/null
+++ b/src/JT809.DotNetty.Abstractions/IJT809SessionPublishing.cs
@@ -0,0 +1,12 @@
+using System.Threading.Tasks;
+
+namespace JT809.DotNetty.Abstractions
+{
+ ///
+ /// 会话通知(在线/离线)
+ ///
+ public interface IJT809SessionPublishing
+ {
+ Task PublishAsync(string topicName, string value);
+ }
+}
diff --git a/src/JT809.DotNetty.Abstractions/JT809.DotNetty.Abstractions.csproj b/src/JT809.DotNetty.Abstractions/JT809.DotNetty.Abstractions.csproj
new file mode 100644
index 0000000..9f5c4f4
--- /dev/null
+++ b/src/JT809.DotNetty.Abstractions/JT809.DotNetty.Abstractions.csproj
@@ -0,0 +1,7 @@
+
+
+
+ netstandard2.0
+
+
+
diff --git a/src/JT809.DotNetty.Abstractions/JT809Constants.cs b/src/JT809.DotNetty.Abstractions/JT809Constants.cs
new file mode 100644
index 0000000..f28f5b6
--- /dev/null
+++ b/src/JT809.DotNetty.Abstractions/JT809Constants.cs
@@ -0,0 +1,25 @@
+namespace JT809.DotNetty.Abstractions
+{
+ public static class JT809Constants
+ {
+ public const string SessionOnline= "JT809SessionOnline";
+
+ public const string SessionOffline = "JT809SessionOffline";
+
+ public static class JT809WebApiRouteTable
+ {
+ public const string RouteTablePrefix = "/jt809api";
+
+ public const string SessionPrefix = "Session";
+
+ public const string SystemCollectPrefix = "SystemCollect";
+
+ public const string TcpPrefix = "Tcp";
+
+ ///
+ ///获取当前系统进程使用率
+ ///
+ public static string SystemCollectGet = $"{RouteTablePrefix}/{SystemCollectPrefix}/Get";
+ }
+ }
+}
diff --git a/src/JT809.DotNetty.Core/Codecs/JT809TcpDecoder.cs b/src/JT809.DotNetty.Core/Codecs/JT809TcpDecoder.cs
new file mode 100644
index 0000000..35ccdab
--- /dev/null
+++ b/src/JT809.DotNetty.Core/Codecs/JT809TcpDecoder.cs
@@ -0,0 +1,20 @@
+using DotNetty.Buffers;
+using DotNetty.Codecs;
+using System.Collections.Generic;
+using DotNetty.Transport.Channels;
+using JT809.Protocol;
+
+namespace JT809.DotNetty.Core.Codecs
+{
+ public class JT809TcpDecoder : ByteToMessageDecoder
+ {
+ protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List