lixun 2 năm trước cách đây
mục cha
commit
5648fecf3b
27 tập tin đã thay đổi với 1092 bổ sung549 xóa
  1. 6 1
      src/YSAI.DAQ/YSAI.Core/YSAI.Core.csproj
  2. 40 0
      src/YSAI.DAQ/YSAI.Core/config/ReflectionConfig.json
  3. 1 1
      src/YSAI.DAQ/YSAI.Core/interface/only/IKafka.cs
  4. 1 1
      src/YSAI.DAQ/YSAI.Core/interface/only/IMqtt.cs
  5. 1 1
      src/YSAI.DAQ/YSAI.Core/interface/only/IRabbitMQ.cs
  6. 0 29
      src/YSAI.DAQ/YSAI.Core/interface/unify/IConsumer.cs
  7. 1 1
      src/YSAI.DAQ/YSAI.Core/interface/unify/IRelay.cs
  8. 58 7
      src/YSAI.DAQ/YSAI.Core/reflection/ReflectionOperate.cs
  9. 15 9
      src/YSAI.DAQ/YSAI.DAQ.sln
  10. 3 3
      src/YSAI.DAQ/YSAI.DaqManage/DaqManageData.cs
  11. 5 5
      src/YSAI.DAQ/YSAI.DaqManage/DaqManageOperate.cs
  12. 21 1
      src/YSAI.DAQ/YSAI.Kafka/KafkaProducerOperate.cs
  13. 0 5
      src/YSAI.DAQ/YSAI.Manage/Controllers/RelayLibInfoController.cs
  14. 0 7
      src/YSAI.DAQ/YSAI.Manage/YSAI.Manage.csproj
  15. 0 19
      src/YSAI.DAQ/YSAI.Mqtt/client/MqttClientData.cs
  16. 21 18
      src/YSAI.DAQ/YSAI.Mqtt/client/MqttClientOperate.cs
  17. 0 1
      src/YSAI.DAQ/YSAI.Opc/YSAI.Opc.csproj
  18. 1 1
      src/YSAI.DAQ/YSAI.RabbitMQ/RabbitMQOperate.cs
  19. 21 21
      src/YSAI.DAQ/YSAI.RelayManage/RelayManageData.cs
  20. 638 174
      src/YSAI.DAQ/YSAI.RelayManage/RelayManageOperate.cs
  21. 1 4
      src/YSAI.DAQ/YSAI.RelayManage/YSAI.RelayManage.csproj
  22. 61 0
      src/YSAI.DAQ/YSAI.Test.Console/Program.cs
  23. 29 0
      src/YSAI.DAQ/YSAI.Test.Console/YSAI.Test.Console.csproj
  24. 167 13
      src/YSAI.DAQ/YSAI.Test/TestAll.cs
  25. 1 0
      src/YSAI.DAQ/YSAI.Test/YSAI.Test.csproj
  26. 0 202
      src/YSAI.DAQ/YSAI.TestConsole/Program.cs
  27. 0 25
      src/YSAI.DAQ/YSAI.TestConsole/YSAI.TestConsole.csproj

+ 6 - 1
src/YSAI.DAQ/YSAI.Core/YSAI.Core.csproj

@@ -4,7 +4,6 @@
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-	<GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
 	<ItemGroup>
@@ -19,4 +18,10 @@
 		<ProjectReference Include="..\YSAI.Unility\YSAI.Unility.csproj" />
 	</ItemGroup>
 
+	<ItemGroup>
+	  <None Update="config\ReflectionConfig.json">
+	    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+	  </None>
+	</ItemGroup>
+
 </Project>

+ 40 - 0
src/YSAI.DAQ/YSAI.Core/config/ReflectionConfig.json

@@ -0,0 +1,40 @@
+{
+    "DllDatas": [
+        {
+            "DllPath": "YSAI.RelayManage.dll",
+            "IsAbsolutePath": false,
+            "NamespaceDatas": [
+                {
+                    "Namespace": "YSAI.RelayManage",
+                    "ClassDatas": [
+                        {
+                            "SN": "YSAI.RelayManage.RelayManageOperate[Instance]",
+                            "ClassName": "RelayManageOperate",
+                            "ConstructorParam": null,
+                            "MethodDatas": [
+                                {
+                                    "SN": "[Produce]",
+                                    "WhetherExecute": false,
+                                    "MethodName": "Produce",
+                                    "MethodParam": null
+                                },
+                                {
+                                    "SN": "[Dispose]",
+                                    "WhetherExecute": false,
+                                    "MethodName": "Dispose",
+                                    "MethodParam": null
+                                }
+                            ],
+                            "EventDatas": [
+                                {
+                                    "SN": "[OnEvent]",
+                                    "EventName": "OnEvent"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        }
+    ]
+}

+ 1 - 1
src/YSAI.DAQ/YSAI.Core/interface/only/IKafka.cs

@@ -61,7 +61,7 @@ namespace YSAI.Core.@interface.only
     /// <summary>
     /// 生产者接口
     /// </summary>
-    public interface IKafkaProducer:IProducer
+    public interface IKafkaProducer: IRelay
     {
         /// <summary>
         /// 生产

+ 1 - 1
src/YSAI.DAQ/YSAI.Core/interface/only/IMqtt.cs

@@ -12,7 +12,7 @@ namespace YSAI.Core.@interface.only
     /// <summary>
     /// MQTT客户端接口
     /// </summary>
-    public interface IMqttClient : IOn, IOff,IProducer, IDisposable
+    public interface IMqttClient : IRelay, IDisposable
     {
         /// <summary>
         /// 发布订阅

+ 1 - 1
src/YSAI.DAQ/YSAI.Core/interface/only/IRabbitMQ.cs

@@ -11,7 +11,7 @@ namespace YSAI.Core.@interface.only
     /// <summary>
     /// RabbitMQ接口
     /// </summary>
-    public interface IRabbitMQ : IOn, IOff, IProducer, IDisposable
+    public interface IRabbitMQ : IRelay, IDisposable
     {
         /// <summary>
         /// 发布 一个交换机可以发布多个消息

+ 0 - 29
src/YSAI.DAQ/YSAI.Core/interface/unify/IConsumer.cs

@@ -1,29 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using YSAI.Core.data;
-
-namespace YSAI.Core.@interface.unify
-{
-    /// <summary>
-    /// 消费者接口
-    /// </summary>
-    public interface IConsumer
-    {
-        /// <summary>
-        /// 消费
-        /// </summary>
-        /// <param name="Topic">主题</param>
-        /// <returns></returns>
-        OperateResult Consume(string Topic);
-
-        /// <summary>
-        /// 消费
-        /// </summary>
-        /// <param name="Topic">主题</param>
-        /// <returns></returns>
-        Task<OperateResult> ConsumeAsync(string Topic);
-    }
-}

+ 1 - 1
src/YSAI.DAQ/YSAI.Core/interface/unify/IRelay.cs

@@ -9,7 +9,7 @@ namespace YSAI.Core.@interface.unify
     /// <summary>
     /// 转发接口
     /// </summary>
-    public interface IRelay :IProducer, IConsumer, IDisposable
+    public interface IRelay : IOn, IOff, IProducer, IDisposable
     {
 
     }

+ 58 - 7
src/YSAI.DAQ/YSAI.Core/reflection/ReflectionOperate.cs

@@ -28,14 +28,16 @@ namespace YSAI.Core.reflection
     /// </summary>
     public class ReflectionOperate : IBaseAbstract,IDisposable
     {
+        protected override string LogHead => "[ ReflectionOperate 操作 ]";
+        protected override string ClassName => "ReflectionOperate";
         /// <summary>
         /// 文件夹
         /// </summary>
-        public static string ConfigDirectory = "config";
+        public readonly static string ConfigDirectory = "config";
         /// <summary>
         /// 文件
         /// </summary>
-        public static string ConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}{ConfigDirectory}//ReflectionConfig.json";
+        public readonly static string ConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}{ConfigDirectory}//ReflectionConfig.json";
         /// <summary>
         /// 配置数据
         /// </summary>
@@ -52,6 +54,60 @@ namespace YSAI.Core.reflection
                 {
                     return JsonTool.StringToJsonEntity<Basics>(FileTool.FileToString(ConfigFile));
                 }
+                else
+                {
+                    //创建配置
+                    Basics basics = new Basics()
+                    {
+                        DllDatas = new List<Basics.DllData>()
+                                    {
+                                        new Basics.DllData()
+                                        {
+                                            DllPath="YSAI.RelayManage.dll",
+                                            IsAbsolutePath=false,
+                                            NamespaceDatas=new List<Basics.DllData.NamespaceData>()
+                                            {
+                                                new Basics.DllData.NamespaceData()
+                                                {
+                                                    Namespace="YSAI.RelayManage",
+                                                    ClassDatas=new List<Basics.DllData.NamespaceData.ClassData>()
+                                                    {
+                                                        new Basics.DllData.NamespaceData.ClassData()
+                                                        {
+                                                            ClassName="RelayManageOperate",
+                                                            ConstructorParam=null,
+                                                            SN="YSAI.RelayManage.RelayManageOperate[Instance]",
+                                                            MethodDatas=new List<Basics.DllData.NamespaceData.ClassData.MethodData>()
+                                                            {
+                                                                new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                                                {
+                                                                    MethodName="Produce",
+                                                                    SN="[Produce]"
+                                                                },
+                                                                 new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                                                {
+                                                                    MethodName="Dispose",
+                                                                    SN="[Dispose]"
+                                                                }
+                                                            },
+                                                            EventDatas=new List<ClassData.EventData>()
+                                                            {
+                                                                new ClassData.EventData()
+                                                                {
+                                                                    EventName="OnEvent",
+                                                                    SN="[OnEvent]"
+                                                                }
+                                                            }
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                    };
+                    FileTool.StringToFile(ConfigFile, basics.ToJson().JsonFormatting());
+                    return GetConfig();
+                }
             }
             catch (Exception ex)
             {
@@ -121,11 +177,6 @@ namespace YSAI.Core.reflection
             return ThisObjList;
         }
 
-        protected override string LogHead => "[ ReflectionOperate 操作 ]";
-
-        protected override string ClassName => "ReflectionOperate";
-     
-
         /// <summary>
         /// 方法的IOC容器
         /// key 标识符,$"{ClassData.SN}{MethodData.SN}"

+ 15 - 9
src/YSAI.DAQ/YSAI.DAQ.sln

@@ -27,8 +27,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "daq", "daq", "{0A264424-1AD
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YSAI.Test", "YSAI.Test\YSAI.Test.csproj", "{26BEA521-56B3-4BE8-9F5C-62BCA2323ABD}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YSAI.TestConsole", "YSAI.TestConsole\YSAI.TestConsole.csproj", "{6F261956-DB97-43E4-A982-FBA2FB78AE15}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YSAI.RabbitMQ", "YSAI.RabbitMQ\YSAI.RabbitMQ.csproj", "{8CE7E64C-7A6A-4581-A9B3-C05214986B4F}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YSAI.Manage", "YSAI.Manage\YSAI.Manage.csproj", "{6E9667C0-303C-472D-949B-60F812E6C659}"
@@ -71,6 +69,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YSAI.DaqManage", "YSAI.DaqM
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YSAI.RelayManage", "YSAI.RelayManage\YSAI.RelayManage.csproj", "{DD9020DC-A51F-48F2-83FA-A3F10A43220F}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YSAI.Test.Console", "YSAI.Test.Console\YSAI.Test.Console.csproj", "{623C8558-8901-4D69-B1AC-1615597E8B88}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lib", "lib", "{7EB5153B-7702-4D7B-8592-FE6D992682AB}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "windows", "windows", "{1856E9E1-33C4-45C1-832C-854F9BE1ACC4}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -121,10 +125,6 @@ Global
 		{26BEA521-56B3-4BE8-9F5C-62BCA2323ABD}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{26BEA521-56B3-4BE8-9F5C-62BCA2323ABD}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{26BEA521-56B3-4BE8-9F5C-62BCA2323ABD}.Release|Any CPU.Build.0 = Release|Any CPU
-		{6F261956-DB97-43E4-A982-FBA2FB78AE15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{6F261956-DB97-43E4-A982-FBA2FB78AE15}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{6F261956-DB97-43E4-A982-FBA2FB78AE15}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{6F261956-DB97-43E4-A982-FBA2FB78AE15}.Release|Any CPU.Build.0 = Release|Any CPU
 		{8CE7E64C-7A6A-4581-A9B3-C05214986B4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{8CE7E64C-7A6A-4581-A9B3-C05214986B4F}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{8CE7E64C-7A6A-4581-A9B3-C05214986B4F}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -189,6 +189,10 @@ Global
 		{DD9020DC-A51F-48F2-83FA-A3F10A43220F}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{DD9020DC-A51F-48F2-83FA-A3F10A43220F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{DD9020DC-A51F-48F2-83FA-A3F10A43220F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{623C8558-8901-4D69-B1AC-1615597E8B88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{623C8558-8901-4D69-B1AC-1615597E8B88}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{623C8558-8901-4D69-B1AC-1615597E8B88}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{623C8558-8901-4D69-B1AC-1615597E8B88}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -204,12 +208,12 @@ Global
 		{FEFEFB3E-30EE-429A-B39D-F39CF1338E38} = {0A264424-1AD7-49FA-B813-D96498066479}
 		{2B2ED6D8-B498-4589-ADAB-4599B9EFFC70} = {9D8EDBBA-7A97-4D84-9B12-7FCC2F834046}
 		{439C729E-C66D-492B-A481-0C7F73F04E76} = {0A264424-1AD7-49FA-B813-D96498066479}
+		{0A264424-1AD7-49FA-B813-D96498066479} = {7EB5153B-7702-4D7B-8592-FE6D992682AB}
 		{26BEA521-56B3-4BE8-9F5C-62BCA2323ABD} = {12CB0510-7B1E-4518-AA3B-412A4D323D42}
-		{6F261956-DB97-43E4-A982-FBA2FB78AE15} = {12CB0510-7B1E-4518-AA3B-412A4D323D42}
 		{8CE7E64C-7A6A-4581-A9B3-C05214986B4F} = {9D8EDBBA-7A97-4D84-9B12-7FCC2F834046}
 		{6E9667C0-303C-472D-949B-60F812E6C659} = {ECAD410C-2895-4836-BCA7-D4EF340E778E}
 		{57F9FF57-ADD3-40B0-AE20-C2F88A2784A0} = {ECAD410C-2895-4836-BCA7-D4EF340E778E}
-		{6F526F44-A5B0-49D5-8E04-DBFDB5F8E6C6} = {D60224CF-7F12-453B-851E-B5C01F9D2BBE}
+		{6F526F44-A5B0-49D5-8E04-DBFDB5F8E6C6} = {1856E9E1-33C4-45C1-832C-854F9BE1ACC4}
 		{8B8BF505-7A00-4868-939F-EB5056083E49} = {0A264424-1AD7-49FA-B813-D96498066479}
 		{CCF267B2-ABB4-4B42-8351-103D59FA4B3B} = {6F526F44-A5B0-49D5-8E04-DBFDB5F8E6C6}
 		{2FC39615-7195-4A0D-9959-E49630AB41D6} = {6F526F44-A5B0-49D5-8E04-DBFDB5F8E6C6}
@@ -219,10 +223,12 @@ Global
 		{6A255A65-3198-44AA-A281-62F721D49CEF} = {6F526F44-A5B0-49D5-8E04-DBFDB5F8E6C6}
 		{0EA9373C-B55A-4400-82AC-7681AA996229} = {6F526F44-A5B0-49D5-8E04-DBFDB5F8E6C6}
 		{257F1474-B220-4C61-88C6-5B83BEF7B3A7} = {D60224CF-7F12-453B-851E-B5C01F9D2BBE}
-		{49133ADB-D3BF-4682-AA5A-CC1CF1917D45} = {D60224CF-7F12-453B-851E-B5C01F9D2BBE}
+		{49133ADB-D3BF-4682-AA5A-CC1CF1917D45} = {1856E9E1-33C4-45C1-832C-854F9BE1ACC4}
 		{2221CE78-FA24-40E3-8453-9C66E32F9C0C} = {ECAD410C-2895-4836-BCA7-D4EF340E778E}
+		{9D8EDBBA-7A97-4D84-9B12-7FCC2F834046} = {7EB5153B-7702-4D7B-8592-FE6D992682AB}
 		{41AB3A5A-5372-4A75-898C-9A4F9454F8A5} = {ECAD410C-2895-4836-BCA7-D4EF340E778E}
 		{DD9020DC-A51F-48F2-83FA-A3F10A43220F} = {ECAD410C-2895-4836-BCA7-D4EF340E778E}
+		{623C8558-8901-4D69-B1AC-1615597E8B88} = {12CB0510-7B1E-4518-AA3B-412A4D323D42}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {5D5D3927-6714-40C0-84EA-44C5BA4C5E87}

+ 3 - 3
src/YSAI.DAQ/YSAI.DaqManage/DaqManageData.cs

@@ -19,7 +19,7 @@ namespace YSAI.DaqManage
             /// <summary>
             /// 库文件统一存放文件夹,绝对路径
             /// </summary>
-            public string? LibFolder { get; set; } = $"{AppDomain.CurrentDomain.BaseDirectory}plunin";
+            public string? LibFolder { get; set; } = $"{AppDomain.CurrentDomain.BaseDirectory}lib";
 
             /// <summary>
             /// 库配置文件夹,绝对路径
@@ -33,9 +33,9 @@ namespace YSAI.DaqManage
 
             /// <summary>
             /// 配置文件名称的格式,SN与配置数据中的SN一致
-            /// *.Config-*.json
+            /// 库配置:命名空间 + 类名.SN.Config.json
             /// </summary>
-            public string? ConfigFileNameFormat { get; set; } = "{0}.Config-*.json";
+            public string? ConfigFileNameFormat { get; set; } = "{0}.*.Config.json";
 
             /// <summary>
             /// 接口名称

+ 5 - 5
src/YSAI.DAQ/YSAI.DaqManage/DaqManageOperate.cs

@@ -21,7 +21,7 @@ namespace YSAI.DaqManage
     /// <summary>
     /// 采集管理操作,
     /// 库:*.dll,
-    /// 库配置:*.Config*.json
+    /// 库配置:命名空间 + 类名.SN.Config.json
     /// </summary>
     public class DaqManageOperate : IBaseAbstract
     {
@@ -30,11 +30,11 @@ namespace YSAI.DaqManage
         /// <summary>
         /// 文件夹
         /// </summary>
-        public static string ConfigDirectory = "config";
+        public readonly static string ConfigDirectory = "config";
         /// <summary>
         /// 文件
         /// </summary>
-        public static string ConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}{ConfigDirectory}//DaqManageConfig.json";
+        public readonly static string ConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}{ConfigDirectory}//DaqManageConfig.json";
         /// <summary>
         /// 配置数据
         /// </summary>
@@ -73,7 +73,7 @@ namespace YSAI.DaqManage
                 }
                 else
                 {
-                    FileTool.StringToFile(ConfigFile,new DaqManageData.Basics().ToJson());
+                    FileTool.StringToFile(ConfigFile,new DaqManageData.Basics().ToJson().JsonFormatting());
                     return GetConfig();
                 }
             }
@@ -432,7 +432,7 @@ namespace YSAI.DaqManage
             //获取结构参数
             JObject? jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(content);
             //获取唯一标识符
-            string SN = $"{type.FullName}:{jsonObject[basics.LibConfigSNKey]}";
+            string SN = $"{type.FullName}.{jsonObject[basics.LibConfigSNKey]}";
             //获取实例
             IDaq? instance = CreateInstance(type, new object[] { jsonObject }) as IDaq;
             //实例不为空

+ 21 - 1
src/YSAI.DAQ/YSAI.Kafka/KafkaProducerOperate.cs

@@ -9,7 +9,7 @@ using YSAI.Unility;
 
 namespace YSAI.Kafka
 {
-    public sealed class KafkaProducerOperate : IBaseAbstract, IKafkaProducer
+    public sealed class KafkaProducerOperate : IBaseAbstract, IKafkaProducer, IRelay
     {
         private static readonly object Lock = new object();  //锁
         private static List<KafkaProducerOperate> ThisObjList = new List<KafkaProducerOperate>(); //自身对象集合
@@ -145,5 +145,25 @@ namespace YSAI.Kafka
         {
             return Task.Run(() => Produce(Topic, Content));
         }
+
+        public Task<OperateResult> OnAsync()
+        {
+            return Task.Run(() => On());
+        }
+
+        public OperateResult On()
+        {
+            return Break(Depart("On"), true);
+        }
+
+        public Task<OperateResult> OffAsync()
+        {
+            return Task.Run(() => Off());
+        }
+
+        public OperateResult Off()
+        {
+            return Break(Depart("Off"), true);
+        }
     }
 }

+ 0 - 5
src/YSAI.DAQ/YSAI.Manage/Controllers/RelayLibInfoController.cs

@@ -1,10 +1,5 @@
 using Microsoft.AspNetCore.Mvc;
-using YSAI.Kafka;
-using YSAI.Mqtt.client;
-using YSAI.RabbitMQ;
-using YSAI.Unility;
 using YSAI.Core.@enum;
-using YSAI.Core.@interface.only;
 using YSAI.Core.data;
 using YSAI.Manage.Core;
 

+ 0 - 7
src/YSAI.DAQ/YSAI.Manage/YSAI.Manage.csproj

@@ -20,14 +20,7 @@
 
   <ItemGroup>
     <ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />
-    <ProjectReference Include="..\YSAI.DB\YSAI.DB.csproj" />
-    <ProjectReference Include="..\YSAI.Kafka\YSAI.Kafka.csproj" />
     <ProjectReference Include="..\YSAI.Manage.Core\YSAI.Manage.Core.csproj" />
-    <ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />
-    <ProjectReference Include="..\YSAI.Mqtt\YSAI.Mqtt.csproj" />
-    <ProjectReference Include="..\YSAI.Opc\YSAI.Opc.csproj" />
-    <ProjectReference Include="..\YSAI.RabbitMQ\YSAI.RabbitMQ.csproj" />
-    <ProjectReference Include="..\YSAI.S7\YSAI.S7.csproj" />
   </ItemGroup>
 
   <ItemGroup>

+ 0 - 19
src/YSAI.DAQ/YSAI.Mqtt/client/MqttClientData.cs

@@ -99,24 +99,5 @@ namespace YSAI.Mqtt.client
                 }
             }
         }
-
-        /// <summary>
-        /// 状态
-        /// </summary>
-        public enum States
-        {
-            /// <summary>
-            /// 已启动
-            /// </summary>
-            On,
-            /// <summary>
-            /// 已停止
-            /// </summary>
-            Off,
-            /// <summary>
-            /// 啥也没干
-            /// </summary>
-            Null
-        }
     }
 }

+ 21 - 18
src/YSAI.DAQ/YSAI.Mqtt/client/MqttClientOperate.cs

@@ -18,7 +18,7 @@ namespace YSAI.Mqtt.client
     /// <summary>
     /// Mqtt 客户端
     /// </summary>
-    public sealed class MqttClientOperate : IBaseAbstract, Core.@interface.only.IMqttClient
+    public sealed class MqttClientOperate : IBaseAbstract, Core.@interface.only.IMqttClient, IRelay
     {
         private static readonly object Lock = new object();  //锁
         private static List<MqttClientOperate> ThisObjList = new List<MqttClientOperate>(); //自身对象集合
@@ -76,10 +76,6 @@ namespace YSAI.Mqtt.client
         /// MQTT 客户端
         /// </summary>
         private MqttClient mqttClient;
-        /// <summary>
-        /// 状态
-        /// </summary>
-        private States states = States.Null;
 
         #endregion
 
@@ -101,14 +97,6 @@ namespace YSAI.Mqtt.client
 
         #endregion
 
-        /// <summary>
-        /// 获取状态
-        /// </summary>
-        /// <returns></returns>
-        public States GetState()
-        {
-            return states;
-        }
 
         public void Dispose()
         {
@@ -133,6 +121,10 @@ namespace YSAI.Mqtt.client
             Depart("PublishSubscribe");
             try
             {
+                if (!mqttClient.IsConnected)
+                {
+                    return Break("PublishSubscribe", false, "未连接");
+                }
                 MqttApplicationMessage mqttApplicationMessage = new MqttApplicationMessage();
                 //主题
                 mqttApplicationMessage.Topic = Topic;
@@ -170,6 +162,10 @@ namespace YSAI.Mqtt.client
             Depart("AddSubscribe");
             try
             {
+                if (!mqttClient.IsConnected)
+                {
+                    return Break("AddSubscribe", false, "未连接");
+                }
                 //添加订阅 (异步)等待执行完成
                 mqttClient.SubscribeAsync(Topic, (MqttQualityOfServiceLevel)QoSLevel).Wait();
                 return Break("AddSubscribe", true);
@@ -191,6 +187,10 @@ namespace YSAI.Mqtt.client
             Depart("RemoveSubscribe");
             try
             {
+                if (!mqttClient.IsConnected)
+                {
+                    return Break("RemoveSubscribe", false, "未连接");
+                }
                 //移除订阅 (异步)等待执行完成
                 mqttClient.UnsubscribeAsync(Topic).Wait();
                 return Break("RemoveSubscribe", true);
@@ -212,6 +212,10 @@ namespace YSAI.Mqtt.client
             Depart("On");
             try
             {
+                if (mqttClient.IsConnected)
+                {
+                    return Break("On", false, "已连接");
+                }
                 MqttClientOptionsBuilder mqttClientOptionsBuilder = new MqttClientOptionsBuilder();
                 //服务质量
                 mqttClientOptionsBuilder.WithWillQualityOfServiceLevel(mqttClientData.QualityOfServiceLevel);
@@ -227,13 +231,10 @@ namespace YSAI.Mqtt.client
                 mqttClientOptionsBuilder.WithKeepAlivePeriod(TimeSpan.MaxValue);
                 //连接服务器(异步)
                 mqttClient.ConnectAsync(mqttClientOptionsBuilder.Build()).Wait();
-                //设置状态
-                states = States.On;
                 return Break("On", true);
             }
             catch (Exception ex)
             {
-                states = States.Null;
                 return Break("On", false, ex.Message);
             }
         }
@@ -249,11 +250,13 @@ namespace YSAI.Mqtt.client
             Depart("Off");
             try
             {
+                if (!mqttClient.IsConnected)
+                {
+                    return Break("Off", false, "未连接");
+                }
                 //关闭与服务器的连接(异步)(等待执行完成)
                 mqttClient.DisconnectAsync().Wait();
                 mqttClient.Dispose();
-                //设置状态
-                states = States.Off;
                 return Break("Off", true);
             }
             catch (Exception ex)

+ 0 - 1
src/YSAI.DAQ/YSAI.Opc/YSAI.Opc.csproj

@@ -4,7 +4,6 @@
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/YSAI.DAQ/YSAI.RabbitMQ/RabbitMQOperate.cs

@@ -18,7 +18,7 @@ namespace YSAI.RabbitMQ
     /// <summary>
     /// 发布者操作
     /// </summary>
-    public sealed class RabbitMQOperate : IBaseAbstract, IRabbitMQ
+    public sealed class RabbitMQOperate : IBaseAbstract, IRabbitMQ, IRelay
     {
         protected override string LogHead => "[ RabbitMQOperate 操作 ]";
         protected override string ClassName => "RabbitMQOperate";

+ 21 - 21
src/YSAI.DAQ/YSAI.RelayManage/RelayManageData.cs

@@ -2,9 +2,6 @@
 using System.Linq;
 using System.Text.Json.Serialization;
 using YSAI.Core.@interface.only;
-using YSAI.Kafka;
-using YSAI.Mqtt.client;
-using YSAI.RabbitMQ;
 
 namespace YSAI.RelayManage
 {
@@ -16,38 +13,41 @@ namespace YSAI.RelayManage
         public class Basics
         {
             /// <summary>
-            /// 消息主题
+            /// 库文件统一存放文件夹,绝对路径
             /// </summary>
-            [Description("消息主题")]
-            public string MessageTopic { get; set; } = "message";
+            public string? LibFolder { get; set; } = $"{AppDomain.CurrentDomain.BaseDirectory}lib";
+
             /// <summary>
-            /// 状态主题
+            /// 库配置文件夹,绝对路径
             /// </summary>
-            [Description("状态主题")]
-            public string StatusTopic { get; set; } = "status";
+            public string? LibConfigFolder { get; set; } = $"{AppDomain.CurrentDomain.BaseDirectory}config";
+
             /// <summary>
-            /// 任务处理数量
+            /// 库配置唯一标识符键
             /// </summary>
-            [Description("任务处理数量")]
-            public int TaskHandleCount { get; set; } = 8;
+            public string? LibConfigSNKey { get; set; } = "SN";
+
             /// <summary>
-            /// 任务处理完成休眠时间(毫秒)
+            /// 配置文件名称的格式 * 与配置数据中的SN一致
+            /// 库配置:命名空间 + 类名.SN.Config.json
             /// </summary>
-            [Description("任务处理完成休眠时间(毫秒)")]
-            public int TaskHandleAccomplishSleepTime { get; set; } = 500;
+            public string? ConfigFileNameFormat { get; set; } = "{0}.*.Config.json";
 
             /// <summary>
-            /// MQTT参数集合
+            /// 接口名称
             /// </summary>
-            public List<MqttClientData.Basics>? MqttClientDataArray { get; set; }
+            public string? InterfaceFullName { get; set; } = "YSAI.Core.interface.unify.IRelay";
+
             /// <summary>
-            /// Kafka生产者参数集合
+            /// 任务处理数量
             /// </summary>
-            public List<KafkaProducerData.Basics>? KafkaProducerDataArray { get; set; }
+            [Description("任务处理数量")]
+            public int TaskHandleCount { get; set; } = 8;
             /// <summary>
-            /// RabbitMQ 参数集合
+            /// 任务处理完成休眠时间(毫秒)
             /// </summary>
-            public List<RabbitMQData.Basics>? RabbitMQDataArray { get; set; }
+            [Description("任务处理完成休眠时间(毫秒)")]
+            public int TaskHandleAccomplishSleepTime { get; set; } = 500;
         }
     }
 }

+ 638 - 174
src/YSAI.DAQ/YSAI.RelayManage/RelayManageOperate.cs

@@ -1,53 +1,49 @@
-using System;
+using Newtonsoft.Json.Linq;
+using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
+using System.Reflection;
 using System.Text;
 using System.Threading.Tasks;
 using YSAI.Core.data;
 using YSAI.Core.@enum;
 using YSAI.Core.@interface.unify;
 using YSAI.Core.reflection;
-using YSAI.Kafka;
 using YSAI.Log;
-using YSAI.Mqtt.client;
-using YSAI.RabbitMQ;
 using YSAI.Unility;
 
 namespace YSAI.RelayManage
 {
     /// <summary>
-    /// 转发操作
+    /// 转发管理操作,
+    /// 库:*.dll,
+    /// 库配置:命名空间 + 类名.SN.Config.json
     /// </summary>
-    public class RelayManageOperate : IBaseAbstract, IRelay
+    public class RelayManageOperate : IBaseAbstract
     {
         protected override string LogHead => "[ RelayManageOperate 操作 ]";
         protected override string ClassName => "RelayManageOperate";
         /// <summary>
         /// 文件夹
         /// </summary>
-        public static string ConfigDirectory = "config";
+        public readonly static string ConfigDirectory = "config";
         /// <summary>
         /// 文件
         /// </summary>
-        public static string ConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}{ConfigDirectory}//RelayManageConfig.json";
+        public readonly static string ConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}{ConfigDirectory}//RelayManageConfig.json";
 
         /// <summary>
-        /// 统一返回
+        /// 配置数据
         /// </summary>
-        private OperateResult? operateResult = null;
-        /// <summary>
-        /// 基础数据
-        /// </summary>
-        private RelayManageData.Basics basics;
-
+        private RelayManageData.Basics? basics;
         private static readonly object Lock = new object();  //锁
-        private static ReflectionOperate? ThisObjList; //自身对象
+        private static RelayManageOperate? ThisObjList; //自身对象
         /// <summary>
         /// 单例模式
         /// </summary>
         /// <returns></returns>
-        public static ReflectionOperate Instance()
+        public static RelayManageOperate Instance()
         {
             if (ThisObjList == null)
             {
@@ -55,25 +51,82 @@ namespace YSAI.RelayManage
                 {
                     if (ThisObjList == null)
                     {
-                        ThisObjList = new ReflectionOperate();
+                        ThisObjList = new RelayManageOperate();
                     }
                 }
             }
             return ThisObjList;
         }
+        /// <summary>
+        /// 获取配置
+        /// </summary>
+        /// <returns></returns>
+        public RelayManageData.Basics? GetConfig()
+        {
+            try
+            {
+                if (File.Exists(ConfigFile))  //配置存在
+                {
+                    return JsonTool.StringToJsonEntity<RelayManageData.Basics>(FileTool.FileToString(ConfigFile));
+                }
+                else
+                {
+                    FileTool.StringToFile(ConfigFile, new RelayManageData.Basics().ToJson().JsonFormatting());
+                    return GetConfig();
+                }
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"获取配置异常:{ex.Message}");
+            }
+            return null;
+        }
 
         /// <summary>
-        /// kafka生产者
+        /// 设置配置
+        /// </summary>
+        /// <returns></returns>
+        public bool SetConfig(RelayManageData.Basics basics)
+        {
+            try
+            {
+                //实体转JSON字符串
+                string json = JsonTool.JsonEntityToString(basics);
+                //写入文件
+                File.WriteAllText(ConfigFile, JsonTool.JsonFormatting(json));
+                return true;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"设置配置异常:{ex.Message}");
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 构造函数处理配置
+        /// </summary>
+        public RelayManageOperate()
+        {
+            Monitor();
+        }
+
+        /// <summary>
+        /// 实例容器集合
+        /// </summary>
+        private ConcurrentDictionary<string, IRelay> InstanceIoc;
+        /// <summary>
+        /// 库类型容器
         /// </summary>
-        private ConcurrentDictionary<string, KafkaProducerOperate> KafkaProducerArray;
+        private ConcurrentDictionary<string, Type> TypeIoc;
         /// <summary>
-        /// MQTT
+        /// 文件夹监控
         /// </summary>
-        private ConcurrentDictionary<string, MqttClientOperate> MqttClientArray;
+        private FileSystemWatcher watcherLibFolder;
         /// <summary>
-        /// RabbitMQ
+        /// 文件夹监控
         /// </summary>
-        private ConcurrentDictionary<string, RabbitMQOperate> RabbitMQArray;
+        private FileSystemWatcher watcherLibConfigFolder;
         /// <summary>
         /// 任务集合
         /// </summary>
@@ -96,250 +149,661 @@ namespace YSAI.RelayManage
             /// </summary>
             public string Content { get; set; }
         }
-
         /// <summary>
-        /// 任务处理
+        /// 监控文件夹
         /// </summary>
-        /// <returns></returns>
-        public Task TaskHandle()
+        public Task Monitor()
         {
-            string logName = "TaskHandle.log";
-            //起个新线程处理
+            //起一个新线程
             return Task.Factory.StartNew(() =>
             {
-                //循环
-                while (TaskArray != null)
+                //实例容器实例化
+                if (InstanceIoc == null)
                 {
-                    try
+                    InstanceIoc = new ConcurrentDictionary<string, IRelay>();
+                }
+                //程序集
+                if (TypeIoc == null)
+                {
+                    TypeIoc = new ConcurrentDictionary<string, Type>();
+                }
+                //获取配置
+                if (basics == null)
+                {
+                    this.basics = GetConfig();
+                }
+
+                if (basics != null)
+                {
+                    //检索
+                    Search();
+
+                    //文件夹监控
+                    watcherLibFolder = new FileSystemWatcher(basics.LibFolder);
+                    //监控的配置
+                    watcherLibFolder.Filter = "*.dll";
+                    //当文件夹中新增文件
+                    watcherLibFolder.Created += delegate (object sender, FileSystemEventArgs e) { Watcher_Created(sender, e, 0); };
+                    //当文件夹中删除文件
+                    watcherLibFolder.Deleted += delegate (object sender, FileSystemEventArgs e) { Watcher_Deleted(sender, e, 0); };
+                    //启动监听
+                    watcherLibFolder.EnableRaisingEvents = true;
+
+
+                    //文件夹监视
+                    watcherLibConfigFolder = new FileSystemWatcher(basics.LibConfigFolder);
+                    //监控的配置
+                    watcherLibConfigFolder.Filter = "*.Config.json";
+                    //当文件夹中新增文件
+                    watcherLibConfigFolder.Created += delegate (object sender, FileSystemEventArgs e) { Watcher_Created(sender, e, 1); };
+                    //当文件夹中删除文件
+                    watcherLibConfigFolder.Deleted += delegate (object sender, FileSystemEventArgs e) { Watcher_Deleted(sender, e, 1); };
+                    //启动监听
+                    watcherLibConfigFolder.EnableRaisingEvents = true;
+
+                }
+                else
+                {
+                    OnEventHandler?.Invoke(this, new EventResult(false, $"配置文件不存在"));
+                }
+            });
+        }
+        /// <summary>
+        /// 当文件夹中删除文件
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        /// <param name="Type">【0:库文件】【1:配置文件】</param>
+        private void Watcher_Deleted(object sender, FileSystemEventArgs e, int Type)
+        {
+            //程序集SN
+            string TypeSN = string.Empty;
+            switch (Type)
+            {
+                case 0:
+                    OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 文件被删除,移除此库程序集,并移除所有实例"));
+                    //程序集SN
+                    TypeSN = e.Name.Replace(".dll", string.Empty);
+
+                    foreach (var item in InstanceIoc)
                     {
-                        //队列数据
-                        QueueData? queueData;
-                        //出列
-                        while (DataQueue.TryDequeue(out queueData))
+                        if (item.Key.Contains(TypeSN))
                         {
-                            if (queueData != null)
+                            InstanceIoc[item.Key].Dispose();
+                            if (InstanceIoc.Remove(item.Key, out _))
+                            {
+                                OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 移除配置实例 {item.Key} 成功"));
+                            }
+                            else
                             {
-                                if (KafkaProducerArray != null)
+                                OnEventHandler?.Invoke(this, new EventResult(false, $"{e.Name} 移除配置实例 {item.Key} 失败"));
+                            }
+                        }
+                    }
+
+                    foreach (var item in TypeIoc)
+                    {
+                        if (item.Key.Contains(TypeSN))
+                        {
+                            if (TypeIoc.Remove(item.Key, out _))
+                            {
+                                OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 移除程序集 {item.Key} 成功"));
+                            }
+                            else
+                            {
+                                OnEventHandler?.Invoke(this, new EventResult(false, $"{e.Name} 移除程序集 {item.Key} 失败"));
+                            }
+                        }
+                    }
+                    break;
+                case 1:
+                    OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 文件被删除,移除对应配置实例"));
+                    //程序集SN
+                    TypeSN = e.Name.Split('-')[0].Replace(".Config", string.Empty);
+                    //分割
+                    string[] strs = e.Name.Split('-');
+                    if (strs.Length > 1)
+                    {
+                        //获取配置实例SN
+                        string SN = $"{TypeSN}:{e.Name.Split('-')[1].Split('.')[0]}";
+                        if (InstanceIoc.ContainsKey(SN))
+                        {
+                            InstanceIoc[SN].Dispose();
+                            if (InstanceIoc.Remove(SN, out _))
+                            {
+                                OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 移除配置实例成功"));
+                            }
+                            else
+                            {
+                                OnEventHandler?.Invoke(this, new EventResult(false, $"{e.Name} 移除配置实例失败"));
+                            }
+                        }
+                        else
+                        {
+                            OnEventHandler?.Invoke(this, new EventResult(false, $"{e.Name} 移除配置实例失败 {TypeSN} 实例不存在"));
+                        }
+                    }
+                    break;
+            }
+        }
+
+        /// <summary>
+        /// 当文件夹中新增文件
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        /// <param name="Type">【0:库文件】【1:配置文件】</param>
+        private void Watcher_Created(object sender, FileSystemEventArgs e, int Type)
+        {
+            switch (Type)
+            {
+                case 0:
+                    OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 文件新增,添加此库程序集"));
+                    SearchType(e.FullPath);
+                    break;
+                case 1:
+                    OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 文件新增,新增对应配置实例"));
+                    #region 新增对应配置实例
+                    int until = 5;
+                    int i = 0;
+                    bool success = false;
+                    while (!success && i < until)
+                    {
+                        try
+                        {
+                            string path = String.Format(e.FullPath);
+                            string? filename = Path.GetFileName(path);
+                            using (Stream fs = File.OpenRead(@path))
+                            {
+                                StreamReader srdPreview = new StreamReader(fs);
+                                String temp = string.Empty;
+                                while (srdPreview.Peek() > -1)
                                 {
-                                    foreach (var operate in KafkaProducerArray)
-                                    {
-                                        operateResult = operate.Value.Produce(queueData.Topic, queueData.Content);
-                                        OnEventHandler?.Invoke(this, new EventResult(operateResult.State, "请查看RData", operateResult, ResultType.OperateResult));
-                                    }
+                                    String input = srdPreview.ReadLine();
+                                    temp += input;
                                 }
-                                if (MqttClientArray != null)
+                                srdPreview.Close();
+                                srdPreview.Dispose();
+
+                                //获取程序集SN
+                                string TypeSN = e.Name.Split('-')[0].Replace(".Config", string.Empty);
+                                //分割
+                                string[] strs = e.Name.Split('-');
+                                if (strs.Length > 1)
                                 {
-                                    foreach (var operate in MqttClientArray)
+                                    //获取配置实例SN
+                                    string SN = $"{TypeSN}:{strs[1].Split('.')[0]}";
+                                    //判断是否存在此程序集SN
+                                    if (TypeIoc.ContainsKey(TypeSN))
                                     {
-                                        operateResult = operate.Value.Produce(queueData.Topic, queueData.Content);
-                                        OnEventHandler?.Invoke(this, new EventResult(operateResult.State, "请查看RData", operateResult, ResultType.OperateResult));
+                                        if (!InstanceIoc.ContainsKey(SN))
+                                        {
+                                            ConfigCreateInstance(TypeIoc[TypeSN], temp);
+                                        }
+                                        else
+                                        {
+                                            OnEventHandler?.Invoke(this, new EventResult(false, $" {e.Name} 此配置实例已存在"));
+                                        }
                                     }
-                                }
-                                if (RabbitMQArray != null)
-                                {
-                                    foreach (var operate in RabbitMQArray)
+                                    else
                                     {
-                                        operateResult = operate.Value.Produce(queueData.Topic, queueData.Content);
-                                        OnEventHandler?.Invoke(this, new EventResult(operateResult.State, "请查看RData", operateResult, ResultType.OperateResult));
+                                        OnEventHandler?.Invoke(this, new EventResult(false, $" {e.Name} 新增对应配置创建实例失败 {TypeSN} 程序集不存在"));
                                     }
                                 }
+                                fs.Close();
+                                fs.Dispose();
                             }
+                            success = true;
+                        }
+                        catch
+                        {
+                            i++;
+                            Thread.Sleep(TimeSpan.FromSeconds(1));
                         }
                     }
-                    catch (Exception ex)
-                    {
-                        LogHelper.Error($"任务处理异常:{ex.Message}", logName);
-                    }
-                    Thread.Sleep(basics.TaskHandleAccomplishSleepTime);
-                }
-            });
+                    #endregion
+                    break;
+            }
         }
 
         /// <summary>
-        /// 无惨构造函数
+        /// 检索文件并创建实例
         /// </summary>
-        public RelayManageOperate()
+        private void Search()
         {
-            this.basics = GetConfig();
-            Init();
+            try
+            {
+                //库
+                List<string> libs = Directory.GetFiles(basics.LibFolder, "*.dll", SearchOption.AllDirectories).ToList();
+                //循环文件,添加程序集
+                foreach (var lib in libs)
+                {
+                    SearchType(lib);
+                }
+                //获取配置
+                foreach (var type in TypeIoc)
+                {
+                    TypeSearchConfig(type.Value);
+                }
+            }
+            catch (Exception ex)
+            {
+                OnEventHandler?.Invoke(this, new EventResult(false, $"检索异常:{ex.Message}"));
+            }
         }
 
         /// <summary>
-        /// 获取配置
+        /// 通过DLL检索程序集
         /// </summary>
-        /// <returns></returns>
-        private RelayManageData.Basics? GetConfig()
+        /// <param name="lib">库文件</param>
+        private void SearchType(string lib)
         {
-            try
+            //加载程序集
+            Assembly assembly = Assembly.LoadFrom(lib);
+            //获取所有类
+            Type[] types = assembly.GetExportedTypes();
+            //过滤器
+            TypeFilter typeFilter = new TypeFilter(InterfaceFilter);
+            //集合
+            List<Type> typesArray = new List<Type>();
+            //检索类是否继承接口
+            foreach (Type type in types)
             {
-                if (File.Exists(ConfigFile))  //配置存在
+                if (type.FindInterfaces(typeFilter, basics.InterfaceFullName).Count() > 0)
                 {
-                    return JsonTool.StringToJsonEntity<RelayManageData.Basics>(FileTool.FileToString(ConfigFile));
+                    typesArray.Add(type);
                 }
             }
-            catch (Exception ex)
+            //添加至集合
+            foreach (Type type in typesArray)
             {
-                Console.WriteLine($"获取配置异常:{ex.Message}");
+                TypeIoc.TryAdd(type.FullName, type);
+                //抛出信息
+                OnEventHandler?.Invoke(this, new EventResult(true, $"{type.FullName} 程序集添加成功"));
+            }
+        }
+        /// <summary>
+        /// 通过程序集检索配置
+        /// </summary>
+        /// <param name="type">程序集</param>
+        private void TypeSearchConfig(Type type)
+        {
+            //组织配置文件
+            string configFile = string.Format(basics.ConfigFileNameFormat, type.FullName);
+            //目录信息
+            DirectoryInfo directoryInfo = new DirectoryInfo(basics.LibConfigFolder);
+            //文件检索得到文件信息
+            List<FileInfo> fieldInfos = directoryInfo.GetFiles(configFile, SearchOption.AllDirectories).ToList();
+            //如果文件信息为空则不创建实例
+            if (fieldInfos.Count > 0)
+            {
+                //循环检索配置文件信息
+                foreach (FileInfo fi in fieldInfos)
+                {
+                    ConfigCreateInstance(type, FileTool.FileToString(fi.FullName));
+                }
             }
-            return null;
         }
-
         /// <summary>
-        /// 初始化状态
+        /// 通过配置创建实例
         /// </summary>
-        private bool InitState = false;
+        /// <param name="type">程序集</param>
+        /// <param name="content">内容</param>
+        private void ConfigCreateInstance(Type type, string content)
+        {
+            //获取结构参数
+            JObject? jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(content);
+            //获取唯一标识符
+            string SN = $"{type.FullName}.{jsonObject[basics.LibConfigSNKey]}";
+            //获取实例
+            IRelay? instance = CreateInstance(type, new object[] { jsonObject }) as IRelay;
+            //实例不为空
+            if (instance != null)
+            {
+                //把这个实例添加到容器中
+                InstanceIoc.TryAdd(SN, instance);
+                //抛出信息
+                OnEventHandler?.Invoke(this, new EventResult(true, $"{SN} 实例创建成功"));
+            }
+            else
+            {
+                //抛出信息
+                OnEventHandler?.Invoke(this, new EventResult(false, $"{SN} 实例创建失败"));
+            }
+        }
+        /// <summary>
+        /// 创建实例
+        /// </summary>
+        /// <param name="NamespaceAndClassNameType">类型</param>
+        /// <param name="ConstructorParam">构造函数入参</param>
+        /// <returns></returns>
+        private object? CreateInstance(Type? NamespaceAndClassNameType, object[]? ConstructorParam)
+        {
+            //转换后的参数
+            object[]? Param = null;
+
+            if (ConstructorParam != null)
+            {
+                //获取构造函数信息
+                ConstructorInfo? constructorInfo = NamespaceAndClassNameType?.GetConstructors().FirstOrDefault();
+                //数据类型转换
+                Param = ParamTypeConvert(ConstructorParam, constructorInfo);
+            }
+            //创建实例
+            return Activator.CreateInstance(NamespaceAndClassNameType, Param);
+        }
 
         /// <summary>
-        /// 初始化
+        /// 参数类型转换
         /// </summary>
-        private void Init()
+        /// <returns></returns>
+        private object[]? ParamTypeConvert(object[] Data, object Info)
         {
-            if (basics != null)
+            if (Data != null)
             {
-                if (basics.RabbitMQDataArray != null)
+                ParameterInfo[]? ParamArray = null;
+                List<object> param = new List<object>();
+                if (Info.GetType().ToString().Contains("MethodInfo"))
                 {
-                    foreach (var configData in basics.RabbitMQDataArray)
+                    ParamArray = (Info as MethodInfo).GetParameters();
+                    if (ParamArray != null)
                     {
-                        RabbitMQOperate operate = RabbitMQOperate.Instance(configData);
-                        operateResult = operate.On();
-                        if (operateResult.State)
+                        for (int i = 0; i < ParamArray.Count(); i++)
                         {
-                            if (RabbitMQArray == null)
+                            if (string.IsNullOrEmpty(ParamArray[i].ParameterType.FullName))
                             {
-                                RabbitMQArray = new ConcurrentDictionary<string, RabbitMQOperate>();
+                                param.Add(Data[i]);
+                            }
+                            else
+                            {
+                                param.Add(Convert.ChangeType(Data[i], ParamArray[i].ParameterType));
                             }
-                            RabbitMQArray.TryAdd(configData.SN, operate);
-                        }
-                        else
-                        {
-                            //通知到外部,让外部来觉得是否重新初始化
-                            OnEventHandler?.Invoke(this, new EventResult(operateResult.State, "请查看RData", operateResult, ResultType.OperateResult));
                         }
                     }
                 }
-
-                if (basics.MqttClientDataArray != null)
+                if (Info.GetType().ToString().Contains("ConstructorInfo"))
                 {
-                    foreach (var configData in basics.MqttClientDataArray)
+                    ParamArray = (Info as ConstructorInfo).GetParameters();
+                    if (ParamArray != null)
                     {
-                        MqttClientOperate operate = MqttClientOperate.Instance(configData);
-                        operateResult = operate.On();
-                        if (operateResult.State)
+                        for (int i = 0; i < ParamArray.Count(); i++)
                         {
-                            if (MqttClientArray == null)
+                            object? model = Activator.CreateInstance(ParamArray[i].ParameterType);
+                            PropertyInfo[] properties = ParamArray[i].ParameterType.GetProperties();
+                            foreach (var propertie in properties)
                             {
-                                MqttClientArray = new ConcurrentDictionary<string, MqttClientOperate>();
+                                JObject? JsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(Data[i].ToJson());
+                                propertie.SetValue(model, Convert.ChangeType(JsonObject[propertie.Name], propertie.PropertyType));
+                            }
+                            if (model != null)
+                            {
+                                param.Add(model);
                             }
-                            MqttClientArray.TryAdd(configData.SN, operate);
-                        }
-                        else
-                        {
-                            //通知到外部,让外部来觉得是否重新初始化
-                            OnEventHandler?.Invoke(this, new EventResult(operateResult.State, "请查看RData", operateResult, ResultType.OperateResult));
                         }
                     }
                 }
-
-                if (basics.KafkaProducerDataArray != null)
+                if (param.Count > 0)
                 {
-                    foreach (var configData in basics.KafkaProducerDataArray)
-                    {
-                        KafkaProducerOperate operate = KafkaProducerOperate.Instance(configData);
-                        if (KafkaProducerArray == null)
-                        {
-                            KafkaProducerArray = new ConcurrentDictionary<string, KafkaProducerOperate>();
-                        }
-                        KafkaProducerArray.TryAdd(configData.SN, operate);
-                    }
+                    return param.ToArray();
                 }
+            }
+            return null;
+        }
 
-                InitState = true;
+        /// <summary>
+        /// 接口过滤器
+        /// </summary>
+        private bool InterfaceFilter(Type typeObj, Object criteriaObj)
+        {
+            if (typeObj.ToString() == criteriaObj.ToString())
+                return true;
+            else
+                return false;
+        }
+
+        /// <summary>
+        /// 这是释放所有包含自身对象
+        /// </summary>
+        public void Dispose()
+        {
+            //容器实例释放
+            foreach (var item in InstanceIoc) { item.Value.Dispose(); }
+            if (TaskArray != null) { foreach (var item in TaskArray) { item.Value.Dispose(); } TaskArray = null; }
+            DataQueue.Clear();
+            DataQueue = null;
+            //清空
+            InstanceIoc.Clear();
+            InstanceIoc = null;
+            TypeIoc.Clear();
+            TypeIoc = null;
 
+            GC.Collect();
+            GC.SuppressFinalize(this);
+            ThisObjList = null;
+        }
+
+        /// <summary>
+        /// 释放
+        /// </summary>
+        /// <param name="SN">实例的唯一标识符</param>
+        public OperateResult Dispose(string SN)
+        {
+            Depart("Dispose");
+            try
+            {
+                if (InstanceIoc.ContainsKey(SN))
+                {
+                    InstanceIoc[SN].Dispose();
+                    return Break("Dispose", true);
+                }
+                else
+                {
+                    return Break("Dispose", false, $"未找到 {SN} 的实例");
+                }
             }
-            else
+            catch (Exception ex)
             {
-                OnEventHandler?.Invoke(this, new EventResult(false, "请查看RData", Break(Depart("Init"), false, "配置文件不存在"), ResultType.OperateResult));
+                return Break("Dispose", false, ex.Message);
             }
         }
-
-        public OperateResult Produce(string Topic, string Content)
+        /// <summary>
+        /// 释放
+        /// </summary>
+        /// <param name="SN">实例的唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public Task<OperateResult> DisposeAsync(string SN)
         {
-            Depart("Produce");
+            return Task.Run(() => Dispose(SN));
+        }
+        /// <summary>
+        /// 移除实例
+        /// </summary>
+        /// <param name="SN">实例的唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public OperateResult Remove(string SN)
+        {
+            Depart("Remove");
             try
             {
-                //主题
-                string topic = Topic;
-                try
+                if (InstanceIoc.ContainsKey(SN))
                 {
-                    //如果包类型可以被转换,直接走对应配置,如果不能,则走传入的主题
-                    PacketType? packetType = (PacketType)Enum.Parse(typeof(PacketType), Topic);
-                    if (packetType != null)
+                    if (InstanceIoc.Remove(SN, out _))
                     {
-                        switch (packetType)
-                        {
-                            case PacketType.Message:
-                                topic = basics.MessageTopic;
-                                break;
-                            case PacketType.Status:
-                                topic = basics.StatusTopic;
-                                break;
-                        }
+                        return Break("Remove", true);
+                    }
+                    else
+                    {
+                        return Break("Remove", false, $"{SN} 的实例移除失败");
                     }
                 }
-                catch { }
-                if (!InitState)
+                else
                 {
-                    return Break("Produce", false, "尚未初始化");
+                    return Break("Remove", false, $"未找到 {SN} 的实例");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Remove", false, ex.Message);
+            }
+        }
+        /// <summary>
+        /// 移除实例
+        /// </summary>
+        /// <param name="SN">实例的唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public Task<OperateResult> RemoveAsync(string SN)
+        {
+            return Task.Run(() => Remove(SN));
+        }
+        /// <summary>
+        /// 打开
+        /// </summary>
+        /// <param name="SN">实例的唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public Task<OperateResult> OnAsync(string SN)
+        {
+            return Task.Run(() => On(SN));
+        }
+        /// <summary>
+        /// 打开
+        /// </summary>
+        /// <param name="SN">实例的唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public OperateResult On(string SN)
+        {
+            Depart("On");
+            try
+            {
+                if (InstanceIoc.ContainsKey(SN))
+                {
+                    return InstanceIoc[SN].On();
                 }
                 else
                 {
-                    //当队列为空,初始化队列
-                    if (DataQueue == null)
-                    {
-                        DataQueue = new ConcurrentQueue<QueueData>();
-                        TaskArray = new ConcurrentDictionary<Guid, Task>();
-                        //启动
-                        for (int i = 0; i < basics.TaskHandleCount; i++)
-                        {
-                            TaskArray.TryAdd(Guid.NewGuid(), TaskHandle());
-                        }
-                    }
-                    //入列
-                    DataQueue.Enqueue(new QueueData() { Topic = Topic, Content = Content });
+                    return Break("On", false, $"未找到 {SN} 的实例");
                 }
-                return Break("Produce", true);
             }
             catch (Exception ex)
             {
-                return Break("Produce", false, ex.Message);
+                return Break("On", false, ex.Message);
             }
         }
-
-        public Task<OperateResult> ProduceAsync(string Topic, string Content)
+        /// <summary>
+        /// 关闭
+        /// </summary>
+        /// <param name="SN">实例的唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public Task<OperateResult> OffAsync(string SN)
         {
-            return Task.Run(() => Produce(Topic, Content));
+            return Task.Run(() => Off(SN));
         }
-
-        public OperateResult Consume(string Topic)
+        /// <summary>
+        /// 关闭
+        /// </summary>
+        /// <param name="SN">实例的唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public OperateResult Off(string SN)
         {
-            return Break(Depart("Consume"), false, "目前暂不支持消费");
+            Depart("Off");
+            try
+            {
+                if (InstanceIoc.ContainsKey(SN))
+                {
+                    return InstanceIoc[SN].Off();
+                }
+                else
+                {
+                    return Break("Off", false, $"未找到 {SN} 的实例");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Off", false, ex.Message);
+            }
         }
 
-        public Task<OperateResult> ConsumeAsync(string Topic)
+        /// <summary>
+        /// 任务处理
+        /// </summary>
+        /// <returns></returns>
+        private Task TaskHandle()
         {
-            return Task.Run(() => Consume(Topic));
+            string logName = "TaskHandle.log";
+            //起个新线程处理
+            return Task.Factory.StartNew(() =>
+            {
+                //循环
+                while (TaskArray != null)
+                {
+                    try
+                    {
+                        //队列数据
+                        QueueData? queueData;
+                        //出列
+                        while (DataQueue.TryDequeue(out queueData))
+                        {
+                            if (queueData != null)
+                            {
+                                foreach (var item in InstanceIoc)
+                                {
+                                    OperateResult operateResult = item.Value.Produce(queueData.Topic, queueData.Content);
+                                    OnEventHandler?.Invoke(this, new EventResult(operateResult.State, operateResult.Message, operateResult.RData, operateResult.RType));
+                                }
+                            }
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        LogHelper.Error($"任务处理异常:{ex.Message}", logName);
+                    }
+                    Thread.Sleep(basics.TaskHandleAccomplishSleepTime);
+                }
+            });
         }
 
-        public void Dispose()
+        /// <summary>
+        /// 生产
+        /// </summary>
+        /// <param name="Topic">主题</param>
+        /// <param name="Content">内容</param>
+        /// <returns>统一出参</returns>
+        public OperateResult Produce(string Topic, string Content)
         {
-            if (KafkaProducerArray != null) { foreach (var item in KafkaProducerArray) { item.Value.Dispose(); } KafkaProducerArray = null; }
-            if (MqttClientArray != null) { foreach (var item in MqttClientArray) { item.Value.Dispose(); } MqttClientArray = null; }
-            if (RabbitMQArray != null) { foreach (var item in RabbitMQArray) { item.Value.Dispose(); } RabbitMQArray = null; }
-            if (TaskArray != null) { foreach (var item in TaskArray) { item.Value.Dispose(); } TaskArray = null; }
-            DataQueue.Clear();
-            ThisObjList = null;
-            GC.Collect();
-            GC.SuppressFinalize(this);
+            Depart("Produce");
+            try
+            {
+                //当队列为空,初始化队列
+                if (DataQueue == null)
+                {
+                    DataQueue = new ConcurrentQueue<QueueData>();
+                }
+                if (TaskArray == null)
+                {
+                    TaskArray = new ConcurrentDictionary<Guid, Task>();
+                    //创建任务
+                    for (int i = 0; i < basics.TaskHandleCount; i++)
+                    {
+                        TaskArray.TryAdd(Guid.NewGuid(), TaskHandle());
+                    }
+                }
+                //入列
+                DataQueue.Enqueue(new QueueData() { Topic = Topic, Content = Content });
+                return Break("Produce", true);
+            }
+            catch (Exception ex)
+            {
+                return Break("Produce", false, ex.Message);
+            }
+        }
+        /// <summary>
+        /// 生产
+        /// </summary>
+        /// <param name="Topic">主题</param>
+        /// <param name="Content">内容</param>
+        /// <returns>统一出参</returns>
+        public Task<OperateResult> ProduceAsync(string Topic, string Content)
+        {
+            return Task.Run(() => Produce(Topic, Content));
         }
     }
 }

+ 1 - 4
src/YSAI.DAQ/YSAI.RelayManage/YSAI.RelayManage.csproj

@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
@@ -7,9 +7,6 @@
   </PropertyGroup>
 	<ItemGroup>
 		<ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />
-		<ProjectReference Include="..\YSAI.Kafka\YSAI.Kafka.csproj" />
-		<ProjectReference Include="..\YSAI.Mqtt\YSAI.Mqtt.csproj" />
-		<ProjectReference Include="..\YSAI.RabbitMQ\YSAI.RabbitMQ.csproj" />
 		<ProjectReference Include="..\YSAI.Unility\YSAI.Unility.csproj" />
 	</ItemGroup>
 </Project>

+ 61 - 0
src/YSAI.DAQ/YSAI.Test.Console/Program.cs

@@ -0,0 +1,61 @@
+using YSAI.Core.data;
+using YSAI.Core.reflection;
+using YSAI.DaqManage;
+using YSAI.Mqtt.client;
+using YSAI.Mqtt.service.websocket;
+using YSAI.RelayManage;
+using YSAI.Unility;
+
+int[] ints = { 8881, 8882 };
+foreach (var item in ints)
+{
+    MqttWebSocketServiceOperate mqttWebSocketServiceOperate = MqttWebSocketServiceOperate.Instance(new MqttWebSocketServiceData.Basics()
+    {
+        Port = item,
+        HttpPort = ($"1{item.ToString()}").ToInt(),
+        LoginID = "ysai",
+        LoginPassword = "ysai",
+        Uri = "ysai"
+    });
+    mqttWebSocketServiceOperate.OnEvent += MqttWebSocketServiceOperate_OnEvent;
+    mqttWebSocketServiceOperate.On();
+}
+
+
+
+
+RelayManageOperate manageOperate = new RelayManageOperate();
+manageOperate.OnEvent += ManageOperate_OnEvent;
+
+
+
+
+
+
+
+
+
+while (manageOperate != null)
+{
+    Console.Read();
+
+    OperateResult operateResult = manageOperate.On("YSAI.Mqtt.client.MqttClientOperate.MQTT一号转发");
+    Console.WriteLine(operateResult.Message);
+    operateResult = manageOperate.On("YSAI.Mqtt.client.MqttClientOperate.MQTT二号转发");
+    Console.WriteLine(operateResult.Message);
+
+    operateResult = manageOperate.Produce("Message", "66666666666666666666666666666666666");
+    Console.WriteLine(operateResult.Message);
+    
+}
+
+
+void MqttWebSocketServiceOperate_OnEvent(object? sender, EventResult e)
+{
+    Console.ForegroundColor = ConsoleColor.Green;
+    Console.WriteLine(e.Message);
+}
+void ManageOperate_OnEvent(object? sender, YSAI.Core.data.EventResult e)
+{
+    Console.WriteLine(e.Message);
+}

+ 29 - 0
src/YSAI.DAQ/YSAI.Test.Console/YSAI.Test.Console.csproj

@@ -0,0 +1,29 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\YSAI.DB\YSAI.DB.csproj" />
+		<ProjectReference Include="..\YSAI.Kafka\YSAI.Kafka.csproj" />
+		<ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />
+		<ProjectReference Include="..\YSAI.Mqtt\YSAI.Mqtt.csproj" />
+		<ProjectReference Include="..\YSAI.Opc\YSAI.Opc.csproj" />
+		<ProjectReference Include="..\YSAI.RabbitMQ\YSAI.RabbitMQ.csproj" />
+		<ProjectReference Include="..\YSAI.S7\YSAI.S7.csproj" />
+
+
+
+		<ProjectReference Include="..\YSAI.DaqManage\YSAI.DaqManage.csproj" />
+		<ProjectReference Include="..\YSAI.RelayManage\YSAI.RelayManage.csproj" />
+
+
+
+
+	</ItemGroup>
+
+</Project>

+ 167 - 13
src/YSAI.DAQ/YSAI.Test/TestAll.cs

@@ -19,6 +19,7 @@ using YSAI.RabbitMQ;
 using S7.Net;
 using YSAI.S7.client;
 using YSAI.RelayManage;
+using YSAI.DaqManage;
 
 namespace YSAI.Test
 {
@@ -1039,19 +1040,6 @@ namespace YSAI.Test
 
 
 
-            //转发配置
-            RelayManageData.Basics basics = new RelayManageData.Basics();
-            basics.RabbitMQDataArray = new List<RabbitMQData.Basics>();
-            basics.KafkaProducerDataArray = new List<KafkaProducerData.Basics>();
-            basics.MqttClientDataArray = new List<MqttClientData.Basics>();
-            basics.MqttClientDataArray.Add(new MqttClientData.Basics() { QualityOfServiceLevel = 0, ServerIPAddress = "127.0.0.1", ServerPort = 8881, ServerLoginID = "ysai", ServerLoginPassword = "ysai", SN = "mqtt转发一号" });
-            basics.MqttClientDataArray.Add(new MqttClientData.Basics() { QualityOfServiceLevel = 0, ServerIPAddress = "127.0.0.1", ServerPort = 8882, ServerLoginID = "ysai", ServerLoginPassword = "ysai", SN = "mqtt转发二号" });
-            basics.MqttClientDataArray.Add(new MqttClientData.Basics() { QualityOfServiceLevel = 0, ServerIPAddress = "127.0.0.1", ServerPort = 8883, ServerLoginID = "ysai", ServerLoginPassword = "ysai", SN = "mqtt转发三号" });
-            basics.MqttClientDataArray.Add(new MqttClientData.Basics() { QualityOfServiceLevel = 0, ServerIPAddress = "127.0.0.1", ServerPort = 8884, ServerLoginID = "ysai", ServerLoginPassword = "ysai", SN = "mqtt转发四号" });
-
-            RelayManageOperate relayOperate = new RelayManageOperate();
-
-            FileTool.StringToFile(RelayManageOperate.ConfigFile, basics.ToJson().JsonFormatting());
 
             //创建配置
             Basics basics2 = new Basics()
@@ -1110,5 +1098,171 @@ namespace YSAI.Test
         private static void RelayOperate_OnEvent(object? sender, object e)
         {
         }
+
+
+
+        public void 动态热加载流程()
+        {
+            //创建4个MQTTwebsocket 服务端
+
+            int[] ints = { 8881, 8882 };
+            foreach (var item in ints)
+            {
+                MqttWebSocketServiceOperate mqttWebSocketServiceOperate = MqttWebSocketServiceOperate.Instance(new MqttWebSocketServiceData.Basics()
+                {
+                    Port = item,
+                    HttpPort = ($"1{item.ToString()}").ToInt(),
+                    LoginID = "ysai",
+                    LoginPassword = "ysai",
+                    Uri = "ysai"
+                });
+                mqttWebSocketServiceOperate.OnEvent += MqttWebSocketServiceOperate_OnEvent;
+                mqttWebSocketServiceOperate.On();
+            }
+
+
+
+
+
+
+            DaqManageOperate daqManageOperate = DaqManageOperate.Instance();
+            daqManageOperate.OnEvent += DaqManageOperate_OnEvent;
+
+            Thread.Sleep(1000);
+
+            while (true)
+            {
+                Console.ReadLine();
+                //打开连接
+                OperateResult operateResult = daqManageOperate.On($"YSAI.Opc.da.client.OpcDaClientOperate:OPCDA1");
+                Console.WriteLine(operateResult.Message);
+
+                operateResult = daqManageOperate.On($"YSAI.Opc.da.client.OpcDaClientOperate:OPCDA2");
+                Console.WriteLine(operateResult.Message);
+
+                //添加订阅
+                Address address = new Address();
+                address.AddressArray = new List<AddressDetails>()
+            {
+                new AddressDetails()
+                {
+                    AddressName = "a.a.a",
+                    AddressDataType = Core.@enum.DataType.Bool,
+                    AddressDescribe = "一个动态的布尔类型",
+                    AddressAnotherName = "test",
+                    AddressPropertyName = "aaa",
+                    AddressType = Core.@enum.AddressType.Reality
+                },
+                new AddressDetails()
+                {
+                    AddressName = "a.a.h",
+                    AddressDataType = Core.@enum.DataType.String,
+                    AddressDescribe = "一个动态的字符串类型",
+                    AddressAnotherName = "test",
+                    AddressPropertyName = "aah",
+                    AddressType = Core.@enum.AddressType.Reality,
+                    AddressParseParam = new AddressParse()
+                    {
+                        ParseType = Core.@enum.ParseType.ScriptAnalysis,
+                        Script = new Core.script.ScriptData.Basics()
+                        {
+                            ScriptCode = @"function Convert(value) 
+                                            {
+                                                return '这是脚本测试,传入的参数是:' + value;
+                                            }",
+                            ScriptFunction = "Convert",
+                            ScriptType = Core.script.ScriptData.ScriptType.JavaScript
+                        }
+                    }
+                },
+                new AddressDetails()
+                 {
+                     AddressName = "a.a.g",
+                     AddressDataType = Core.@enum.DataType.Double,
+                     AddressDescribe = "一个动态的浮点类型",
+                     AddressAnotherName = "test",
+                     AddressPropertyName = "aag",
+                     AddressType = Core.@enum.AddressType.Reality,
+                     AddressParseParam = new AddressParse()
+                     {
+                         ParseType = Core.@enum.ParseType.ScriptAnalysis,
+                         Script = new Core.script.ScriptData.Basics()
+                         {
+                             ScriptCode = @"function Convert(value) 
+                                            {
+                                                return value*1000;
+                                            }",
+                             ScriptFunction = "Convert",
+                             ScriptType = Core.script.ScriptData.ScriptType.JavaScript
+                         }
+                     }
+                 },
+                new AddressDetails()
+                 {
+                     AddressName = "OPCDA_VirtualAddress",
+                     AddressDataType = Core.@enum.DataType.String,
+                     AddressDescribe = "虚拟地址",
+                     AddressAnotherName = "test",
+                     AddressPropertyName = "OPCDA_VirtualAddress",
+                     AddressType = Core.@enum.AddressType.Virtual
+                 },
+                new AddressDetails()
+                  {
+                      AddressName = "OPCDA_VirtualDynamicAddress",
+                      AddressDataType = Core.@enum.DataType.String,
+                      AddressDescribe = "虚拟动态地址",
+                      AddressAnotherName = "test",
+                      AddressPropertyName = "OPCDA_VirtualDynamicAddress",
+                      AddressType = Core.@enum.AddressType.VirtualDynamic
+                  }
+            };
+                operateResult = daqManageOperate.Subscribe(address, $"YSAI.Opc.da.client.OpcDaClientOperate:OPCDA1");
+                Console.WriteLine(operateResult.Message);
+
+
+                operateResult = daqManageOperate.Subscribe(address, $"YSAI.Opc.da.client.OpcDaClientOperate:OPCDA2");
+                Console.WriteLine(operateResult.Message);
+            }
+        }
+
+        private static void MqttWebSocketServiceOperate_OnEvent(object? sender, EventResult e)
+        {
+            Console.WriteLine(e.Message);
+        }
+
+        private static void DaqManageOperate_OnEvent(object? sender, EventResult e)
+        {
+            Console.WriteLine(e.Message);
+            switch (e.RType)
+            {
+                case ResultType.KeyValue:
+                    ConcurrentDictionary<string, AddressValue> pairs = e.RData as ConcurrentDictionary<string, AddressValue>;
+                    foreach (var item in pairs)
+                    {
+                        Console.WriteLine($"{item.Key} - {item.Value.Value}");
+                    }
+                    break;
+                case ResultType.KeyValueArray:
+                    break;
+                case ResultType.Json:
+                    break;
+                case ResultType.Bytes:
+                    break;
+                case ResultType.String:
+                    break;
+                case ResultType.Dynamic:
+                    break;
+                case ResultType.OperateResult:
+                    break;
+                case ResultType.Enum:
+                    break;
+                case ResultType.NULL:
+                    break;
+            }
+        }
+
+
+
+
     }
 }

+ 1 - 0
src/YSAI.DAQ/YSAI.Test/YSAI.Test.csproj

@@ -22,6 +22,7 @@
 
   <ItemGroup>
     <ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />
+    <ProjectReference Include="..\YSAI.DaqManage\YSAI.DaqManage.csproj" />
     <ProjectReference Include="..\YSAI.DB\YSAI.DB.csproj" />
     <ProjectReference Include="..\YSAI.Kafka\YSAI.Kafka.csproj" />
     <ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />

+ 0 - 202
src/YSAI.DAQ/YSAI.TestConsole/Program.cs

@@ -1,202 +0,0 @@
-using Google.Protobuf.WellKnownTypes;
-using OpcDaNetApi;
-using System.Collections.Concurrent;
-using System.Drawing;
-using System.Reflection;
-using System.Text.RegularExpressions;
-using YSAI.Core.data;
-using YSAI.Core.reflection;
-using YSAI.Core.subscription;
-using YSAI.DB;
-using YSAI.Kafka;
-using YSAI.Log;
-using YSAI.Mqtt.client;
-using YSAI.Mqtt.service.websocket;
-using YSAI.Opc.da.client;
-using YSAI.Opc.ua.client;
-using YSAI.Opc.ua.service;
-using YSAI.RabbitMQ;
-using YSAI.S7.client;
-using S7.Net;
-using YSAI.Unility;
-using static YSAI.Core.reflection.ReflectionData;
-using static YSAI.Core.reflection.ReflectionData.Basics.DllData.NamespaceData;
-using YSAI.Core.@enum;
-using System.Text;
-using Microsoft.Extensions.DependencyInjection;
-using YSAI.Core.@interface.unify;
-using YSAI.Modbus.client;
-using Microsoft.AspNetCore.Mvc;
-using YSAI.DaqManage;
-
-namespace YSAI.TestConsole
-{
-    internal class Program
-    {
-        static void Main(string[] args)
-        {
-
-           
-
-
-            //创建4个MQTTwebsocket 服务端
-
-            int[] ints = {8881,8882};
-            foreach (var item in ints)
-            {
-                MqttWebSocketServiceOperate mqttWebSocketServiceOperate = MqttWebSocketServiceOperate.Instance(new MqttWebSocketServiceData.Basics()
-                {
-                    Port= item,
-                    HttpPort = ($"1{item.ToString()}").ToInt(),
-                    LoginID="ysai",
-                    LoginPassword="ysai",
-                    Uri="ysai"
-                });
-                mqttWebSocketServiceOperate.OnEvent += MqttWebSocketServiceOperate_OnEvent;
-                mqttWebSocketServiceOperate.On();
-            }
-
-           
-
-
-
-
-            DaqManageOperate daqManageOperate = DaqManageOperate.Instance();
-            daqManageOperate.OnEvent += DaqManageOperate_OnEvent;
-
-            Thread.Sleep(1000);
-
-            while (true)
-            {
-                Console.ReadLine();
-                //打开连接
-                OperateResult operateResult = daqManageOperate.On($"YSAI.Opc.da.client.OpcDaClientOperate:OPCDA1");
-                Console.WriteLine(operateResult.Message);
-
-                operateResult = daqManageOperate.On($"YSAI.Opc.da.client.OpcDaClientOperate:OPCDA2");
-                Console.WriteLine(operateResult.Message);
-
-                //添加订阅
-                Address address = new Address();
-                address.AddressArray = new List<AddressDetails>()
-            {
-                new AddressDetails()
-                {
-                    AddressName = "a.a.a",
-                    AddressDataType = Core.@enum.DataType.Bool,
-                    AddressDescribe = "一个动态的布尔类型",
-                    AddressAnotherName = "test",
-                    AddressPropertyName = "aaa",
-                    AddressType = Core.@enum.AddressType.Reality
-                },
-                new AddressDetails()
-                {
-                    AddressName = "a.a.h",
-                    AddressDataType = Core.@enum.DataType.String,
-                    AddressDescribe = "一个动态的字符串类型",
-                    AddressAnotherName = "test",
-                    AddressPropertyName = "aah",
-                    AddressType = Core.@enum.AddressType.Reality,
-                    AddressParseParam = new AddressParse()
-                    {
-                        ParseType = Core.@enum.ParseType.ScriptAnalysis,
-                        Script = new Core.script.ScriptData.Basics()
-                        {
-                            ScriptCode = @"function Convert(value) 
-                                            {
-                                                return '这是脚本测试,传入的参数是:' + value;
-                                            }",
-                            ScriptFunction = "Convert",
-                            ScriptType = Core.script.ScriptData.ScriptType.JavaScript
-                        }
-                    }
-                },
-                new AddressDetails()
-                 {
-                     AddressName = "a.a.g",
-                     AddressDataType = Core.@enum.DataType.Double,
-                     AddressDescribe = "一个动态的浮点类型",
-                     AddressAnotherName = "test",
-                     AddressPropertyName = "aag",
-                     AddressType = Core.@enum.AddressType.Reality,
-                     AddressParseParam = new AddressParse()
-                     {
-                         ParseType = Core.@enum.ParseType.ScriptAnalysis,
-                         Script = new Core.script.ScriptData.Basics()
-                         {
-                             ScriptCode = @"function Convert(value) 
-                                            {
-                                                return value*1000;
-                                            }",
-                             ScriptFunction = "Convert",
-                             ScriptType = Core.script.ScriptData.ScriptType.JavaScript
-                         }
-                     }
-                 },
-                new AddressDetails()
-                 {
-                     AddressName = "OPCDA_VirtualAddress",
-                     AddressDataType = Core.@enum.DataType.String,
-                     AddressDescribe = "虚拟地址",
-                     AddressAnotherName = "test",
-                     AddressPropertyName = "OPCDA_VirtualAddress",
-                     AddressType = Core.@enum.AddressType.Virtual
-                 },
-                new AddressDetails()
-                  {
-                      AddressName = "OPCDA_VirtualDynamicAddress",
-                      AddressDataType = Core.@enum.DataType.String,
-                      AddressDescribe = "虚拟动态地址",
-                      AddressAnotherName = "test",
-                      AddressPropertyName = "OPCDA_VirtualDynamicAddress",
-                      AddressType = Core.@enum.AddressType.VirtualDynamic
-                  }
-            };
-                operateResult = daqManageOperate.Subscribe(address, $"YSAI.Opc.da.client.OpcDaClientOperate:OPCDA1");
-                Console.WriteLine(operateResult.Message);
-
-
-                operateResult = daqManageOperate.Subscribe(address, $"YSAI.Opc.da.client.OpcDaClientOperate:OPCDA2");
-                Console.WriteLine(operateResult.Message);
-            }
-        }
-
-        private static void MqttWebSocketServiceOperate_OnEvent(object? sender, EventResult e)
-        {
-            Console.WriteLine(e.Message);
-        }
-
-        private static void DaqManageOperate_OnEvent(object? sender, EventResult e)
-        {
-            Console.WriteLine(e.Message);
-            switch (e.RType)
-            {
-                case ResultType.KeyValue:
-                    ConcurrentDictionary<string, AddressValue> pairs = e.RData as ConcurrentDictionary<string, AddressValue>;
-                    foreach (var item in pairs)
-                    {
-                        Console.WriteLine($"{item.Key} - {item.Value.Value}");
-                    }
-                    break;
-                case ResultType.KeyValueArray:
-                    break;
-                case ResultType.Json:
-                    break;
-                case ResultType.Bytes:
-                    break;
-                case ResultType.String:
-                    break;
-                case ResultType.Dynamic:
-                    break;
-                case ResultType.OperateResult:
-                    break;
-                case ResultType.Enum:
-                    break;
-                case ResultType.NULL:
-                    break;
-            }
-        }
-    }
-
-
-}

+ 0 - 25
src/YSAI.DAQ/YSAI.TestConsole/YSAI.TestConsole.csproj

@@ -1,25 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <OutputType>Exe</OutputType>
-    <TargetFramework>net6.0</TargetFramework>
-    <ImplicitUsings>enable</ImplicitUsings>
-    <Nullable>enable</Nullable>
-    <PlatformTarget>x86</PlatformTarget>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />
-    <ProjectReference Include="..\YSAI.DaqManage\YSAI.DaqManage.csproj" />
-    <ProjectReference Include="..\YSAI.DB\YSAI.DB.csproj" />
-    <ProjectReference Include="..\YSAI.Kafka\YSAI.Kafka.csproj" />
-    <ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />
-    <ProjectReference Include="..\YSAI.Mqtt\YSAI.Mqtt.csproj" />
-    <ProjectReference Include="..\YSAI.Opc\YSAI.Opc.csproj" />
-    <ProjectReference Include="..\YSAI.RabbitMQ\YSAI.RabbitMQ.csproj" />
-    <ProjectReference Include="..\YSAI.Redis\YSAI.Redis.csproj" />
-    <ProjectReference Include="..\YSAI.RelayManage\YSAI.RelayManage.csproj" />
-    <ProjectReference Include="..\YSAI.S7\YSAI.S7.csproj" />
-  </ItemGroup>
-
-</Project>