Files
I150/srcs/RobotNet10/RobotApp/RobotNet10.RobotApp.Client/Clients/ModbusTcpHubClient.cs
2026-07-03 16:37:12 +07:00

101 lines
2.9 KiB
C#

using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.SignalR.Client;
using RobotNet10.RobotApp.Client.Shared.Devices;
using RobotNet10.Shared;
namespace RobotNet10.RobotApp.Client.Clients;
/// <summary>
/// SignalR client để kết nối với ModbusTcpHub
/// </summary>
public class ModbusTcpHubClient : IAsyncDisposable
{
private readonly HubConnection _hubConnection;
private bool _disposed;
public bool IsConnected => _hubConnection.State == HubConnectionState.Connected;
public HubConnectionState ConnectionState => _hubConnection.State;
public ModbusTcpHubClient(NavigationManager navigationManager)
{
var hubUrl = navigationManager.ToAbsoluteUri("/hubs/devices/modbustcp");
_hubConnection = new HubConnectionBuilder()
.WithUrl(hubUrl)
.WithAutomaticReconnect()
.Build();
_hubConnection.Reconnecting += error =>
{
return Task.CompletedTask;
};
_hubConnection.Reconnected += connectionId =>
{
return Task.CompletedTask;
};
_hubConnection.Closed += error =>
{
return Task.CompletedTask;
};
}
public async Task StartAsync()
{
if (_hubConnection.State == HubConnectionState.Disconnected)
{
await _hubConnection.StartAsync();
}
}
public async Task StopAsync()
{
if (_hubConnection.State != HubConnectionState.Disconnected)
{
await _hubConnection.StopAsync();
}
}
public async Task<ModbusTcpData> GetModbusDataAsync(string deviceId)
{
var result = await _hubConnection.InvokeAsync<ModbusTcpData?>("GetModbusData", deviceId);
return result ?? new ModbusTcpData();
}
public async Task<DeviceInfoDto?> GetDeviceInfoAsync(string deviceId)
{
return await _hubConnection.InvokeAsync<DeviceInfoDto?>("GetDeviceInfo", deviceId);
}
/// <summary>
/// Ghi một coil vào device
/// </summary>
/// <param name="deviceId">Device ID</param>
/// <param name="address">Địa chỉ coil</param>
/// <param name="value">Giá trị cần ghi (true/false)</param>
/// <returns>True nếu thành công, false nếu thất bại</returns>
public async Task<bool> WriteCoilAsync(string deviceId, ushort address, bool value)
{
try
{
return await _hubConnection.InvokeAsync<bool>("WriteCoil", deviceId, address, value);
}
catch
{
return false;
}
}
public async ValueTask DisposeAsync()
{
if (_disposed)
return;
_disposed = true;
await StopAsync();
await _hubConnection.DisposeAsync();
GC.SuppressFinalize(this);
}
}