Release DLL-only package v0.1.6

This commit is contained in:
su 2026-08-19 18:01:28 +08:00
parent affb537801
commit e82250b5e7
12 changed files with 152 additions and 10 deletions

View File

@ -1,5 +1,14 @@
# Changelog
## 0.1.6
- Added `FaceModuleManager` singleton lifecycle validation.
- Added default `FaceSdkSettings` loading from `Resources/AISU/SI-M1 Face SDK/FaceSdkSettings`.
- Added auto verify state, start/stop APIs, auto verify result event dispatch, and exclusive operation conflict handling.
- Added auto verify configuration fields to `FaceSdkSettings`.
- Limited Editor menu entries to Settings and License.
- Updated samples to use explicit auto verify start/stop and exclusive operation preparation.
## 0.1.5
- Fixed Unity 2021 compatibility for the obfuscated Runtime and Editor DLLs by removing invalid `System.Private.CoreLib` assembly references introduced during obfuscation.

Binary file not shown.

8
Resources.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 38a8adf823e04ed4ba6e7819d0d6f001
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
Resources/AISU.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 38a8adf823e04ed4ba6e7819d0d6f002
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 38a8adf823e04ed4ba6e7819d0d6f003
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,31 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8f79a6ea36b743d49ac4f2de7f2ea81f, type: 3}
m_Name: FaceSdkSettings
m_EditorClassIdentifier:
m_transportMode: 0
m_useMockInEditor: 0
m_portName: COM3
m_baudRate: 115200
m_readBufferSize: 4096
m_useEditorSerialDebugParameters: 1
m_editorPortName: COM3
m_editorBaudRate: 115200
m_editorReadBufferSize: 4096
m_mockResponseDelayFrames: 1
m_autoVerifyOnOpen: 0
m_autoVerifyTimeout: 10
m_stopAutoVerifyBeforeExclusiveCommand: 1
m_exclusiveCommandPolicy: 1
m_debugLogEnabled: 1
m_rawLogEnabled: 1
m_logPrefix: '[FaceModule]'

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 38a8adf823e04ed4ba6e7819d0d6f004
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -64,6 +64,7 @@ namespace Aisu.SIM1.Face.Samples.FaceDetectionDemo
m_manager.OnError += OnManagerError;
m_manager.OnReady += OnManagerReady;
m_manager.OnFaceStateUpdated += OnFaceStateUpdated;
m_manager.OnAutoVerifyResult += OnAutoVerifyResult;
}
if (m_serialDropdown != null)
@ -132,6 +133,7 @@ namespace Aisu.SIM1.Face.Samples.FaceDetectionDemo
m_manager.OnError -= OnManagerError;
m_manager.OnReady -= OnManagerReady;
m_manager.OnFaceStateUpdated -= OnFaceStateUpdated;
m_manager.OnAutoVerifyResult -= OnAutoVerifyResult;
m_manager.Close();
}
@ -350,6 +352,17 @@ namespace Aisu.SIM1.Face.Samples.FaceDetectionDemo
SetResult("人脸状态: " + FaceProtocolEncoding.FaceStateMessage(state.State));
}
private void OnAutoVerifyResult(FaceAutoVerifyResult result)
{
if (result.Success)
{
SetResult("自动检测成功,UserID=" + result.VerifyResult.UserId + ",姓名=" + result.VerifyResult.UserName);
return;
}
SetResult("自动检测结果: " + FaceProtocolEncoding.ResultMessage(result.ResultCode));
}
private void OnManagerError(FaceResultCode _, string message)
{
LogError("SDK 错误: " + message);
@ -383,6 +396,12 @@ namespace Aisu.SIM1.Face.Samples.FaceDetectionDemo
private async Task EnsureModuleStandbyAsync(string operationName)
{
if (m_manager.IsAutoVerifyEnabled)
{
await m_manager.EnsureExclusiveOperationReadyAsync(operationName);
return;
}
var status = await m_manager.Basic.GetStatusAsync();
if (status == FaceModuleStatus.Busy)
{

View File

@ -361,8 +361,15 @@ namespace Aisu.SIM1.Face.Core
{
try
{
var result = await Manager.Verify.AutoVerifyAsync(AutoVerifyEnable, VerifyTimeout);
Log("自动验证完成:成功=" + result.Success + ",用户ID=" + result.UserId);
if (AutoVerifyEnable)
{
await Manager.StartAutoVerifyAsync(VerifyTimeout);
Log("自动验证已开启,识别结果通过事件回调。");
return;
}
await Manager.StopAutoVerifyAsync(VerifyTimeout);
Log("自动验证已关闭。");
}
catch (Exception ex) { LogError("自动验证失败:" + ex.Message); }
}

View File

@ -401,6 +401,7 @@ namespace Aisu.SIM1.Face.UI.Pages
base.Init(manager, logPanel, loadingView);
m_boundManager = m_manager;
m_manager.OnFaceStateUpdated += OnFaceState;
m_manager.OnAutoVerifyResult += OnAutoVerifyResult;
}
private void OnDestroy()
@ -417,9 +418,14 @@ namespace Aisu.SIM1.Face.UI.Pages
RunAsync(async () =>
{
if (!RequireReady()) return;
var result = m_autoToggle.isOn
? await m_manager.Verify.AutoVerifyAsync(true, ReadByte(m_timeoutInput, 10))
: await m_manager.Verify.VerifyAsync(ReadByte(m_timeoutInput, 10), ReadByte(m_maxTimesInput, 30));
if (m_autoToggle.isOn)
{
await m_manager.StartAutoVerifyAsync(ReadByte(m_timeoutInput, 10));
SetResult("自动验证已开启");
return;
}
var result = await m_manager.Verify.VerifyAsync(ReadByte(m_timeoutInput, 10), ReadByte(m_maxTimesInput, 30));
ShowResult(result);
});
}
@ -430,7 +436,19 @@ namespace Aisu.SIM1.Face.UI.Pages
/// </summary>
public void StopVerify()
{
RunAsync(async () => { if (RequireConnected()) { await m_manager.Basic.ResetAsync(); SetResult("已停止验证"); } });
RunAsync(async () =>
{
if (!RequireConnected()) return;
if (m_manager.IsAutoVerifyEnabled)
{
await m_manager.StopAutoVerifyAsync();
SetResult("自动验证已关闭");
return;
}
await m_manager.Basic.ResetAsync();
SetResult("已停止验证");
});
}
/// <summary>
@ -455,11 +473,17 @@ namespace Aisu.SIM1.Face.UI.Pages
SetResult(result.Success ? "验证成功" : FaceProtocolEncoding.ResultMessage(result.ResultCode));
}
private void OnAutoVerifyResult(FaceAutoVerifyResult result)
{
ShowResult(result.VerifyResult);
}
private void UnbindManagerEvents()
{
if (m_boundManager != null)
{
m_boundManager.OnFaceStateUpdated -= OnFaceState;
m_boundManager.OnAutoVerifyResult -= OnAutoVerifyResult;
m_boundManager = null;
}
}
@ -545,6 +569,8 @@ namespace Aisu.SIM1.Face.UI.Pages
return;
}
await m_manager.EnsureExclusiveOperationReadyAsync("人脸录入");
FaceEnrollResult result;
if (m_modeDropdown.value == 1)
{
@ -594,7 +620,7 @@ namespace Aisu.SIM1.Face.UI.Pages
/// </summary>
public void CancelEnroll()
{
RunAsync(async () => { if (RequireConnected()) { await m_manager.Basic.FaceResetAsync(); SetResult("已取消录入"); } });
RunAsync(async () => { if (RequireConnected()) { await m_manager.EnsureExclusiveOperationReadyAsync("取消录入"); await m_manager.Basic.FaceResetAsync(); SetResult("已取消录入"); } });
}
/// <summary>
@ -674,6 +700,7 @@ namespace Aisu.SIM1.Face.UI.Pages
RunAsync(async () =>
{
if (!RequireReady()) return;
await m_manager.EnsureExclusiveOperationReadyAsync("查询用户");
var info = await m_manager.Users.GetUserInfoAsync(ReadInt(m_userIdInput, 0));
m_detailText.text = $"用户详情: ID={info.UserId} Name={info.UserName} Admin={info.IsAdmin}";
SetResult("查询成功");
@ -688,6 +715,7 @@ namespace Aisu.SIM1.Face.UI.Pages
RunAsync(async () =>
{
if (!RequireReady()) return;
await m_manager.EnsureExclusiveOperationReadyAsync("删除用户");
await m_manager.Users.DeleteUserAsync(ReadInt(m_userIdInput, 0));
SetResult("删除成功");
await RefreshIds(false);
@ -716,6 +744,7 @@ namespace Aisu.SIM1.Face.UI.Pages
RunAsync(async () =>
{
if (!RequireReady()) return;
await m_manager.EnsureExclusiveOperationReadyAsync("删除全部用户");
await m_manager.Users.DeleteAllAsync();
SetResult("全部用户已删除");
await RefreshIds(false);
@ -743,6 +772,7 @@ namespace Aisu.SIM1.Face.UI.Pages
/// </summary>
private async System.Threading.Tasks.Task RefreshIds(bool useV2)
{
await m_manager.EnsureExclusiveOperationReadyAsync("刷新用户列表");
var ids = useV2 ? await m_manager.Users.GetAllUserIds2Async() : await m_manager.Users.GetAllUserIdsAsync();
m_listText.text = string.Join("\n", ids.ConvertAll(id => "UserID: " + id));
SetResult("用户列表已刷新");
@ -791,6 +821,7 @@ namespace Aisu.SIM1.Face.UI.Pages
RunAsync(async () =>
{
if (!RequireReady()) return;
await m_manager.EnsureExclusiveOperationReadyAsync("扫码");
var qr = await m_manager.QrCode.ScanQrCodeAsync(ReadByte(m_timeoutInput, 10));
m_qrText.text = "二维码内容: " + qr;
SetResult(string.IsNullOrEmpty(qr) ? "二维码为空" : "扫码成功");
@ -802,7 +833,7 @@ namespace Aisu.SIM1.Face.UI.Pages
/// </summary>
public void AutoScan()
{
RunAsync(async () => { if (RequireReady()) { await m_manager.Verify.AutoVerifyAsync(true, ReadByte(m_timeoutInput, 10)); SetResult("自动探测已启动"); } });
RunAsync(async () => { if (RequireReady()) { await m_manager.StartAutoVerifyAsync(ReadByte(m_timeoutInput, 10)); SetResult("自动探测已启动"); } });
}
/// <summary>
@ -810,7 +841,19 @@ namespace Aisu.SIM1.Face.UI.Pages
/// </summary>
public void Stop()
{
RunAsync(async () => { if (RequireConnected()) { await m_manager.Basic.ResetAsync(); SetResult("已停止"); } });
RunAsync(async () =>
{
if (!RequireConnected()) return;
if (m_manager.IsAutoVerifyEnabled)
{
await m_manager.StopAutoVerifyAsync();
SetResult("自动探测已停止");
return;
}
await m_manager.Basic.ResetAsync();
SetResult("已停止");
});
}
/// <summary>
@ -883,6 +926,7 @@ namespace Aisu.SIM1.Face.UI.Pages
RunAsync(async () =>
{
if (!RequireReady()) return;
await m_manager.EnsureExclusiveOperationReadyAsync("图片抓拍");
FaceImageResult result;
if (type == "Face") result = await m_manager.Images.SnapUploadFaceImageAsync();
else if (type == "Large") result = await m_manager.Images.SnapUploadLargeImageAsync((ImageDpi)m_dpiDropdown.value);

View File

@ -1,7 +1,7 @@
{
"name": "xin.aisu.si-m1.face",
"displayName": "AISU SI-M1 Face SDK",
"version": "0.1.0",
"version": "0.1.6",
"unity": "2021.3",
"description": "Unity UPM package for the AISU SI-M1 face recognition module protocol, transport, command services, lifecycle manager, tests, and demo sample.",
"author": {