增加授权功能Readme文件。

This commit is contained in:
QI Mingxuan
2026-05-19 17:01:06 +08:00
parent 2d56f42d28
commit 14f41321c7
+184
View File
@@ -0,0 +1,184 @@
# 授权服务使用指南 | License Service Usage Guide
## 概述 | Overview
XplorePlane 通过 `XP.Common.License` 命名空间下的 `ILicenseService` 提供统一的授权管理。底层基于海克斯康 CLMSComputational License Management SystemSDK,使用 `MORCODE.dll` 进行许可证校验。
## 产品授权信息 | Product License Information
| 项目 | 值 |
| --- | --- |
| CLMS 模块 IDModule ID | `4` |
| 零件号(Part Number | `LS950-0071-5-1` |
`Module ID` 是 CLMS 在 SDK 中标识本产品的唯一编号,调用 `CLM_ModuleIsLicensed` 时必须传入此值;`Part Number` 是产品在 CLMS 许可发行系统中的物料编号,用于申请、签发、续期许可证。
## 授权模式 | License Modes
`LicenseMode` 枚举定义见 `XP.Common.License.Enums.LicenseMode`
| 模式 | 枚举值 | 数值 | 说明 |
| --- | --- | --- | --- |
| CLMS 正式授权 | `Clms` | `0` | 通过 CLMS SDK 进行完整授权校验,包含登录、许可范围、模块、SMA、到期日期等检查 |
| 临时测试模式 | `TemporaryTest` | `885` | 不调用 CLMS SDK,直接放行 15 分钟,用于研发/测试场景 |
## 配置项 | Configuration Items
授权配置位于主应用 `App.config` 中,键前缀为 `License:`,对应 `XP.Common.License.Configs.LicenseConfig`
```xml
<appSettings>
<!-- 授权配置 | License configuration -->
<add key="License:LicenseMode" value="0" /> <!-- 授权模式:0=CLMS 正式授权,885=临时测试模式 -->
<add key="License:ModuleId" value="4" /> <!-- 模块 IDXplorePlane 固定为 4 -->
<add key="License:UseSma" value="false" /> <!-- 是否启用 SMA 检查 -->
<add key="License:LicenseState" value="20" /> <!-- 上次授权状态:10=成功,20=失败(运行时由 LicenseService 自动写回)-->
</appSettings>
```
| 键 | 类型 | 默认值 | 有效值 | 说明 |
| --- | --- | --- | --- | --- |
| `License:LicenseMode` | int | `0` | `0``885` | 授权模式 |
| `License:ModuleId` | ushort | `4` | `1` ~ `65535` | CLMS 模块 ID |
| `License:UseSma` | bool | `false` | `true``false` | 是否启用 SMA(软件维护协议)校验 |
| `License:LicenseState` | int | `20` | `10``20` | 上次运行时的授权结果,由服务自动维护 |
> 配置中无效或缺失的键会回退到默认值,详见 `XP.Common.License.Configs.ConfigLoader`。
## 正式授权流程 | Formal Authorization Flow
`LicenseMode = 0``Clms`)时,`LicenseService.CheckAuthorization()` 依次执行以下步骤:
1. **系统时间检查**(可选):调用 `CLM_CheckSystemTime`,老版本 SDK 缺失此入口点时跳过。
2. **登录验证**:调用 `CLM_Login`(核心步骤,必须存在)。
3. **许可范围检查**:调用 `CLM_Login_Scope`(核心步骤)。
4. **SMA 验证**(可选):仅当 `License:UseSma = true` 时执行。比较 SMA 年份/季度与当前软件主版本号/次版本号,季度不匹配会判定失败。
5. **浮动许可信息**(可选):通过 `CLM_GetIP` 获取 IP 与端口。
6. **错误信息读取**(可选):通过 `CLM_GetError` 拉取 SDK 端错误描述。
7. **模块授权检查**:调用 `CLM_ModuleIsLicensed`,传入 `Module ID = 4`
8. **到期日期获取**:调用 `CLM_GetWarrantyExpiration`,剩余 ≤ 30 天时记录警告。
任意核心步骤失败即视为授权失败,写回 `License:LicenseState = 20`,主应用弹窗提示并退出。
## 临时测试模式 | Temporary Test Mode
`LicenseMode = 885``TemporaryTest`)用于跳过 CLMS 校验,便于离线开发和功能演示。
### 行为 | Behavior
- 不加载 `MORCODE.dll`,不调用任何 CLMS API,授权直接通过。
- 启动后立刻开启 15 分钟(900 秒)倒计时,到期触发 `TestModeTimeout` 事件,主应用应执行优雅关闭。
- 倒计时途中分别在剩余 5 分钟、1 分钟时触发 `TestModeWarning5Min``TestModeWarning1Min` 事件用于提醒。
- 上述三个事件只在临时测试模式下被触发,正式授权(`Clms`)下不会创建计时器。
### 启用方式 | How to Enable
修改主应用 `App.config`
```xml
<add key="License:LicenseMode" value="885" />
```
启动后将看到提示:「当前为临时测试模式,软件将在 15 分钟后自动关闭」。
> **注意**:临时测试模式仅用于研发与内部测试场景,**禁止用于生产或交付**。发布前请务必将 `License:LicenseMode` 还原为 `0`。
## 使用示例 | Usage Examples
### 注入并校验 | Inject and Verify
```csharp
using XP.Common.License.Interfaces;
using XP.Common.License.Enums;
public class StartupChecker
{
private readonly ILicenseService _licenseService;
private readonly ILoggerService _logger;
public StartupChecker(ILicenseService licenseService, ILoggerService logger)
{
_licenseService = licenseService ?? throw new ArgumentNullException(nameof(licenseService));
_logger = logger?.ForModule<StartupChecker>() ?? throw new ArgumentNullException(nameof(logger));
}
public bool Run()
{
var result = _licenseService.CheckAuthorization();
if (!result.IsAuthorized)
{
_logger.Error(null, "授权失败:{Message} | License failed: {Message}", result.Message);
return false;
}
// 仅在临时测试模式下订阅倒计时事件 | Subscribe countdown events only in test mode
if (_licenseService.LicenseMode == LicenseMode.TemporaryTest)
{
_licenseService.TestModeWarning5Min += (s, e) => _logger.Warn("临时测试模式剩余 5 分钟");
_licenseService.TestModeWarning1Min += (s, e) => _logger.Warn("临时测试模式剩余 1 分钟");
_licenseService.TestModeTimeout += (s, e) => Application.Current.Shutdown();
}
return true;
}
}
```
### 检查特定模块授权 | Check Module Authorization
```csharp
const ushort XplorePlaneModuleId = 4;
if (!_licenseService.IsModuleLicensed(XplorePlaneModuleId))
{
_logger.Warn("模块 {ModuleId} 未授权 | Module {ModuleId} not licensed", XplorePlaneModuleId);
}
```
### 读取授权信息 | Read License Information
```csharp
DateTime? expiration = _licenseService.GetExpirationDate(); // 授权到期日期
DateTime? sma = _licenseService.GetSmaDate(); // SMA 到期日期
int remaining = _licenseService.GetRemainingTestTime(); // 临时测试剩余秒数;非测试模式返回 -1
```
## 接口与事件 | Interface & Events
`ILicenseService` 提供以下成员(详见 `XP.Common.License.Interfaces.ILicenseService`):
- `LicenseCheckResult CheckAuthorization()`:执行完整授权校验。
- `bool IsAuthorized`:当前会话是否已授权。
- `LicenseMode LicenseMode`:当前授权模式。
- `DateTime? GetExpirationDate()`:授权到期日期。
- `DateTime? GetSmaDate()`SMA 到期日期。
- `bool IsModuleLicensed(ushort moduleId)`:检查指定模块是否被授权。
- `int GetRemainingTestTime()`:临时测试模式剩余秒数。
- 事件:`TestModeWarning5Min``TestModeWarning1Min``TestModeTimeout`
## 常见问题 | FAQ
### 1. 启动时提示 `MORCODE.dll 加载失败` | `Failed to load MORCODE.dll`
确认 `MORCODE.dll` 已随 `ReleaseFiles` 一同部署,并位于主程序同级目录。研发阶段可临时切换到临时测试模式绕过。
### 2. 提示「模块号码 4 不可用」| `Module 4 unavailable`
CLMS 服务器签发的许可证未包含 `Module ID = 4`(零件号 `LS950-0071-5-1`)。请联系海克斯康许可团队确认许可范围。
### 3. SMA 校验失败 | SMA validation failed
SMA 年份必须 ≥ 软件主版本号;同年时 SMA 季度必须 ≥ 软件次版本号。若需临时绕过,可将 `License:UseSma` 设为 `false`,但发布版本仍应保持 SMA 校验启用。
### 4. 授权成功后是否还有倒计时?| Will the countdown still trigger after a successful formal authorization?
不会。倒计时仅在 `LicenseMode = TemporaryTest` 时启动,`Clms` 正式授权下三个事件永远不会被触发。
## 相关文件 | Related Files
- `XP.Common/License/Interfaces/ILicenseService.cs` — 服务接口
- `XP.Common/License/Implementations/LicenseService.cs` — 服务实现
- `XP.Common/License/Configs/LicenseConfig.cs` — 配置实体
- `XP.Common/License/Configs/ConfigLoader.cs` — 配置加载器
- `XP.Common/License/Enums/LicenseMode.cs` — 授权模式枚举
- `XP.Common/License/Enums/LicenseState.cs` — 授权状态枚举
- `XP.Common/License/Native/NativeMethods.cs` — CLMS SDK P/Invoke 封装
- `XplorePlane/App.xaml.cs` — 主应用启动时调用 `PerformLicenseCheck()` 的入口