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; } } } }