+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ThingsGateway.Gateway.Razor.Common/GlobalUsings.cs b/src/ThingsGateway.Gateway.Razor.Common/GlobalUsings.cs
new file mode 100644
index 000000000..ee83ca24f
--- /dev/null
+++ b/src/ThingsGateway.Gateway.Razor.Common/GlobalUsings.cs
@@ -0,0 +1,42 @@
+//------------------------------------------------------------------------------
+// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
+// 此代码版权(除特别声明外的代码)归作者本人Diego所有
+// 源代码使用协议遵循本仓库的开源协议及附加协议
+// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
+// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
+// 使用文档:https://thingsgateway.cn/
+// QQ群:605534569
+//------------------------------------------------------------------------------
+
+global using BootstrapBlazor.Components;
+
+global using Microsoft.AspNetCore.Components;
+global using Microsoft.Extensions.Localization;
+
+global using System.Diagnostics.CodeAnalysis;
+
+global using ThingsGateway.Common;
+global using ThingsGateway.Foundation;
+global using ThingsGateway.Foundation.Common;
+global using ThingsGateway.Foundation.Common.Extension;
+global using ThingsGateway.Gateway.Application;
+global using ThingsGateway.Razor;
+
+#if !Management
+global using ChannelRuntime = ThingsGateway.Gateway.Application.ChannelRuntime;
+global using DeviceRuntime = ThingsGateway.Gateway.Application.DeviceRuntime;
+global using VariableRuntime = ThingsGateway.Gateway.Application.VariableRuntime;
+global using IVariablePageService = ThingsGateway.Gateway.Application.IVariablePageService;
+global using IDevicePageService = ThingsGateway.Gateway.Application.IDevicePageService;
+#else
+global using ChannelRuntime = ThingsGateway.Management.Application.ChannelRuntime;
+global using DeviceRuntime = ThingsGateway.Management.Application.DeviceRuntime;
+global using VariableRuntime = ThingsGateway.Management.Application.VariableRuntime;
+global using IVariablePageService = ThingsGateway.Management.Application.IVariablePageService;
+global using IDevicePageService = ThingsGateway.Management.Application.IDevicePageService;
+global using IChannelPageService = ThingsGateway.Management.Application.IChannelPageService;
+#endif
+
+[assembly: SuppressMessage("Reliability", "CA2007", Justification = "<挂起>", Scope = "module")]
+
+[assembly: GlobalGenerateSetParametersAsync(true)]
\ No newline at end of file
diff --git a/src/ThingsGateway.Gateway.Razor/Mapper/GatewayMapper.cs b/src/ThingsGateway.Gateway.Razor.Common/Mapper/GatewayMapper.cs
similarity index 100%
rename from src/ThingsGateway.Gateway.Razor/Mapper/GatewayMapper.cs
rename to src/ThingsGateway.Gateway.Razor.Common/Mapper/GatewayMapper.cs
diff --git a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor b/src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor
similarity index 90%
rename from src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor
rename to src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor
index d0455d446..f635ddf8f 100644
--- a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor
+++ b/src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor
@@ -24,8 +24,8 @@
-
@@ -34,8 +34,8 @@
- CheckScript(businessProperty, nameof(businessProperty.BigTextScriptVariableModel), Localizer["check"], this, DialogService))>
- @Localizer["Check"]
+ CheckScript(businessProperty, nameof(businessProperty.BigTextScriptVariableModel),"check", this, DialogService))>
+ "Check"
@@ -44,8 +44,8 @@
- CheckScript(businessProperty, nameof(businessProperty.BigTextScriptAlarmModel), Localizer["check"], this, DialogService))>
- @Localizer["Check"]
+ CheckScript(businessProperty, nameof(businessProperty.BigTextScriptAlarmModel), "check", this, DialogService))>
+ "Check"
diff --git a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor.cs b/src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor.cs
similarity index 99%
rename from src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor.cs
rename to src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor.cs
index 8d2721b00..9098d0013 100644
--- a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor.cs
+++ b/src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor.cs
@@ -36,9 +36,6 @@ public partial class PropertyComponent : IPropertyUIBase
return base.OnParametersSetAsync();
}
- [Inject]
- private IStringLocalizer Localizer { get; set; }
-
public static async Task CheckScript(BusinessPropertyWithCacheIntervalScript businessProperty, string pname, string title, object receiver, DialogService dialogService)
{
string script = null;
diff --git a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor b/src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor
similarity index 82%
rename from src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor
rename to src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor
index ae69f6c73..f71a6a337 100644
--- a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor
+++ b/src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor
@@ -6,13 +6,13 @@
-
+
-
+
@(new MarkupString("注意 raw 参数 为 object 类型,需要转换为实际类型操作"))
@(new MarkupString("获取设备类实体,可用 GlobalData.ReadOnlyDevices 字典对象,键为设备名称,值为设备对象"))
@(new MarkupString("获取变量类实体,可用方法 GlobalData.GetVariable(\"设备名称1\",\"变量名称1\") "))
@@ -22,18 +22,18 @@
-
+
-
+
- @Localizer["Check"]
+ "Check"
diff --git a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor.cs b/src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor.cs
similarity index 95%
rename from src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor.cs
rename to src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor.cs
index 4f1505c3d..3156b4d26 100644
--- a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor.cs
+++ b/src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor.cs
@@ -44,8 +44,6 @@ public partial class ScriptCheck
Output = ex.ToString();
}
}
- [Inject]
- private IStringLocalizer Localizer { get; set; }
private async Task GetDemo(Microsoft.AspNetCore.Components.Web.MouseEventArgs args)
{
diff --git a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor.css b/src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor.css
similarity index 100%
rename from src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor.css
rename to src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor.css
diff --git a/src/ThingsGateway.Gateway.Razor/Components/TcpServiceComponent.razor b/src/ThingsGateway.Gateway.Razor.Common/TcpServiceComponent.razor
similarity index 100%
rename from src/ThingsGateway.Gateway.Razor/Components/TcpServiceComponent.razor
rename to src/ThingsGateway.Gateway.Razor.Common/TcpServiceComponent.razor
diff --git a/src/ThingsGateway.Gateway.Razor/Components/TcpServiceComponent.razor.cs b/src/ThingsGateway.Gateway.Razor.Common/TcpServiceComponent.razor.cs
similarity index 100%
rename from src/ThingsGateway.Gateway.Razor/Components/TcpServiceComponent.razor.cs
rename to src/ThingsGateway.Gateway.Razor.Common/TcpServiceComponent.razor.cs
diff --git a/src/ThingsGateway.Gateway.Razor/Components/TcpSessionClientDto.cs b/src/ThingsGateway.Gateway.Razor.Common/TcpSessionClientDto.cs
similarity index 100%
rename from src/ThingsGateway.Gateway.Razor/Components/TcpSessionClientDto.cs
rename to src/ThingsGateway.Gateway.Razor.Common/TcpSessionClientDto.cs
diff --git a/src/ThingsGateway.Gateway.Razor.Common/ThingsGateway.Gateway.Razor.Common.csproj b/src/ThingsGateway.Gateway.Razor.Common/ThingsGateway.Gateway.Razor.Common.csproj
new file mode 100644
index 000000000..0c76548ff
--- /dev/null
+++ b/src/ThingsGateway.Gateway.Razor.Common/ThingsGateway.Gateway.Razor.Common.csproj
@@ -0,0 +1,36 @@
+
+
+
+
+ net8.0;$(OtherTargetFrameworks);
+
+
+
+
+
+
+ compile; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ThingsGateway.Gateway.Razor.Common/_Imports.razor b/src/ThingsGateway.Gateway.Razor.Common/_Imports.razor
new file mode 100644
index 000000000..056c5b288
--- /dev/null
+++ b/src/ThingsGateway.Gateway.Razor.Common/_Imports.razor
@@ -0,0 +1,27 @@
+
+@using System.Net.Http
+@using System.Net.Http.Json
+@using Microsoft.AspNetCore.Components.Forms
+@using Microsoft.AspNetCore.Components.Routing
+@using Microsoft.AspNetCore.Components.Web
+@using Microsoft.AspNetCore.Components.Web.Virtualization
+@using Microsoft.JSInterop
+@using Microsoft.AspNetCore.Authorization
+@using Microsoft.AspNetCore.Components.Authorization
+@using Microsoft.Extensions.Localization
+
+@using System.ComponentModel
+@using System.ComponentModel.DataAnnotations
+
+@using BootstrapBlazor.Components
+
+
+@using ThingsGateway.Razor;
+
+
+@using ChannelRuntime = ThingsGateway.Gateway.Application.ChannelRuntime;
+@using DeviceRuntime = ThingsGateway.Gateway.Application.DeviceRuntime;
+@using VariableRuntime = ThingsGateway.Gateway.Application.VariableRuntime;
+@using IVariablePageService = ThingsGateway.Gateway.Application.IVariablePageService;
+@using IDevicePageService = ThingsGateway.Gateway.Application.IDevicePageService;
+@using IChannelPageService = ThingsGateway.Gateway.Application.IChannelPageService;
diff --git a/src/ThingsGateway.Gateway.Razor/ThingsGateway.Gateway.Razor.csproj b/src/ThingsGateway.Gateway.Razor/ThingsGateway.Gateway.Razor.csproj
index 99e924ad6..ddd3fa1a3 100644
--- a/src/ThingsGateway.Gateway.Razor/ThingsGateway.Gateway.Razor.csproj
+++ b/src/ThingsGateway.Gateway.Razor/ThingsGateway.Gateway.Razor.csproj
@@ -5,13 +5,12 @@
net8.0;$(OtherTargetFrameworks);
-
+
compile; build; native; contentfiles; analyzers; buildtransitive
-
@@ -25,9 +24,20 @@
true
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ThingsGateway.Photino/Program.cs b/src/ThingsGateway.Photino/Program.cs
index 9d3c12480..850e8ea16 100644
--- a/src/ThingsGateway.Photino/Program.cs
+++ b/src/ThingsGateway.Photino/Program.cs
@@ -134,6 +134,6 @@ internal sealed class Program
return false;
};
hybridApp.Run();
- Thread.Sleep(2000);
+ Thread.Sleep(1000);
}
}
diff --git a/src/ThingsGateway.Photino/ThingsGateway.Photino.csproj b/src/ThingsGateway.Photino/ThingsGateway.Photino.csproj
index dfdc78cf8..2eec80402 100644
--- a/src/ThingsGateway.Photino/ThingsGateway.Photino.csproj
+++ b/src/ThingsGateway.Photino/ThingsGateway.Photino.csproj
@@ -7,28 +7,31 @@
-
+
+
+
+
-
-
+
-
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
diff --git a/src/ThingsGateway.ScriptDebug/ThingsGateway.ScriptDebug.csproj b/src/ThingsGateway.ScriptDebug/ThingsGateway.ScriptDebug.csproj
index 56c31b012..72f834056 100644
--- a/src/ThingsGateway.ScriptDebug/ThingsGateway.ScriptDebug.csproj
+++ b/src/ThingsGateway.ScriptDebug/ThingsGateway.ScriptDebug.csproj
@@ -1,16 +1,23 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ThingsGateway.ScriptDebug/targets/PluginDebug.targets b/src/ThingsGateway.ScriptDebug/targets/PluginDebug.targets
index 6a72e913c..ccc93625e 100644
--- a/src/ThingsGateway.ScriptDebug/targets/PluginDebug.targets
+++ b/src/ThingsGateway.ScriptDebug/targets/PluginDebug.targets
@@ -1,16 +1,16 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ThingsGateway.ScriptDebug/targets/Pro2.targets b/src/ThingsGateway.ScriptDebug/targets/Pro2.targets
index b26b38f65..d899444ea 100644
--- a/src/ThingsGateway.ScriptDebug/targets/Pro2.targets
+++ b/src/ThingsGateway.ScriptDebug/targets/Pro2.targets
@@ -30,7 +30,7 @@
-
+
diff --git a/src/ThingsGateway.ScriptDebug/targets/ProPluginDebug.targets b/src/ThingsGateway.ScriptDebug/targets/ProPluginDebug.targets
index be380f7f3..69f8cfff5 100644
--- a/src/ThingsGateway.ScriptDebug/targets/ProPluginDebug.targets
+++ b/src/ThingsGateway.ScriptDebug/targets/ProPluginDebug.targets
@@ -1,38 +1,38 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
diff --git a/src/ThingsGateway.Server/DockerPush.ps1 b/src/ThingsGateway.Server/DockerPush.ps1
index 8e225bb63..b5efed0ad 100644
--- a/src/ThingsGateway.Server/DockerPush.ps1
+++ b/src/ThingsGateway.Server/DockerPush.ps1
@@ -1,4 +1,4 @@
-docker pull mcr.microsoft.com/dotnet/aspnet:8.0-noble
+docker pull mcr.microsoft.com/dotnet/aspnet:10.0-noble-amd64
docker build -t registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway:latest .
diff --git a/src/ThingsGateway.Server/DockerPush_arm64.ps1 b/src/ThingsGateway.Server/DockerPush_arm64.ps1
index 411b9cf63..acf1002a2 100644
--- a/src/ThingsGateway.Server/DockerPush_arm64.ps1
+++ b/src/ThingsGateway.Server/DockerPush_arm64.ps1
@@ -1,4 +1,4 @@
-docker pull mcr.microsoft.com/dotnet/aspnet:8.0-noble-arm64v8
+docker pull mcr.microsoft.com/dotnet/aspnet:10.0-noble-arm64v8
docker build -f Dockerfile_arm64 -t registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway_arm64:latest .
diff --git a/src/ThingsGateway.Server/Dockerfile b/src/ThingsGateway.Server/Dockerfile
index 5c5b4dbd1..140321461 100644
--- a/src/ThingsGateway.Server/Dockerfile
+++ b/src/ThingsGateway.Server/Dockerfile
@@ -4,8 +4,8 @@
#拉取:docker pull registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway
#推送:docker push registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway
-#aspnetcore8.0环境
-FROM mcr.microsoft.com/dotnet/aspnet:8.0-noble AS base
+#aspnetcore10.0环境
+FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-amd64 AS base
COPY . /app
WORKDIR /app
#默认web
@@ -13,10 +13,9 @@ EXPOSE 5000
# 添加时区环境变量,亚洲,上海
ENV TimeZone=Asia/Shanghai
+ENV TZ=Asia/Shanghai
# 转发头
ENV ASPNETCORE_FORWARDEDHEADERS_ENABLED=true
-# 使用软连接,并且将时区配置覆盖/etc/timezone
-RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone
ENTRYPOINT ["dotnet", "ThingsGateway.Server.dll","--urls","http://*:5000"]
diff --git a/src/ThingsGateway.Server/Dockerfile_arm64 b/src/ThingsGateway.Server/Dockerfile_arm64
index 4f0b31e19..bff219a2e 100644
--- a/src/ThingsGateway.Server/Dockerfile_arm64
+++ b/src/ThingsGateway.Server/Dockerfile_arm64
@@ -4,8 +4,8 @@
#拉取:docker pull registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway_arm64
#推送:docker push registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway_arm64
-#aspnetcore8.0环境
-FROM mcr.microsoft.com/dotnet/aspnet:8.0-noble-arm64v8 AS base
+#aspnetcore10.0环境
+FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-arm64v8 AS base
COPY . /app
WORKDIR /app
#默认web
@@ -13,9 +13,8 @@ EXPOSE 5000
# 添加时区环境变量,亚洲,上海
ENV TimeZone=Asia/Shanghai
+ENV TZ=Asia/Shanghai
# 转发头
ENV ASPNETCORE_FORWARDEDHEADERS_ENABLED=true
-# 使用软连接,并且将时区配置覆盖/etc/timezone
-RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone
ENTRYPOINT ["dotnet", "ThingsGateway.Server.dll","--urls","http://*:5000"]
diff --git a/src/ThingsGateway.Server/ThingsGateway.Server.csproj b/src/ThingsGateway.Server/ThingsGateway.Server.csproj
index 8ddb7e4d3..25b692ecc 100644
--- a/src/ThingsGateway.Server/ThingsGateway.Server.csproj
+++ b/src/ThingsGateway.Server/ThingsGateway.Server.csproj
@@ -1,23 +1,24 @@
-
-
+
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
diff --git a/src/ThingsGateway.Server/targets/PluginDebug.targets b/src/ThingsGateway.Server/targets/PluginDebug.targets
index 6a72e913c..ccc93625e 100644
--- a/src/ThingsGateway.Server/targets/PluginDebug.targets
+++ b/src/ThingsGateway.Server/targets/PluginDebug.targets
@@ -1,16 +1,16 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ThingsGateway.Server/targets/Pro2.targets b/src/ThingsGateway.Server/targets/Pro2.targets
index 2a90e97d0..0e805c79b 100644
--- a/src/ThingsGateway.Server/targets/Pro2.targets
+++ b/src/ThingsGateway.Server/targets/Pro2.targets
@@ -30,7 +30,7 @@
-
+
diff --git a/src/ThingsGateway.Server/targets/ProPluginDebug.targets b/src/ThingsGateway.Server/targets/ProPluginDebug.targets
index 922805fd3..69f8cfff5 100644
--- a/src/ThingsGateway.Server/targets/ProPluginDebug.targets
+++ b/src/ThingsGateway.Server/targets/ProPluginDebug.targets
@@ -1,39 +1,38 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
+
+
+
+
diff --git a/wiki.json b/wiki.json
new file mode 100644
index 000000000..84b24f797
--- /dev/null
+++ b/wiki.json
@@ -0,0 +1,302 @@
+{
+ "repo_notes": [
+ {
+ "content": ""
+ }
+ ],
+ "pages": [
+ {
+ "title": "Overview",
+ "purpose": "Introduce ThingsGateway, explaining what it is, its core purpose as an industrial IoT gateway, and the high-level architecture",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Key Features",
+ "purpose": "List and describe the main features including multi-protocol support, plugin architecture, data persistence options, and deployment models",
+ "parent": "Overview",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "System Requirements and Dependencies",
+ "purpose": "Document the .NET versions, target frameworks, required NuGet packages, and system requirements",
+ "parent": "Overview",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Getting Started",
+ "purpose": "Provide quick-start guide for installing and running ThingsGateway",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Installation and Deployment",
+ "purpose": "Explain deployment options including Docker (x64/ARM64), web server, desktop application, and configuration basics",
+ "parent": "Getting Started",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Initial Configuration",
+ "purpose": "Guide users through initial setup including appsettings.json, environment variables, logging configuration, and first channel/device setup",
+ "parent": "Getting Started",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Architecture Overview",
+ "purpose": "Explain the overall system architecture including layered design, separation of concerns, and component relationships",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Layered Architecture",
+ "purpose": "Describe the Foundation, Gateway Application, and UI/Admin layers and their responsibilities",
+ "parent": "Architecture Overview",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Plugin System Architecture",
+ "purpose": "Explain the plugin architecture including Foundation vs Plugin layer separation, dynamic loading with AssemblyLoadContext, and plugin types",
+ "parent": "Architecture Overview",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Build System and Conditional Compilation",
+ "purpose": "Document the MSBuild-based build system including Directory.Build.props, conditional plugin loading, multi-targeting, and NuGet package generation",
+ "parent": "Architecture Overview",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Foundation Layer",
+ "purpose": "Document the core foundation libraries that provide protocol implementations and communication primitives",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Device Communication",
+ "purpose": "Explain DeviceBase abstraction, IDevice interface, protocol implementations, read/write operations, and data parsing",
+ "parent": "Foundation Layer",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Channel Architecture",
+ "purpose": "Document IChannel interface, channel implementations (TCP/UDP/Serial), channel options, and connection lifecycle",
+ "parent": "Foundation Layer",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Data Handling and Transformation",
+ "purpose": "Describe DataHandlingAdapter, message parsing, ThingsGatewayBitConverter for endianness/format conversion, and WaitHandlePool for request-response correlation",
+ "parent": "Foundation Layer",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Core Utilities",
+ "purpose": "Document TimerX scheduling, ExpiringDictionary caching, WaitLock concurrency primitives, and Reflect utilities",
+ "parent": "Foundation Layer",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Gateway Application",
+ "purpose": "Explain the main gateway application layer that orchestrates device communication and data flow",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Runtime Management System",
+ "purpose": "Document the entity-to-runtime conversion, GlobalData static registry, RuntimeServiceHelper, and runtime synchronization",
+ "parent": "Gateway Application",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Device Lifecycle Management",
+ "purpose": "Explain DeviceThreadManage, driver initialization, StartAsync/StopAsync lifecycle, TaskSchedulerLoop, and thread management",
+ "parent": "Gateway Application",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Variable Management",
+ "purpose": "Document VariableRuntime, VariableSourceRead, variable packing optimization, and data collection workflow",
+ "parent": "Gateway Application",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Concurrency and Read/Write Coordination",
+ "purpose": "Explain AsyncReadWriteLock, reader/writer priority, duty cycle control, and concurrent operation management",
+ "parent": "Gateway Application",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Event System",
+ "purpose": "Document GlobalData event dispatchers, VariableValueChangeEvent, DeviceStatusChangeEvent, AlarmChangedEvent, and event flow",
+ "parent": "Gateway Application",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Redundancy and Failover",
+ "purpose": "Explain device redundancy system, master/slave configuration, failover triggers, and variable state transfer",
+ "parent": "Gateway Application",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Plugin Development",
+ "purpose": "Guide for developing custom plugins for data collection and business logic integration",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Collection Plugins (CollectBase)",
+ "purpose": "Document how to create data collection plugins including protocol implementation, variable loading, and scheduled tasks",
+ "parent": "Plugin Development",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Business Plugins (BusinessBase)",
+ "purpose": "Explain business plugin development for data persistence, distribution, and serving protocols",
+ "parent": "Plugin Development",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Plugin Service and Dynamic Loading",
+ "purpose": "Document PluginService, AssemblyLoadContext usage, plugin discovery, driver instantiation, and property configuration",
+ "parent": "Plugin Development",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Plugin Packaging and Distribution",
+ "purpose": "Explain how to package plugins as NuGet packages, versioning, and deployment via Directory.build.targets",
+ "parent": "Plugin Development",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Built-in Protocols",
+ "purpose": "Document the built-in protocol implementations including Modbus, Siemens S7, OPC UA, OPC DA, and Dlt645",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Modbus Protocol",
+ "purpose": "Document Modbus Master/Slave implementations, RTU/TCP/UDP support, function codes, and address parsing",
+ "parent": "Built-in Protocols",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ },
+ {
+ "title": "Siemens S7 Protocol",
+ "purpose": "Explain S7 Master implementation, PLC types, area addressing, and data block access",
+ "parent": "Built-in Protocols",
+ "page_notes": [
+ {
+ "content": ""
+ }
+ ]
+ }
+ ]
+}