controle de trafego udp

This commit is contained in:
Diego Freitas 2026-03-05 12:40:10 -03:00
parent e718a3858f
commit c95564d49f
7 changed files with 60 additions and 24 deletions

View File

@ -29,7 +29,7 @@ namespace AgroBase.Forms
Variaveis.IniciarMQTT();
Variaveis.IniciarUDP();
//Variaveis.IniciarUDP();
APIService.IniciarRotinas();

View File

@ -1543,6 +1543,19 @@ namespace AgroBase.Models
return;
}
if (controleBase.Dispositivo == T_Code.Ipb)
{
if (controleBase._comp_value == true)
{
Variaveis.IniciarUDP();
}
else
{
Variaveis.StopUdpChannel();
}
return;
}
if (controleBase.Dispositivo == T_Code.Gps)
{
var (la_frontal, la_lateral) = ((JObject)controleBase._comp_value).ToObject<(double?, double?)>();

View File

@ -215,12 +215,7 @@ namespace AgroBase.Models
private static void StartUdpChannel()
{
try
{
UdpChannel?.Stop();
UdpChannel?.Dispose();
}
catch { }
StopUdpChannel();
UdpChannel = new UdpReliableChannel();
UdpChannel.Start(VariaveisPortas.Ethernet_UDP_RX);
@ -232,6 +227,16 @@ namespace AgroBase.Models
Interlocked.Exchange(ref _lastPacketTicksUtc, DateTime.UtcNow.Ticks);
}
public static void StopUdpChannel()
{
try
{
UdpChannel?.Stop();
UdpChannel?.Dispose();
}
catch { }
}
private static void OnUdpPacket(byte type, byte[] payload, IPEndPoint from)
{
// Qualquer pacote marca link vivo (inclusive heartbeat)
@ -384,6 +389,7 @@ namespace AgroBase.Models
await Task.CompletedTask;
}
}

View File

@ -44,11 +44,18 @@ public sealed class UdpReliableChannel : IDisposable
public void SetRemote(string ip, int port)
{
var addr = IPAddress.Parse(ip);
if (Remote == null || !Remote.Address.Equals(addr) || Remote.Port != port)
if (string.IsNullOrEmpty(ip))
{
Remote = new IPEndPoint(addr, port);
Remote = null;
}
else
{
var addr = IPAddress.Parse(ip);
if (Remote == null || !Remote.Address.Equals(addr) || Remote.Port != port)
{
Remote = new IPEndPoint(addr, port);
}
}
}

View File

@ -297,7 +297,7 @@ namespace OperationControl.Controls
{
EmergencyActivated = !EmergencyActivated;
//VariaveisControleOperacao.EnviarComandoParada(emergencia: EmergencyActivated);
_ = VariaveisControleOperacao.EnviarComandoParadaUDP(ipRover: VariaveisControleOperacao.RoverEmFoco?.IP, emergencia: EmergencyActivated);
_ = VariaveisControleOperacao.EnviarComandoParadaUDP(emergencia: EmergencyActivated);
}
private void ManualControlPad_PauseClicked(object? sender, EventArgs e)
@ -342,7 +342,7 @@ namespace OperationControl.Controls
if (_lastDirKey != dir)
{
//VariaveisControleOperacao.EnviarComandoDirecional(dir, Convert.ToInt32(AngleControl), MoveTypeControl);
VariaveisControleOperacao.EnviarComandoDirecionalUDP(ipRover: VariaveisControleOperacao.RoverEmFoco?.IP, dir, Convert.ToInt32(AngleControl), MoveTypeControl);
VariaveisControleOperacao.EnviarComandoDirecionalUDP(dir, Convert.ToInt32(AngleControl), MoveTypeControl);
_lastDirKey = dir;
}
@ -353,7 +353,7 @@ namespace OperationControl.Controls
if (_lastMovKey != mov)
{
//VariaveisControleOperacao.EnviarComandoMovimentacao(mov, Convert.ToInt32(SpeedControl));
VariaveisControleOperacao.EnviarComandoMovimentacaoUDP(ipRover: VariaveisControleOperacao.RoverEmFoco?.IP, mov, Convert.ToInt32(SpeedControl));
VariaveisControleOperacao.EnviarComandoMovimentacaoUDP(mov, Convert.ToInt32(SpeedControl));
_lastMovKey = mov;
}
}

View File

@ -289,6 +289,21 @@ namespace OperationControl.Models
#region Controle
public static void EnviarComandoIniciarUDP(string ipRover, bool iniciar)
{
if (iniciar)
Variaveis.UdpChannel.SetRemote(ipRover, VariaveisPortas.Ethernet_UDP_RX);
else
Variaveis.UdpChannel.SetRemote(null, VariaveisPortas.Ethernet_UDP_RX);
EnviarDadosControle(SelectedRoverId, new OperacaoComandoBaseModel()
{
Momento = DateTime.Now,
Dispositivo = AgroBase.Models.Enums.T_Code.Ipb,
_comp_value = iniciar
});
}
public static void EnviarComandoIniciarOperacao(bool iniciar, bool simulador = false)
{
EnviarDadosControle(SelectedRoverId, new OperacaoComandoBaseModel()
@ -319,11 +334,8 @@ namespace OperationControl.Models
EnviarDadosControle(SelectedRoverId, cmd);
}
public static Task EnviarComandoParadaUDP(string ipRover, bool emergencia = false, bool pausa = false)
public static Task EnviarComandoParadaUDP(bool emergencia = false, bool pausa = false)
{
if (string.IsNullOrEmpty(ipRover)) return Task.CompletedTask;
Variaveis.UdpChannel.SetRemote(ipRover, VariaveisPortas.Ethernet_UDP_RX);
var msg = new UdpCtrlMessage
{
Device = (byte)AgroBase.Models.Enums.T_Code.Vzo,
@ -433,10 +445,8 @@ namespace OperationControl.Models
});
}
public static void EnviarComandoDirecionalUDP(string ipRover, AgroBase.Models.Enums.Direcao direcao, double angulo, AgroBase.Models.Enums.TipoMovimentoDirecional tipoMov)
public static void EnviarComandoDirecionalUDP(AgroBase.Models.Enums.Direcao direcao, double angulo, AgroBase.Models.Enums.TipoMovimentoDirecional tipoMov)
{
if (string.IsNullOrEmpty(ipRover)) return;
Variaveis.UdpChannel.SetRemote(ipRover, VariaveisPortas.Ethernet_UDP_RX);
var key = DeParaDirecaoTecla(direcao);
var msg = new UdpCtrlMessage
@ -466,10 +476,8 @@ namespace OperationControl.Models
});
}
public static void EnviarComandoMovimentacaoUDP(string ipRover, AgroBase.Models.Enums.Direcao direcao, double velPct)
public static void EnviarComandoMovimentacaoUDP(AgroBase.Models.Enums.Direcao direcao, double velPct)
{
if (string.IsNullOrEmpty(ipRover)) return;
Variaveis.UdpChannel.SetRemote(ipRover, VariaveisPortas.Ethernet_UDP_RX);
var key = DeParaDirecaoTecla(direcao);
var msg = new UdpCtrlMessage

View File

@ -188,6 +188,7 @@ namespace OperationControl.Windows
{
PararStreamCameraFrontal();
PararStreamCameraErvas();
VariaveisControleOperacao.EnviarComandoIniciarUDP(VariaveisControleOperacao.RoverEmFoco?.IP, false);
}
VariaveisControleOperacao.SelectedRoverId = selecionado.ToString();
@ -204,6 +205,7 @@ namespace OperationControl.Windows
btnParametros_Atualizar_Click(sender, e);
IniciarStreamCameraFrontal();
IniciarStreamCameraErvas();
VariaveisControleOperacao.EnviarComandoIniciarUDP(VariaveisControleOperacao.RoverEmFoco?.IP, true);
}
}