Initial commit
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user