Creado apartir del commit b888de6c92056de294456f581a56e25e734d4ab7 de develop
This commit is contained in:
@@ -0,0 +1,209 @@
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using adas_core.Domain.Enums;
|
||||
using adas_core.Domain.Models.MongoModels;
|
||||
using adas_core.module.Relays.Models;
|
||||
using Serilog;
|
||||
|
||||
namespace adas_core.module.Relays.Devices;
|
||||
|
||||
public class KmTronicRelay(Relay relay, RelaySettings relaySettings)
|
||||
: RelayDevice(relay, relaySettings)
|
||||
{
|
||||
private UdpClient? _udpClient;
|
||||
|
||||
public bool DeviceStatus { get; set; }
|
||||
|
||||
public override bool CheckDevice()
|
||||
{
|
||||
CheckStatus();
|
||||
var result = GetStatusRelay(1);
|
||||
return result != RelayEnum.Status.Unknown;
|
||||
}
|
||||
|
||||
public override bool GetStatusRelay()
|
||||
{
|
||||
var status = Send("FF0000");
|
||||
//while (!status.IsCompleted)
|
||||
//{
|
||||
|
||||
//}
|
||||
//return !string.IsNullOrEmpty(status.Result);
|
||||
|
||||
return !string.IsNullOrEmpty(status);
|
||||
}
|
||||
|
||||
public override RelayEnum.Status GetStatusRelay(int outletId)
|
||||
{
|
||||
var status = Send("FF0000");
|
||||
|
||||
//while (!status.IsCompleted)
|
||||
//{
|
||||
|
||||
//}
|
||||
|
||||
|
||||
//if (!string.IsNullOrEmpty(status.Result))
|
||||
//{
|
||||
// if (status.Result.Substring(outlet.outlet - 1, 1) == "0")
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
//}
|
||||
|
||||
if (!string.IsNullOrEmpty(status))
|
||||
try
|
||||
{
|
||||
if (status.Substring(outletId - 1, 1) == "0")
|
||||
//return RelayStatus.Off;
|
||||
return Relay.Mode == RelayEnum.Mode.OpenedOffClosedOn
|
||||
? RelayEnum.Status.On
|
||||
: RelayEnum.Status.Off;
|
||||
}
|
||||
catch (ArgumentOutOfRangeException e)
|
||||
{
|
||||
Log.Error(
|
||||
"There isn't an outlet {Outlet} in the rele {Ip}. Please check the configuration.\nException: {Ex}",
|
||||
outletId, Relay.Ip, e.Message);
|
||||
}
|
||||
|
||||
//return RelayStatus.On;
|
||||
return Relay.Mode == RelayEnum.Mode.OpenedOffClosedOn ? RelayEnum.Status.Off : RelayEnum.Status.On;
|
||||
}
|
||||
|
||||
public override void PowerOffRelay(int outletId)
|
||||
{
|
||||
if (Relay.Mode == RelayEnum.Mode.OpenedOffClosedOn) OpenRelay(outletId);
|
||||
else CloseRelay(outletId);
|
||||
}
|
||||
|
||||
public void OpenRelay(int outletId)
|
||||
{
|
||||
//Activa el relé por lo que corta la corriente del dispositivo conectado
|
||||
Send("FF0" + outletId + "01");
|
||||
}
|
||||
|
||||
public override void PowerOnRelay(int outletId)
|
||||
{
|
||||
if (Relay.Mode == RelayEnum.Mode.OpenedOffClosedOn) CloseRelay(outletId);
|
||||
else OpenRelay(outletId);
|
||||
}
|
||||
|
||||
public void CloseRelay(int outletId)
|
||||
{
|
||||
//Desactiva el relé por lo que deja pasar la corriente del dispositivo conectado
|
||||
Send("FF0" + outletId + "00");
|
||||
}
|
||||
|
||||
public override void PowerOffAll()
|
||||
{
|
||||
//Activa el relé por lo que corta la corriente de todos los dispositivo conectados
|
||||
Send("FFE0FF");
|
||||
}
|
||||
|
||||
public override void PowerOnAll()
|
||||
{
|
||||
//Desactiva el relé por lo que deja pasar la corriente a todos dispositivo conectados
|
||||
Send("FFE000");
|
||||
}
|
||||
|
||||
public override void CheckStatus()
|
||||
{
|
||||
DeviceStatus = GetStatusRelay();
|
||||
}
|
||||
|
||||
|
||||
public override void RebootOutlet(int outletId)
|
||||
{
|
||||
//Reinicia el relé del dispositivo conectado
|
||||
PowerOnOffRelay(outletId, 2000);
|
||||
}
|
||||
|
||||
public override void Reboot()
|
||||
{
|
||||
PowerOffAll();
|
||||
if (Relay.RebootDelay is > 0) Thread.Sleep(Relay.RebootDelay!.Value);
|
||||
PowerOnAll();
|
||||
}
|
||||
|
||||
public override Task<bool> GetStatusRelayAsync()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected virtual void Connect()
|
||||
{
|
||||
if (_udpClient == null)
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Relay.Ip)) _udpClient = new UdpClient(Relay.Ip, Relay.Port);
|
||||
//var ipaddress = IPAddress.Parse(RelayConfig.Ip);
|
||||
//sourceipendpoint = new IPEndPoint(ipaddress, port); //source port IPEndpoint
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Debug("UdpClient not connect {Host}: {Port} Ex: {Ex}", Relay.Ip, Relay.Port, e.Message);
|
||||
|
||||
try
|
||||
{
|
||||
if (_udpClient != null)
|
||||
{
|
||||
_udpClient.Close();
|
||||
_udpClient = null;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
else
|
||||
try
|
||||
{
|
||||
_udpClient.Close();
|
||||
_udpClient = null;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual string Send(string datagrama)
|
||||
{
|
||||
if (_udpClient == null) Connect();
|
||||
|
||||
if (_udpClient == null) return string.Empty;
|
||||
|
||||
var command = Encoding.ASCII.GetBytes(datagrama.ToUpper());
|
||||
_udpClient.Send(command, command.Length);
|
||||
|
||||
var returnData = string.Empty;
|
||||
try
|
||||
{
|
||||
var t = Task.Run(() =>
|
||||
{
|
||||
var taskReceiveBytes = _udpClient.ReceiveAsync();
|
||||
returnData = Encoding.ASCII.GetString(taskReceiveBytes.Result.Buffer);
|
||||
});
|
||||
var ts = TimeSpan.FromSeconds(5);
|
||||
if (!t.Wait(ts))
|
||||
{
|
||||
if (!t.IsCompletedSuccessfully) returnData = string.Empty;
|
||||
if (t.Exception != null) throw t.Exception;
|
||||
}
|
||||
|
||||
if (t.Status == TaskStatus.RanToCompletion) t.Dispose();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Debug("UdpClient not connect {Host}: {Port} Ex: {Ex}", Relay.Ip, Relay.Port, ex.Message);
|
||||
returnData = string.Empty;
|
||||
}
|
||||
|
||||
if (returnData == string.Empty)
|
||||
Log.Debug("UdpClient not connect {Host}: {Port}", Relay.Ip, Relay.Port);
|
||||
|
||||
return returnData;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user