You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
6.5 KiB
255 lines
6.5 KiB
3 days ago
|
using CoreAgent.Domain.Interfaces;
|
||
6 days ago
|
using CoreAgent.Domain.Interfaces.Network;
|
||
3 days ago
|
using CoreAgent.Domain.Models.Network;
|
||
6 days ago
|
using CoreAgent.Domain.Models.System;
|
||
3 days ago
|
using Microsoft.Extensions.Options;
|
||
6 days ago
|
|
||
3 days ago
|
namespace CoreAgent.Infrastructure.Contexts;
|
||
6 days ago
|
|
||
|
/// <summary>
|
||
|
/// 蜂窝网络领域上下文
|
||
|
/// </summary>
|
||
3 days ago
|
public class CellularNetworkContext : ICellularNetworkContext, IDisposable
|
||
6 days ago
|
{
|
||
|
private readonly object _lock = new();
|
||
4 days ago
|
private CellularNetworkState _networkState;
|
||
3 days ago
|
private readonly NetworkCommandConfig _networkCommandConfig;
|
||
|
private readonly AppSettings _appSettings;
|
||
4 days ago
|
private string _neConfigKey = string.Empty;
|
||
3 days ago
|
private CancellationTokenSource _token;
|
||
4 days ago
|
private bool _isDisposed;
|
||
|
private bool _isInitialized;
|
||
3 days ago
|
private readonly INetworkIPEndPointManager _networkIPEndPointManager;
|
||
4 days ago
|
|
||
6 days ago
|
/// <summary>
|
||
3 days ago
|
/// 获取取消令牌源
|
||
6 days ago
|
/// </summary>
|
||
3 days ago
|
public CancellationTokenSource TokenSource => _token;
|
||
6 days ago
|
|
||
3 days ago
|
/// <summary>
|
||
|
/// 是否已初始化
|
||
|
/// </summary>
|
||
|
public bool IsInitialized => _isInitialized;
|
||
|
|
||
3 days ago
|
/// <summary>
|
||
|
/// 网络IP端点管理器
|
||
|
/// </summary>
|
||
|
public INetworkIPEndPointManager NetworkIPEndPointManager => _networkIPEndPointManager;
|
||
|
|
||
3 days ago
|
public CellularNetworkContext(
|
||
|
IOptions<NetworkCommandConfig> networkCommandConfig,
|
||
3 days ago
|
IOptions<AppSettings> appSettings,
|
||
|
INetworkIPEndPointManager networkIPEndPointManager)
|
||
4 days ago
|
{
|
||
|
_isDisposed = false;
|
||
|
_isInitialized = false;
|
||
3 days ago
|
_token = new CancellationTokenSource();
|
||
|
_networkCommandConfig = networkCommandConfig?.Value ?? throw new ArgumentNullException(nameof(networkCommandConfig));
|
||
|
_appSettings = appSettings?.Value ?? throw new ArgumentNullException(nameof(appSettings));
|
||
3 days ago
|
_networkIPEndPointManager = networkIPEndPointManager ?? throw new ArgumentNullException(nameof(networkIPEndPointManager));
|
||
4 days ago
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 初始化上下文
|
||
|
/// </summary>
|
||
3 days ago
|
/// <param name="neConfigKey">网络配置键</param>
|
||
|
public void Initialize(string neConfigKey)
|
||
4 days ago
|
{
|
||
3 days ago
|
if (_isDisposed)
|
||
4 days ago
|
{
|
||
3 days ago
|
throw new ObjectDisposedException(nameof(CellularNetworkContext));
|
||
|
}
|
||
|
|
||
|
if (_isInitialized)
|
||
|
{
|
||
|
return;
|
||
4 days ago
|
}
|
||
6 days ago
|
|
||
3 days ago
|
if (string.IsNullOrEmpty(neConfigKey))
|
||
|
{
|
||
|
throw new ArgumentNullException(nameof(neConfigKey));
|
||
|
}
|
||
|
|
||
6 days ago
|
lock (_lock)
|
||
|
{
|
||
3 days ago
|
_networkIPEndPointManager.Clear();
|
||
3 days ago
|
_neConfigKey = neConfigKey;
|
||
3 days ago
|
_networkState = new CellularNetworkState(_neConfigKey);
|
||
|
_isInitialized = true;
|
||
6 days ago
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 获取网络命令配置
|
||
|
/// </summary>
|
||
|
/// <returns>网络命令配置</returns>
|
||
|
public NetworkCommandConfig GetNetworkCommandConfig()
|
||
|
{
|
||
3 days ago
|
if (_isDisposed)
|
||
6 days ago
|
{
|
||
3 days ago
|
throw new ObjectDisposedException(nameof(CellularNetworkContext));
|
||
|
}
|
||
4 days ago
|
|
||
3 days ago
|
if (!_isInitialized)
|
||
|
{
|
||
|
throw new InvalidOperationException("上下文未初始化");
|
||
|
}
|
||
4 days ago
|
|
||
3 days ago
|
lock (_lock)
|
||
|
{
|
||
4 days ago
|
return _networkCommandConfig ?? throw new InvalidOperationException("网络命令配置未设置");
|
||
6 days ago
|
}
|
||
|
}
|
||
|
|
||
3 days ago
|
/// <summary>
|
||
|
/// 获取网络配置键
|
||
|
/// </summary>
|
||
6 days ago
|
public string GetNeConfigKey()
|
||
|
{
|
||
3 days ago
|
if (_isDisposed)
|
||
6 days ago
|
{
|
||
3 days ago
|
throw new ObjectDisposedException(nameof(CellularNetworkContext));
|
||
|
}
|
||
4 days ago
|
|
||
3 days ago
|
if (!_isInitialized)
|
||
|
{
|
||
|
throw new InvalidOperationException("上下文未初始化");
|
||
|
}
|
||
4 days ago
|
|
||
3 days ago
|
lock (_lock)
|
||
|
{
|
||
4 days ago
|
return _neConfigKey;
|
||
6 days ago
|
}
|
||
|
}
|
||
4 days ago
|
|
||
6 days ago
|
/// <summary>
|
||
|
/// 获取指定类型的命令配置
|
||
|
/// </summary>
|
||
|
/// <param name="type">命令类型</param>
|
||
|
/// <returns>命令配置列表</returns>
|
||
|
public List<CommandTemplateConfig> GetCommandsByType(NetworkCommandType type)
|
||
|
{
|
||
|
lock (_lock)
|
||
|
{
|
||
|
return _networkCommandConfig?.GetCommandsByType(type) ?? new List<CommandTemplateConfig>();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 获取所有命令类型
|
||
|
/// </summary>
|
||
|
/// <returns>命令类型数组</returns>
|
||
|
public NetworkCommandType[] GetCommandTypes()
|
||
|
{
|
||
|
lock (_lock)
|
||
|
{
|
||
|
return _networkCommandConfig?.GetCommandTypes() ?? Array.Empty<NetworkCommandType>();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
4 days ago
|
/// 获取网络状态
|
||
6 days ago
|
/// </summary>
|
||
|
/// <returns>网络状态</returns>
|
||
4 days ago
|
public CellularNetworkState GetNetworkState()
|
||
6 days ago
|
{
|
||
3 days ago
|
if (_isDisposed)
|
||
6 days ago
|
{
|
||
3 days ago
|
throw new ObjectDisposedException(nameof(CellularNetworkContext));
|
||
|
}
|
||
4 days ago
|
|
||
3 days ago
|
if (!_isInitialized)
|
||
|
{
|
||
|
throw new InvalidOperationException("上下文未初始化");
|
||
|
}
|
||
4 days ago
|
|
||
3 days ago
|
lock (_lock)
|
||
|
{
|
||
4 days ago
|
return _networkState ?? throw new InvalidOperationException("网络状态未初始化");
|
||
6 days ago
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
4 days ago
|
/// 重置上下文状态
|
||
6 days ago
|
/// </summary>
|
||
4 days ago
|
public void Reset()
|
||
6 days ago
|
{
|
||
3 days ago
|
if (_isDisposed)
|
||
6 days ago
|
{
|
||
3 days ago
|
throw new ObjectDisposedException(nameof(CellularNetworkContext));
|
||
|
}
|
||
4 days ago
|
|
||
3 days ago
|
if (!_isInitialized)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
4 days ago
|
|
||
3 days ago
|
lock (_lock)
|
||
|
{
|
||
|
_token.Cancel();
|
||
|
_token = new CancellationTokenSource();
|
||
3 days ago
|
_neConfigKey = string.Empty;
|
||
|
_isInitialized = false;
|
||
|
_networkState = new CellularNetworkState(string.Empty);
|
||
3 days ago
|
_networkIPEndPointManager.Clear();
|
||
6 days ago
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
3 days ago
|
/// 取消操作
|
||
6 days ago
|
/// </summary>
|
||
3 days ago
|
public void Cancel()
|
||
6 days ago
|
{
|
||
4 days ago
|
if (_isDisposed)
|
||
|
{
|
||
3 days ago
|
throw new ObjectDisposedException(nameof(CellularNetworkContext));
|
||
4 days ago
|
}
|
||
|
|
||
6 days ago
|
lock (_lock)
|
||
|
{
|
||
3 days ago
|
_token.Cancel();
|
||
6 days ago
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
3 days ago
|
/// 获取应用设置
|
||
6 days ago
|
/// </summary>
|
||
3 days ago
|
public AppSettings GetAppSettings()
|
||
6 days ago
|
{
|
||
3 days ago
|
if (_isDisposed)
|
||
|
{
|
||
|
throw new ObjectDisposedException(nameof(CellularNetworkContext));
|
||
|
}
|
||
6 days ago
|
|
||
3 days ago
|
if (!_isInitialized)
|
||
|
{
|
||
|
throw new InvalidOperationException("上下文未初始化");
|
||
|
}
|
||
6 days ago
|
|
||
3 days ago
|
return _appSettings;
|
||
6 days ago
|
}
|
||
|
|
||
|
/// <summary>
|
||
3 days ago
|
/// 释放资源
|
||
6 days ago
|
/// </summary>
|
||
3 days ago
|
public void Dispose()
|
||
6 days ago
|
{
|
||
3 days ago
|
if (_isDisposed)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
6 days ago
|
|
||
3 days ago
|
lock (_lock)
|
||
|
{
|
||
|
if (_isDisposed)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
_token?.Cancel();
|
||
|
_token?.Dispose();
|
||
|
_isInitialized = false;
|
||
|
_isDisposed = true;
|
||
|
}
|
||
6 days ago
|
}
|
||
|
}
|