using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using X1.DynamicClientCore.Interfaces;
using X1.DynamicClientCore.Models;
namespace X1.DynamicClientCore.Features.Service
{
///
/// 设备协议客户端实现类
/// 提供与设备设备通信的协议服务,包括设备信息获取、网络控制等功能
///
///
/// 实现 IInstrumentProtocolClient 和 IBaseInstrumentClient 接口
/// 支持动态服务端点管理和HTTP通信
///
public class InstrumentProtocolClient : IInstrumentHttpClient
{
private readonly ILogger _logger;
private readonly IDynamicHttpClient _dynamicHttpClient;
private readonly IServiceEndpointManager _serviceEndpointManager;
///
/// 初始化设备协议客户端
///
/// 动态HTTP客户端
/// 服务端点管理器
/// 日志记录器
/// 当任何必需参数为null时抛出
public InstrumentProtocolClient(
IDynamicHttpClient dynamicHttpClient,
IServiceEndpointManager serviceEndpointManager,
ILogger logger)
{
_dynamicHttpClient = dynamicHttpClient ?? throw new ArgumentNullException(nameof(dynamicHttpClient));
_serviceEndpointManager = serviceEndpointManager ?? throw new ArgumentNullException(nameof(serviceEndpointManager));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
///
/// 获取设备序列号
///
/// 服务端点配置
/// 请求选项
/// 取消令牌
/// 设备序列号,如果获取失败则返回空字符串
/// 当endpoint为null时抛出
public async Task GetDeviceSerialNumberAsync(
string instrumentNumber,
RequestOptions? options = null,
CancellationToken cancellationToken = default)
{
if (string.IsNullOrWhiteSpace(instrumentNumber))
throw new ArgumentException("设备编号不能为空", nameof(instrumentNumber));
try
{
_logger.LogDebug("开始获取设备序列号,端点:{EndpointName}", instrumentNumber);
// 发送HTTP请求获取设备信息
var response = await _dynamicHttpClient.GetAsync>(
instrumentNumber,
"System/serial-number",
options,
cancellationToken);
if (response == null)
{
_logger.LogWarning("获取设备序列号失败:响应为空,端点:{EndpointName}", instrumentNumber);
return string.Empty;
}
if (!response.IsSuccess)
{
_logger.LogWarning("获取设备序列号失败:请求未成功,端点:{EndpointName},错误:{ErrorMessage}",
instrumentNumber, response.Message ?? "未知错误");
return string.Empty;
}
var serialNumber = response.Data?.SerialNumber ?? string.Empty;
_logger.LogInformation("成功获取设备序列号:{SerialNumber},端点:{EndpointName}",
serialNumber, instrumentNumber);
return serialNumber;
}
catch (Exception ex)
{
_logger.LogError(ex, "获取设备序列号时发生异常,端点:{EndpointName}", instrumentNumber);
return string.Empty;
}
}
///
/// 启动网络连接
///
/// 设备编号
/// 请求选项
/// 取消令牌
/// 异步任务
/// 当instrumentNumber为空或null时抛出
public async Task StartNetworkAsync(
CellularNetworkConfiguration cellular,
RequestOptions? options = null,
CancellationToken cancellationToken = default)
{
string instrumentNumber = cellular.DeviceCode;
if (string.IsNullOrWhiteSpace(instrumentNumber))
throw new ArgumentException("设备编号不能为空", nameof(instrumentNumber));
try
{
_logger.LogInformation("开始启动网络连接,设备编号:{InstrumentNumber}", instrumentNumber);
var response = await _dynamicHttpClient.PostAsync>(
instrumentNumber,
"CellularNetwork/generalStart",
cellular,
options,
cancellationToken);
if (response == null)
{
_logger.LogWarning("获取启动网络连接失败:响应为空,端点:{EndpointName}", instrumentNumber);
return false;
}
if (!response.IsSuccess)
{
_logger.LogWarning("获取启动网络连接失败:请求未成功,端点:{EndpointName},错误:{ErrorMessage}",
instrumentNumber, response.Message ?? "未知错误");
return false;
}
if (response.Data != NetworkStatus.Connected)
{
_logger.LogWarning("获取启动网络连接:请求未成功,端点:{EndpointName},错误:{ErrorMessage}",
instrumentNumber, response.Message ?? "未知错误");
return false;
}
_logger.LogInformation("网络连接启动完成,设备编号:{InstrumentNumber}", instrumentNumber);
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, "启动网络连接时发生异常,设备编号:{InstrumentNumber}", instrumentNumber);
return false;
}
}
///
/// 停止网络连接
///
/// 设备编号
/// 请求选项
/// 取消令牌
/// 异步任务
/// 当instrumentNumber为空或null时抛出
public async Task StopNetworkAsync(
string instrumentNumber,
RequestOptions? options = null,
CancellationToken cancellationToken = default)
{
if (string.IsNullOrWhiteSpace(instrumentNumber))
throw new ArgumentException("设备编号不能为空", nameof(instrumentNumber));
try
{
_logger.LogInformation("开始停止网络连接,设备编号:{InstrumentNumber}", instrumentNumber);
// TODO: 实现网络停止逻辑
// 这里需要根据具体的协议实现来调用相应的API
await Task.CompletedTask.ConfigureAwait(false);
_logger.LogInformation("网络连接停止完成,设备编号:{InstrumentNumber}", instrumentNumber);
}
catch (Exception ex)
{
_logger.LogError(ex, "停止网络连接时发生异常,设备编号:{InstrumentNumber}", instrumentNumber);
throw;
}
}
}
}