diff --git a/AgroBase/.vs/AgroBase/FileContentIndex/56ec598c-2128-4749-830d-77c64ae99e1c.vsidx b/AgroBase/.vs/AgroBase/FileContentIndex/beb00271-0642-40ae-940a-95548fd45855.vsidx similarity index 52% rename from AgroBase/.vs/AgroBase/FileContentIndex/56ec598c-2128-4749-830d-77c64ae99e1c.vsidx rename to AgroBase/.vs/AgroBase/FileContentIndex/beb00271-0642-40ae-940a-95548fd45855.vsidx index 7644649d2..4e2147a1b 100644 Binary files a/AgroBase/.vs/AgroBase/FileContentIndex/56ec598c-2128-4749-830d-77c64ae99e1c.vsidx and b/AgroBase/.vs/AgroBase/FileContentIndex/beb00271-0642-40ae-940a-95548fd45855.vsidx differ diff --git a/AgroBase/.vs/AgroBase/v17/.suo b/AgroBase/.vs/AgroBase/v17/.suo index 2119b17e3..fb5af51cd 100644 Binary files a/AgroBase/.vs/AgroBase/v17/.suo and b/AgroBase/.vs/AgroBase/v17/.suo differ diff --git a/AgroBase/.vs/AgroBase/v17/Browse.VC.db b/AgroBase/.vs/AgroBase/v17/Browse.VC.db index dd85a2818..35af97ce5 100644 Binary files a/AgroBase/.vs/AgroBase/v17/Browse.VC.db and b/AgroBase/.vs/AgroBase/v17/Browse.VC.db differ diff --git a/AgroBase/AgroBase/Forms/Atuador/frmAtuCamera.cs b/AgroBase/AgroBase/Forms/Atuador/frmAtuCamera.cs index a5a73ff25..d56318e7b 100644 --- a/AgroBase/AgroBase/Forms/Atuador/frmAtuCamera.cs +++ b/AgroBase/AgroBase/Forms/Atuador/frmAtuCamera.cs @@ -47,7 +47,7 @@ namespace AgroBase.Forms try { cameraSolo.camera.pythonProcess?.Kill(); - Variaveis.MqttService.UnsubscribeAsync(cameraSolo.camera._mqttTopico).ConfigureAwait(false); + Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraSolo.camera._mqttTopico).ConfigureAwait(false); } catch (Exception ex) { @@ -183,7 +183,7 @@ namespace AgroBase.Forms int i = 0; //var coordenadas = cameraService.AferirDadosCamera(); - var MqttTopico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == cameraSolo.MqttTopico); + var MqttTopico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == cameraSolo.MqttTopico); if (MqttTopico == null) { diff --git a/AgroBase/AgroBase/Forms/IHM/frmIHM.cs b/AgroBase/AgroBase/Forms/IHM/frmIHM.cs index b49c18850..cf367d4ee 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmIHM.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmIHM.cs @@ -302,7 +302,7 @@ namespace AgroBase.Forms.IHM } } - bool mqttConectado = Variaveis.MqttService.StatusConexao(); + bool mqttConectado = Variaveis.MqttServiceLocal.StatusConexao(); lblMqtt.Text = "MQTT: " + (mqttConectado ? "Conectado" : "Desconectado"); lblMqtt.ForeColor = mqttConectado ? Color.Green : Color.Red; diff --git a/AgroBase/AgroBase/Forms/Movimentacao/frmMovCamera.cs b/AgroBase/AgroBase/Forms/Movimentacao/frmMovCamera.cs index 99e9a56e1..4feb09450 100644 --- a/AgroBase/AgroBase/Forms/Movimentacao/frmMovCamera.cs +++ b/AgroBase/AgroBase/Forms/Movimentacao/frmMovCamera.cs @@ -65,7 +65,7 @@ namespace AgroBase.Forms.Movimentacao try { tmrLeitura.Stop(); - Variaveis.MqttService.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult(); + Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult(); cameraService.pythonProcess.Kill(); } catch (Exception ex) diff --git a/AgroBase/AgroBase/Forms/Sensoriamento/frmSenCamera.cs b/AgroBase/AgroBase/Forms/Sensoriamento/frmSenCamera.cs index 586511609..85af5b1c0 100644 --- a/AgroBase/AgroBase/Forms/Sensoriamento/frmSenCamera.cs +++ b/AgroBase/AgroBase/Forms/Sensoriamento/frmSenCamera.cs @@ -34,7 +34,7 @@ namespace AgroBase.Forms.Sensoriamento { try { - Variaveis.MqttService.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult(); + Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult(); cameraService.pythonProcess?.Kill(); } catch (Exception ex) @@ -119,7 +119,7 @@ namespace AgroBase.Forms.Sensoriamento this.pnlLeituras.Controls.Clear(); int i = 0; - var MqttTopico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == VideoUrl); + var MqttTopico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == VideoUrl); CameraCoordenadasFrameModel leitura = null; var Mensagem = MqttTopico.Mensagens.LastOrDefault(x => x.Momento > cameraService.IniciadoEm); if (Mensagem != null) diff --git a/AgroBase/AgroBase/Forms/Simuladores/frmTreinamentoIA.cs b/AgroBase/AgroBase/Forms/Simuladores/frmTreinamentoIA.cs index de73e2dc8..52c28326d 100644 --- a/AgroBase/AgroBase/Forms/Simuladores/frmTreinamentoIA.cs +++ b/AgroBase/AgroBase/Forms/Simuladores/frmTreinamentoIA.cs @@ -57,8 +57,8 @@ namespace AgroBase.Forms ReiniciarModelo(); - await Variaveis.MqttService.AdicionarNovoTopico(mqtt_topico_state); - await Variaveis.MqttService.AdicionarNovoTopico(mqtt_topico_action, true, 2, async (message) => + await Variaveis.MqttServiceLocal.AdicionarNovoTopico(mqtt_topico_state); + await Variaveis.MqttServiceLocal.AdicionarNovoTopico(mqtt_topico_action, true, 2, async (message) => { Console.WriteLine("Mensagem recebida pelo modelo de IA: " + message); //btnAcrescentarGPS_Click(new Button(), new EventArgs()); @@ -72,10 +72,10 @@ namespace AgroBase.Forms private async void frmTreinamentoIA_FormClosing(object sender, FormClosingEventArgs e) { - var t0 = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == mqtt_topico_state); - await Variaveis.MqttService.UnsubscribeAsync(t0); - var t1 = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == mqtt_topico_action); - await Variaveis.MqttService.UnsubscribeAsync(t1); + var t0 = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == mqtt_topico_state); + await Variaveis.MqttServiceLocal.UnsubscribeAsync(t0); + var t1 = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == mqtt_topico_action); + await Variaveis.MqttServiceLocal.UnsubscribeAsync(t1); Variaveis.OperacaoEmAndamento.Treinando = false; } @@ -481,8 +481,8 @@ namespace AgroBase.Forms _robotState.UpdateCurrentRobotState(); - await Variaveis.MqttService.PublishAsync( - Variaveis.MqttService.Topicos.First(x => x.Topico == mqtt_topico_state), + await Variaveis.MqttServiceLocal.PublishAsync( + Variaveis.MqttServiceLocal.Topicos.First(x => x.Topico == mqtt_topico_state), JsonConvert.SerializeObject(_robotState) ); } diff --git a/AgroBase/AgroBase/Forms/frmInstancial.cs b/AgroBase/AgroBase/Forms/frmInstancial.cs index 0b9fb511d..f2131c05f 100644 --- a/AgroBase/AgroBase/Forms/frmInstancial.cs +++ b/AgroBase/AgroBase/Forms/frmInstancial.cs @@ -27,6 +27,8 @@ namespace AgroBase.Forms ThreadPool.SetMinThreads(workerThreads: 50, completionPortThreads: 50); + Variaveis.IniciarMQTT(); + APIService.IniciarRotinas(); GeneralJoystick.IniciarRotinas(); @@ -93,7 +95,7 @@ namespace AgroBase.Forms private async void IniciarConexaoMqtt() { - await Variaveis.MqttService.ConnectAsync(); + await Variaveis.MqttServiceLocal.ConnectAsync(); } public static async Task EncerrarProcessos() diff --git a/AgroBase/AgroBase/Forms/frmPrincipal.cs b/AgroBase/AgroBase/Forms/frmPrincipal.cs index b02a5cae5..a2f83e6bc 100644 --- a/AgroBase/AgroBase/Forms/frmPrincipal.cs +++ b/AgroBase/AgroBase/Forms/frmPrincipal.cs @@ -98,7 +98,7 @@ namespace AgroBase { AtualizaDadosGerais(); - lblStripMqtt.Text = "MQTT: " + (Variaveis.MqttService.StatusConexao() ? "Conectado" : "Desconectado"); + lblStripMqtt.Text = "MQTT: " + (Variaveis.MqttServiceLocal.StatusConexao() ? "Conectado" : "Desconectado"); lblStripPython.Text = "IA: " + (VariaveisOperacao.Operadores.Conectado ? "Conectado" : "Desconectado"); lblStripPython.ForeColor = VariaveisOperacao.Operadores.Conectado ? Color.Green : Color.Red; diff --git a/AgroBase/AgroBase/Models/CameraCaminhoModel.cs b/AgroBase/AgroBase/Models/CameraCaminhoModel.cs index 2ba7844ae..03fbb374f 100644 --- a/AgroBase/AgroBase/Models/CameraCaminhoModel.cs +++ b/AgroBase/AgroBase/Models/CameraCaminhoModel.cs @@ -60,13 +60,13 @@ namespace AgroBase.Models try { Iniciada = false; - Variaveis.MqttService.Topicos.Remove(camera._mqttTopico); + Variaveis.MqttServiceLocal.Topicos.Remove(camera._mqttTopico); if (panelRgb != null) { panelRgb.Controls.Remove(browserRgb); } browserRgb = null; - Task.Run(async () => await Variaveis.MqttService.UnsubscribeAsync(camera._mqttTopico)); + Task.Run(async () => await Variaveis.MqttServiceLocal.UnsubscribeAsync(camera._mqttTopico)); lock (camera.processLock) { diff --git a/AgroBase/AgroBase/Models/CameraSoloModel.cs b/AgroBase/AgroBase/Models/CameraSoloModel.cs index 591f3d297..d12d43bbb 100644 --- a/AgroBase/AgroBase/Models/CameraSoloModel.cs +++ b/AgroBase/AgroBase/Models/CameraSoloModel.cs @@ -18,13 +18,13 @@ namespace AgroBase.Models try { Iniciada = false; - Variaveis.MqttService.Topicos.Remove(camera._mqttTopico); + Variaveis.MqttServiceLocal.Topicos.Remove(camera._mqttTopico); if (panel != null) { panel.Controls.Remove(browser); } browser = null; - Task.Run(async () => await Variaveis.MqttService.UnsubscribeAsync(camera._mqttTopico)); + Task.Run(async () => await Variaveis.MqttServiceLocal.UnsubscribeAsync(camera._mqttTopico)); lock (camera.processLock) { if (camera.pythonProcess != null) diff --git a/AgroBase/AgroBase/Models/MPCController.cs b/AgroBase/AgroBase/Models/MPCController.cs index 37e9aff15..b46500d79 100644 --- a/AgroBase/AgroBase/Models/MPCController.cs +++ b/AgroBase/AgroBase/Models/MPCController.cs @@ -29,9 +29,9 @@ public class MPCController public async Task Inicializar() { - await Variaveis.MqttService.AdicionarNovoTopico(TopicoRota); - await Variaveis.MqttService.AdicionarNovoTopico(TopicoPosicao); - await Variaveis.MqttService.AdicionarNovoTopico(TopicoComando, true, 2, async (mensagem) => + await Variaveis.MqttServiceLocal.AdicionarNovoTopico(TopicoRota); + await Variaveis.MqttServiceLocal.AdicionarNovoTopico(TopicoPosicao); + await Variaveis.MqttServiceLocal.AdicionarNovoTopico(TopicoComando, true, 2, async (mensagem) => { if (mensagem.Mensagem == "OK") { @@ -84,8 +84,8 @@ public class MPCController velocidade_max = FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Controle.PercentualVelocidadeMax) }; - await Variaveis.MqttService.PublishAsync( - Variaveis.MqttService.Topicos.First(x => x.Topico == TopicoRota), + await Variaveis.MqttServiceLocal.PublishAsync( + Variaveis.MqttServiceLocal.Topicos.First(x => x.Topico == TopicoRota), JsonConvert.SerializeObject(trajetoria) ); } @@ -123,8 +123,8 @@ public class MPCController } }; - await Variaveis.MqttService.PublishAsync( - Variaveis.MqttService.Topicos.First(x => x.Topico == TopicoPosicao), + await Variaveis.MqttServiceLocal.PublishAsync( + Variaveis.MqttServiceLocal.Topicos.First(x => x.Topico == TopicoPosicao), JsonConvert.SerializeObject(dadosEnvio) ); @@ -161,10 +161,10 @@ public class MPCController Iniciado = false; ComandoAtual = new MPCComandoModel(); Task.Run(async () => { - Variaveis.MqttService.Topicos.Remove(Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == TopicoRota)); - Variaveis.MqttService.Topicos.Remove(Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == TopicoPosicao)); - await Variaveis.MqttService.UnsubscribeAsync(Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == TopicoComando)); - Variaveis.MqttService.Topicos.Remove(Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == TopicoComando)); + Variaveis.MqttServiceLocal.Topicos.Remove(Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == TopicoRota)); + Variaveis.MqttServiceLocal.Topicos.Remove(Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == TopicoPosicao)); + await Variaveis.MqttServiceLocal.UnsubscribeAsync(Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == TopicoComando)); + Variaveis.MqttServiceLocal.Topicos.Remove(Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == TopicoComando)); }); } diff --git a/AgroBase/AgroBase/Models/MapasModel.cs b/AgroBase/AgroBase/Models/MapasModel.cs index b33b588ac..2b6a7b589 100644 --- a/AgroBase/AgroBase/Models/MapasModel.cs +++ b/AgroBase/AgroBase/Models/MapasModel.cs @@ -28,7 +28,7 @@ namespace AgroBase.Models public void btnCarregar_Click(object sender, EventArgs e, string caminhoArquivo = "", bool monitoramento = false) { - var Topico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa); + var Topico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa); Topico.Mensagens.Clear(); TipoMapaOperacao? _tipoMapa = TipoMapa; @@ -234,7 +234,7 @@ namespace AgroBase.Models { List ids = new List(); bool idsMensagem = false; - var Topico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa); + var Topico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa); var Mensagem = Topico.Mensagens.LastOrDefault(); if (Mensagem != null && !Mensagem.Mensagem.Contains("[]")) { diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 17fc23861..66f56f7b0 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -16,6 +16,7 @@ using System.Text; using static AgroBase.Services.OIDCanService.OidHandler; using AgroBase.Models.Operadores; using AgroBase.Services.Operadores; +using AgroMonitor; namespace AgroBase.Models { @@ -34,6 +35,10 @@ namespace AgroBase.Models tmrLeituras?.Dispose(); tmrLeituras = new AsyncTaskTimerModel("tmrLeitura", tmrLeituras_Tick, 500); tmrLeituras.Start(); + + tmrComunicacao?.Dispose(); + tmrComunicacao = new AsyncTaskTimerModel("tmrComunicacao", tmrComunicacao_Tick, 1000); + tmrComunicacao.Start(); } } @@ -141,7 +146,8 @@ namespace AgroBase.Models } } private static AsyncTaskTimerModel tmrLeituras; - + private static AsyncTaskTimerModel tmrComunicacao; + #region PARAMETRIZACAO @@ -924,7 +930,7 @@ namespace AgroBase.Models Variaveis.OperacaoEmAndamento.Trajetoria = new TrajetoriaMapaOperacaoModel(new List>()); Variaveis.OperacaoEmAndamento.GPSTrajetoria = new List(); - var Topico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa); + var Topico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa); Topico.Mensagens.Add(new MqttService.MqttTopicosMensagensModel() { Mensagem = "[]", @@ -1186,7 +1192,7 @@ namespace AgroBase.Models } Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados(); - Variaveis.LoraService?.EnviarDadosParaBase(); + //Variaveis.LoraService?.EnviarDadosParaBase(); if (!Variaveis.OperacaoEmAndamento.Iniciado) { @@ -1240,6 +1246,27 @@ namespace AgroBase.Models _Controle.TipoMovimento = oldTipoMovimento; } + private async Task tmrComunicacao_Tick() + { + bool base_encontrada = (DateTime.Now - VariaveisOperacao.PosicaoBase.Momento).TotalSeconds < 10; + MqttService.MqttTopicosModel topico = null; + string msg = string.Empty; + if (!base_encontrada) + { + topico = Variaveis.MqttServiceBase.Topicos.FirstOrDefault(x => x.Topico == VariaveisMonitoramento.TopicoMqttDispositivos); + msg = VariaveisEquipamento.Parametros.serial_number; + } + else + { + topico = Variaveis.MqttServiceBase.Topicos.FirstOrDefault(x => x.Topico == VariaveisEquipamento.TopicoMqttTelemetria.Replace("", VariaveisEquipamento.Parametros.serial_number)); + msg = JsonConvert.SerializeObject(Variaveis.OperacaoEmAndamento.Sensoriamento); + } + if (topico != null && !string.IsNullOrEmpty(msg)) + { + await Variaveis.MqttServiceBase.PublishAsync(topico, msg); + } + } + #endregion #region REGISTRO DE LOGS diff --git a/AgroBase/AgroBase/Models/Variaveis.cs b/AgroBase/AgroBase/Models/Variaveis.cs index 655f80bb0..11ad952b1 100644 --- a/AgroBase/AgroBase/Models/Variaveis.cs +++ b/AgroBase/AgroBase/Models/Variaveis.cs @@ -16,9 +16,10 @@ using System.Threading; using AgroBase.Models.Components; using Microsoft.Web.WebView2.WinForms; using Microsoft.Web.WebView2.Core; -using System.Text.Json; using AgroBase.Services.Operadores; using System.Diagnostics; +using Newtonsoft.Json; +using AgroMonitor; namespace AgroBase.Models { @@ -55,7 +56,8 @@ namespace AgroBase.Models public static string CaminhoModelos { get; } = "C:\\AgroBaseModels\\"; public static List DispositivosConectados { get; set; } = new List(); public static OperacaoModel OperacaoEmAndamento { get; set; } = new OperacaoModel(ModoOperacao.Manual); - public static MqttService MqttService { get; set; } = new MqttService("localhost", 1883); + public static MqttService MqttServiceLocal { get; set; } + public static MqttService MqttServiceBase { get; set; } public static LoRaEspService LoraService { get @@ -86,6 +88,105 @@ namespace AgroBase.Models public static byte ID_Num_sMOD { get; } = 0; public static byte ID_Num_sTOD { get; } = 250; public static byte ID_Num_sLRA { get; } = 251; + + public static async void IniciarMQTT() + { + if (MqttServiceLocal != null) + { + foreach (var topico in MqttServiceLocal.Topicos.Where(x => x.Inscrever)) + { + await MqttServiceLocal.UnsubscribeAsync(topico); + } + MqttServiceLocal.Topicos.Clear(); + } + + if (MqttServiceBase != null && !IsAgroMonitor) + { + foreach (var topico in MqttServiceBase.Topicos.Where(x => x.Inscrever)) + { + await MqttServiceBase.UnsubscribeAsync(topico); + } + MqttServiceBase.Topicos.Clear(); + } + + MqttServiceLocal = new MqttService("localhost", 1883, IsAgroMonitor ? "base" : VariaveisEquipamento.Parametros.serial_number, true); + await MqttServiceLocal.AdicionarNovoTopico(MapasVariaveisModel.TopicoCoordenadasGPS); + await MqttServiceLocal.AdicionarNovoTopico(MapasVariaveisModel.TopicoTrajetoriaDinamica); + await MqttServiceLocal.AdicionarNovoTopico(MapasVariaveisModel.TopicoSelecaoRuasMapa, true, 1, async (message) => + { + OperacaoEmAndamento.Mapa.AtualizarRuasSelecionadas(); + }); + + if (IsAgroMonitor) + { + await MqttServiceLocal.AdicionarNovoTopico(VariaveisMonitoramento.TopicoMqttRTCM); + await MqttServiceLocal.AdicionarNovoTopico(VariaveisMonitoramento.TopicoMqttDispositivos, true, 1, async (message) => + { + try + { + string device_id = message.Mensagem; + VariaveisMonitoramento.AdicionarNovoRoverNaRede(message.Mensagem); + } + catch (Exception ex) + { + Console.WriteLine($"Erro ao deserializar ping do rover: {ex.Message}"); + } + }); + } + else + { + MqttServiceBase = new MqttService(VariaveisEquipamento.Parametros.base_ip, 1883, VariaveisEquipamento.Parametros.serial_number, false); + await MqttServiceBase.AdicionarNovoTopico(VariaveisMonitoramento.TopicoMqttDispositivos); + await MqttServiceBase.AdicionarNovoTopico(VariaveisEquipamento.TopicoMqttTelemetria.Replace("", VariaveisEquipamento.Parametros.serial_number)); + await MqttServiceBase.AdicionarNovoTopico(VariaveisEquipamento.TopicoMqttComandos.Replace("", VariaveisEquipamento.Parametros.serial_number), true, 1, async (message) => + { + if (string.IsNullOrEmpty(message.Mensagem)) + return; + try + { + string json = message.Mensagem; + var cmd = JsonConvert.DeserializeObject(json); + OperacaoEmAndamento.ExecutaComandoDaBase(cmd); + } + catch (Exception ex) + { + Console.WriteLine($"Erro ao deserializar comando da base: {ex.Message}"); + } + }); + await MqttServiceBase.AdicionarNovoTopico(VariaveisMonitoramento.TopicoMqttRTCM, true, 1, async (message) => + { + if (message.Bytes == null || message.Bytes.Length == 0) + return; + try + { + var bytes = message.Bytes; + if (bytes != null && bytes.Length > 0) + { + GPSService.AplicarCorrecaoRTK_Mqtt(bytes, bytes.Length); + } + } + catch (Exception ex) + { + Console.WriteLine($"Erro ao deserializar RTCM da base: {ex.Message}"); + } + }); + await MqttServiceBase.AdicionarNovoTopico(VariaveisMonitoramento.TopicoMqttPosicao, true, 1, async (message) => + { + if (string.IsNullOrEmpty(message.Mensagem)) + return; + try + { + string json = message.Mensagem; + var posicao = JsonConvert.DeserializeObject(json); + VariaveisOperacao.PosicaoBase = posicao; + } + catch (Exception ex) + { + Console.WriteLine($"Erro ao deserializar dados da base: {ex.Message}"); + } + }); + } + } } public static class VariaveisPortas @@ -98,6 +199,25 @@ namespace AgroBase.Models public static class VariaveisEquipamento { + private static ParametrosConfigEquipamentoModel _parametros; + public static ParametrosConfigEquipamentoModel Parametros + { + get + { + if (_parametros == null) + { + _parametros = new ParametrosConfigEquipamentoModel(); + _parametros.AtualizarParametros(); + } + return _parametros; + } + set + { + _parametros = value; + } + } + public static string TopicoMqttComandos { get; } = $"agrobot/v1/rover//cmd"; + public static string TopicoMqttTelemetria { get; } = $"agrobot/v1/rover//telemetry"; public static double LarguraEsquerda { get; } = 44.0; // 62 public static double LarguraDireita { get; } = 44.0; // 22 public static double ComprimentoFrente { get; } = 7.0; // 7 @@ -191,6 +311,8 @@ namespace AgroBase.Models public static double AnguloInclinacaoPitchMax { get; set; } = 45.0; public static string VozAlerta { get; set; } = "Microsoft Maria Desktop"; + + public static SensorSinaleiroComportamentoModel ComportamentoLedPorStatus(StatusOperacao? _status = null) { if (_status == null) @@ -444,6 +566,38 @@ namespace AgroBase.Models return novaPosicao; } + + + public class ParametrosConfigEquipamentoModel + { + public bool Carregado { get; set; } + public string serial_number { get; set; } + public string base_ip { get; set; } + + public void AtualizarParametros() + { + string config_path = Path.Combine(Variaveis.CaminhoSistema, Variaveis.CaminhoParametros, "config.json"); + if (!File.Exists(config_path)) + Carregado = false; + + try + { + string json = File.ReadAllText(config_path); + var par = JsonConvert.DeserializeObject(json); + + serial_number = par.serial_number; + base_ip = par.base_ip; + + Carregado = true; + } + catch (Exception ex) + { + Console.WriteLine($"Erro ao carregar arquivo de configuracoes: {ex.Message}"); + Carregado = false; + } + } + } + } public static class VariaveisOperacao @@ -1252,7 +1406,7 @@ namespace AgroBase.Models string result = await browser.CoreWebView2.ExecuteScriptAsync(script); // O resultado vem como string JSON (ex: "\"Texto dentro do body\"") - string conteudo = JsonSerializer.Deserialize(result); + string conteudo = System.Text.Json.JsonSerializer.Deserialize(result); if (string.IsNullOrWhiteSpace(conteudo) || conteudo.Contains("Internal Server Error") || diff --git a/AgroBase/AgroBase/Models/VariaveisMonitoramento.cs b/AgroBase/AgroBase/Models/VariaveisMonitoramento.cs index c7baba0f5..a78c5f578 100644 --- a/AgroBase/AgroBase/Models/VariaveisMonitoramento.cs +++ b/AgroBase/AgroBase/Models/VariaveisMonitoramento.cs @@ -1,5 +1,6 @@ using AgroBase.Models; using AgroBase.Services; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -121,5 +122,78 @@ namespace AgroMonitor public static double LeverArmFrontal { get; } = 0.0; public static double LeverArmLateral { get; } = 0.0; + public static string TopicoMqttDispositivos { get; } = $"agrobot/v1/base/devices"; + public static string TopicoMqttPosicao { get; } = $"agrobot/v1/base/position"; + public static string TopicoMqttRTCM { get; } = $"agrobot/v1/base/rtcm"; + private static readonly object _RoversLock = new object(); + public static Dictionary RoversNaRede { get; set; } = new Dictionary(); + public static async void AdicionarNovoRoverNaRede(string device_id) + { + if (string.IsNullOrEmpty(device_id)) + return; + + bool rover_ja_adicionado = false; + lock (_RoversLock) + { + rover_ja_adicionado = RoversNaRede.ContainsKey(device_id); + } + + if (!rover_ja_adicionado) + { + lock (_RoversLock) + { + RoversNaRede.Add(device_id, new OperacaoSensoriamentoLogModel() { Momento = DateTime.Now }); + } + + await Variaveis.MqttServiceLocal.AdicionarNovoTopico(VariaveisEquipamento.TopicoMqttComandos.Replace("", device_id)); + await Variaveis.MqttServiceLocal.AdicionarNovoTopico(VariaveisEquipamento.TopicoMqttTelemetria.Replace("", device_id), true, 1, async (message) => + { + try + { + string json = message.Mensagem; + var obj = JsonConvert.DeserializeObject(json); + lock (_RoversLock) + { + RoversNaRede[device_id] = obj; + } + } + catch (Exception ex) + { + Console.WriteLine($"Erro ao deserializar dados de telemetria do rover {device_id}: {ex.Message}"); + } + }); + } + } + public static async void AtualizarListaRoversNaRede() + { + List rovers_desconectados = new List(); + var rovers_atual = new Dictionary(); + lock (_RoversLock) + { + rovers_atual = new Dictionary(RoversNaRede); + } + foreach (var rover in rovers_atual) + { + double tempo_sem_resposta = (DateTime.Now - rover.Value.Momento).TotalSeconds; + if (tempo_sem_resposta > 5.0) + { + rovers_desconectados.Add(rover.Key); + } + } + foreach (var device_id in rovers_desconectados) + { + lock (_RoversLock) + { + RoversNaRede.Remove(device_id); + } + var topicos_rover = Variaveis.MqttServiceLocal.Topicos.Where(x => x.Topico.Contains(device_id)).ToList(); + foreach (var topico in topicos_rover) + { + await Variaveis.MqttServiceLocal.UnsubscribeAsync(topico); + Variaveis.MqttServiceLocal.Topicos.Remove(topico); + } + } + } + } } diff --git a/AgroBase/AgroBase/Services/CameraService.cs b/AgroBase/AgroBase/Services/CameraService.cs index bc00ce066..47dea2f37 100644 --- a/AgroBase/AgroBase/Services/CameraService.cs +++ b/AgroBase/AgroBase/Services/CameraService.cs @@ -33,7 +33,7 @@ namespace AgroBase.Services { Task.Run(async () => { - _mqttTopico = await Variaveis.MqttService.AdicionarNovoTopico(MqttTopico, true, 2, mqttCallback); + _mqttTopico = await Variaveis.MqttServiceLocal.AdicionarNovoTopico(MqttTopico, true, 2, mqttCallback); lock (processLock) { diff --git a/AgroBase/AgroBase/Services/GPSService.cs b/AgroBase/AgroBase/Services/GPSService.cs index 90d0a4902..51988baaa 100644 --- a/AgroBase/AgroBase/Services/GPSService.cs +++ b/AgroBase/AgroBase/Services/GPSService.cs @@ -955,6 +955,14 @@ namespace AgroBase.Services LoopRTK_Ntrip = false; } + public static void AplicarCorrecaoRTK_Mqtt(byte[] correcao, int bytesRead) + { + if (PortaGPS?.IsOpen ?? false) + { + PortaGPS.Write(correcao, 0, bytesRead); + UltimoEnvioCorrecaoRTK = DateTime.Now; + } + } public static void AtualizarCoordenadasGPS() @@ -1055,8 +1063,8 @@ namespace AgroBase.Services Task.Run(async () => { //Console.WriteLine(JsonConvert.SerializeObject(Coordenadas)); - await Variaveis.MqttService.PublishAsync( - Variaveis.MqttService.Topicos.First(x => x.Topico == MapasVariaveisModel.TopicoCoordenadasGPS), + await Variaveis.MqttServiceLocal.PublishAsync( + Variaveis.MqttServiceLocal.Topicos.First(x => x.Topico == MapasVariaveisModel.TopicoCoordenadasGPS), JsonConvert.SerializeObject(Coordenadas) ); }); @@ -1074,8 +1082,8 @@ namespace AgroBase.Services Task.Run(async () => { - await Variaveis.MqttService.PublishAsync( - Variaveis.MqttService.Topicos.First(x => x.Topico == MapasVariaveisModel.TopicoTrajetoriaDinamica), + await Variaveis.MqttServiceLocal.PublishAsync( + Variaveis.MqttServiceLocal.Topicos.First(x => x.Topico == MapasVariaveisModel.TopicoTrajetoriaDinamica), JsonConvert.SerializeObject(Trajetoria) ); }); @@ -1086,8 +1094,8 @@ namespace AgroBase.Services { Task.Run(async () => { - await Variaveis.MqttService.PublishAsync( - Variaveis.MqttService.Topicos.First(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa), + await Variaveis.MqttServiceLocal.PublishAsync( + Variaveis.MqttServiceLocal.Topicos.First(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa), JsonConvert.SerializeObject("[" + string.Join(",", RuasSelecionadas.ToArray()) + "]"), true ); diff --git a/AgroBase/AgroBase/Services/MqttService.cs b/AgroBase/AgroBase/Services/MqttService.cs index 75b32e076..44ce6fe29 100644 --- a/AgroBase/AgroBase/Services/MqttService.cs +++ b/AgroBase/AgroBase/Services/MqttService.cs @@ -13,23 +13,36 @@ public class MqttService { private IMqttClient _client; private IMqttClientOptions _options; + private string _brokerAddr; + private int _brokerPort; private AsyncTaskTimerModel tmrCheck; public List Topicos; - public MqttService(string brokerAddress, int brokerPort) + private void LogDebug(string msg) { + Console.WriteLine($"[MQTT {_brokerAddr}:{_brokerPort}] - {msg}"); + } + + public MqttService(string brokerAddress, int brokerPort, string client_id, bool local) + { + _brokerAddr = brokerAddress; + _brokerPort = brokerPort; + var factory = new MqttFactory(); _client = factory.CreateMqttClient(); + string client = !local ? client_id : (client_id + "_local"); + _options = new MqttClientOptionsBuilder() - .WithTcpServer(brokerAddress, brokerPort) + .WithClientId(client) + .WithTcpServer(_brokerAddr, _brokerPort) .WithCleanSession() .Build(); _client.UseConnectedHandler(async e => { - Console.WriteLine("Connected to MQTT Broker."); + LogDebug("Connected to MQTT Broker."); if (Topicos.Any(x => x.Inscrever)) { foreach (var topic in Topicos) @@ -37,17 +50,21 @@ public class MqttService await SubscribeAsync(topic); } } - }); _client.UseDisconnectedHandler(e => { - Console.WriteLine("Disconnected from MQTT Broker."); + LogDebug("Disconnected from MQTT Broker."); }); _client.UseApplicationMessageReceivedHandler(e => { - string message = Encoding.UTF8.GetString((e.ApplicationMessage.Payload == null) ? new byte[] { } : e.ApplicationMessage.Payload); + var payloadBytes = e.ApplicationMessage.Payload ?? Array.Empty(); + var messageText = string.Empty; + + // Só tenta decodificar texto se for realmente necessário + try { messageText = Encoding.UTF8.GetString(payloadBytes); } catch { /* binário puro */ } + //Console.WriteLine($"Message received on topic {e.ApplicationMessage.Topic}"); // Aqui você pode adicionar o código para lidar com a mensagem recebida @@ -59,7 +76,8 @@ public class MqttService { Momento = DateTime.Now, Cliente = e.ClientId, - Mensagem = message + Mensagem = messageText, + Bytes = payloadBytes }; topico.Mensagens.Add(Mensagem); @@ -79,7 +97,7 @@ public class MqttService } catch (Exception ex) { - Console.WriteLine($"Erro no callback do tópico '{topico.Topico}': {ex}"); + LogDebug($"Erro no callback do tópico '{topico.Topico}': {ex}"); } }); } @@ -88,13 +106,7 @@ public class MqttService Topicos = new List(); - Task.Run(async () => - { - await AdicionarNovoTopico(MapasVariaveisModel.TopicoCoordenadasGPS); - await AdicionarNovoTopico(MapasVariaveisModel.TopicoSelecaoRuasMapa, true, 1, async (message) => { Variaveis.OperacaoEmAndamento.Mapa.AtualizarRuasSelecionadas(); }); - await AdicionarNovoTopico(MapasVariaveisModel.TopicoTrajetoriaDinamica); - }); - + tmrCheck?.Dispose(); tmrCheck = new AsyncTaskTimerModel("tmrCheck", tmrCheck_Tick, 1000); tmrCheck.Start(); } @@ -120,7 +132,7 @@ public class MqttService } catch (Exception ex) { - Console.WriteLine("Erro ao tentar se conectar ao MQTT Broker: " + ex.Message); + LogDebug("Erro ao tentar se conectar ao MQTT Broker: " + ex.Message); } } @@ -150,7 +162,7 @@ public class MqttService public async Task PublishAsync(MqttTopicosModel topic, byte[] payloadBytes, bool Forcar = false) { - if (topic.Inscrever && !Forcar) + if (topic.Inscrever || (topic.Inscrever && !Forcar)) { return; } @@ -175,11 +187,11 @@ public class MqttService await ConnectAsync(); } await _client.SubscribeAsync(new TopicFilterBuilder().WithTopic(topic.Topico).Build()); - Console.WriteLine("Subscribed to topic: " + topic.Topico); + LogDebug($"Subscribed to topic: {topic.Topico}"); } catch (Exception ex) { - Console.WriteLine($"An error occurred while subscribing from the topic: {ex.Message}"); + LogDebug($"An error occurred while subscribing from the topic: {ex.Message}"); } } @@ -196,11 +208,11 @@ public class MqttService await ConnectAsync(); } await _client.UnsubscribeAsync(new string[] { topic.Topico }); - Console.WriteLine("Unsubscribed from topic: " + topic.Topico); + LogDebug($"Unsubscribed from topic: {topic.Topico}"); } catch (Exception ex) { - Console.WriteLine($"An error occurred while unsubscribing from the topic: {ex.Message}"); + LogDebug($"An error occurred while unsubscribing from the topic: {ex.Message}"); } } @@ -247,7 +259,7 @@ public class MqttService .Build(); await _client.PublishAsync(mensagem); - Console.WriteLine($"Mensagem retida limpa para o tópico: {topico}"); + LogDebug($"Mensagem retida limpa para o tópico: {topico}"); } } @@ -265,5 +277,6 @@ public class MqttService public DateTime Momento { get; set; } public string Cliente { get; set; } public string Mensagem { get; set; } + public byte[] Bytes { get; set; } } } \ No newline at end of file diff --git a/AgroBase/AgroBase/Services/WifiService.cs b/AgroBase/AgroBase/Services/WifiService.cs index 596398175..75e677433 100644 --- a/AgroBase/AgroBase/Services/WifiService.cs +++ b/AgroBase/AgroBase/Services/WifiService.cs @@ -1,5 +1,4 @@ -using AgroBase.Forms; -using AgroBase.Models; +using AgroBase.Models; using System; using System.Diagnostics; using System.IO; @@ -67,12 +66,7 @@ namespace AgroBase.Services if (!string.IsNullOrEmpty(ip) && ip != Variaveis.IP_Host) { bool configurado = await EthernetService.ConfigurarIP(true, false); - foreach (var topico in Variaveis.MqttService.Topicos.Where(x => x.Inscrever)) - { - await Variaveis.MqttService.UnsubscribeAsync(topico); - } - Variaveis.MqttService.Topicos.Clear(); - Variaveis.MqttService = new MqttService("localhost", 1883); + Variaveis.IniciarMQTT(); } } } diff --git a/AgroBase/AgroBase/bin/x64/Debug/AgroBase.exe b/AgroBase/AgroBase/bin/x64/Debug/AgroBase.exe index 8469991a1..796fd8097 100644 Binary files a/AgroBase/AgroBase/bin/x64/Debug/AgroBase.exe and b/AgroBase/AgroBase/bin/x64/Debug/AgroBase.exe differ diff --git a/AgroBase/AgroBase/bin/x64/Debug/AgroBase.pdb b/AgroBase/AgroBase/bin/x64/Debug/AgroBase.pdb index 5e173df47..3b16a09aa 100644 Binary files a/AgroBase/AgroBase/bin/x64/Debug/AgroBase.pdb and b/AgroBase/AgroBase/bin/x64/Debug/AgroBase.pdb differ diff --git a/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersMvd-2_0.par b/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersMvd-2_0.par index f4d304357..bd557a63b 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersMvd-2_0.par +++ b/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersMvd-2_0.par @@ -1 +1 @@ -{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mvd","TimeTick":"00:00:00"},"tmrRegistradorMOV":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mov","TimeTick":"00:00:00"},"tmrRegistradorDIR":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Dir","TimeTick":"00:00:00"},"Dispositivo":109,"_EnderecoCAN_Tx":0,"_EnderecoCAN_Rx":0,"ConexaoAtiva":false,"DirPronto":false,"MovPronto":false,"_TaxaAmostragem":1000,"DistanciaPercorridaOperacao":0.0,"TempoEmAtividade":0.0,"DistanciaPercorridaTotal":0.0,"DistanciaPercorridaParcial":0.0,"VelocidadeMedia":0.0,"DiametroRoda":0.355,"ReducaoMotorBLDC":5.0,"RPM_Max_MotorBLDC":500.0,"IP_Mov":"192.168.105.10","IP_Dir":"192.168.105.11","Modulos":[{"Modulo_ID":"ET","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":5,"_EnderecoCAN_Rx":5,"heartBeatValue":1,"Mod_ID":"ET","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"ET","Incremental":true,"AnguloInicial":10,"Leitura":false,"AnguloControle":0,"UltimoEnvio":"2025-10-09T11:26:38.443353-03:00","DelayEnvio":500,"Servo":{"ID":"FRO_ET","ID_Num":41,"Descricao":"Freio Motor ET","Componente":22,"Funcoes":[45],"Incremental":true,"Controlar":true,"Mandatorio":false,"Liberado":true,"_AnguloControle":0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":1,"_EnderecoCAN_Rx":1,"Mod_ID":"ET","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":5.6286948256707312,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":false,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-21T15:58:33.6439852-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"EF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":7,"_EnderecoCAN_Rx":7,"heartBeatValue":1,"Mod_ID":"EF","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"EF","Incremental":true,"AnguloInicial":10,"Leitura":false,"AnguloControle":-1,"UltimoEnvio":"0001-01-01T00:00:00","DelayEnvio":500,"Servo":{"ID":"FRO_EF","ID_Num":42,"Descricao":"Freio Motor EF","Componente":22,"Funcoes":[45],"Incremental":true,"Controlar":false,"Mandatorio":false,"Liberado":true,"_AnguloControle":0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":3,"_EnderecoCAN_Rx":3,"Mod_ID":"EF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":11.012214583087854,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T10:10:32.5058011-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DT","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":6,"_EnderecoCAN_Rx":6,"heartBeatValue":0,"Mod_ID":"DT","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"DT","Incremental":false,"AnguloInicial":170,"Leitura":false,"AnguloControle":180,"UltimoEnvio":"2025-11-05T09:56:38.1179421-03:00","DelayEnvio":500,"Servo":{"ID":"FRO_DT","ID_Num":43,"Descricao":"Freio Motor DT","Componente":22,"Funcoes":[45],"Incremental":false,"Controlar":true,"Mandatorio":false,"Liberado":true,"_AnguloControle":180,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":true}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":2,"_EnderecoCAN_Rx":2,"Mod_ID":"DT","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":9.1828330687484687,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":false,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T09:49:32.0157391-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":8,"_EnderecoCAN_Rx":8,"heartBeatValue":0,"Mod_ID":"DF","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"DF","Incremental":false,"AnguloInicial":170,"Leitura":false,"AnguloControle":-1,"UltimoEnvio":"0001-01-01T00:00:00","DelayEnvio":500,"Servo":{"ID":"FRO_DF","ID_Num":44,"Descricao":"Freio Motor DF","Componente":22,"Funcoes":[45],"Incremental":false,"Controlar":false,"Mandatorio":false,"Liberado":true,"_AnguloControle":180,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":4,"_EnderecoCAN_Rx":4,"Mod_ID":"DF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":9.8235962958449576,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T10:10:32.5058011-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}}]} \ No newline at end of file +{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mvd","TimeTick":"00:00:00.0010034"},"tmrRegistradorMOV":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mov","TimeTick":"00:00:00.0010034"},"tmrRegistradorDIR":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Dir","TimeTick":"00:00:00"},"Dispositivo":109,"_EnderecoCAN_Tx":0,"_EnderecoCAN_Rx":0,"ConexaoAtiva":false,"DirPronto":false,"MovPronto":false,"_TaxaAmostragem":1000,"DistanciaPercorridaOperacao":0.0,"TempoEmAtividade":0.0,"DistanciaPercorridaTotal":0.0,"DistanciaPercorridaParcial":0.0,"VelocidadeMedia":0.0,"DiametroRoda":0.355,"ReducaoMotorBLDC":5.0,"RPM_Max_MotorBLDC":500.0,"IP_Mov":"192.168.105.10","IP_Dir":"192.168.105.11","Modulos":[{"Modulo_ID":"ET","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":5,"_EnderecoCAN_Rx":5,"heartBeatValue":1,"Mod_ID":"ET","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"ET","Incremental":true,"AnguloInicial":10,"Leitura":false,"AnguloControle":0,"UltimoEnvio":"2025-10-09T11:26:38.443353-03:00","DelayEnvio":500,"Servo":{"ID":"FRO_ET","ID_Num":41,"Descricao":"Freio Motor ET","Componente":22,"Funcoes":[45],"Incremental":true,"Controlar":true,"Mandatorio":false,"Liberado":true,"_AnguloControle":0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":1,"_EnderecoCAN_Rx":1,"Mod_ID":"ET","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":5.6286948256707312,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":false,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-21T15:58:33.6439852-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"EF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":7,"_EnderecoCAN_Rx":7,"heartBeatValue":1,"Mod_ID":"EF","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"EF","Incremental":true,"AnguloInicial":10,"Leitura":false,"AnguloControle":-1,"UltimoEnvio":"0001-01-01T00:00:00","DelayEnvio":500,"Servo":{"ID":"FRO_EF","ID_Num":42,"Descricao":"Freio Motor EF","Componente":22,"Funcoes":[45],"Incremental":true,"Controlar":false,"Mandatorio":false,"Liberado":true,"_AnguloControle":0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":3,"_EnderecoCAN_Rx":3,"Mod_ID":"EF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":11.012214583087854,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T10:10:32.5058011-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DT","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":6,"_EnderecoCAN_Rx":6,"heartBeatValue":0,"Mod_ID":"DT","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"DT","Incremental":false,"AnguloInicial":170,"Leitura":false,"AnguloControle":180,"UltimoEnvio":"2025-11-06T13:11:28.1518463-03:00","DelayEnvio":500,"Servo":{"ID":"FRO_DT","ID_Num":43,"Descricao":"Freio Motor DT","Componente":22,"Funcoes":[45],"Incremental":false,"Controlar":true,"Mandatorio":false,"Liberado":true,"_AnguloControle":180,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":true}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":2,"_EnderecoCAN_Rx":2,"Mod_ID":"DT","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":9.1828330687484687,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":false,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T09:49:32.0157391-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":8,"_EnderecoCAN_Rx":8,"heartBeatValue":0,"Mod_ID":"DF","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"DF","Incremental":false,"AnguloInicial":170,"Leitura":false,"AnguloControle":-1,"UltimoEnvio":"0001-01-01T00:00:00","DelayEnvio":500,"Servo":{"ID":"FRO_DF","ID_Num":44,"Descricao":"Freio Motor DF","Componente":22,"Funcoes":[45],"Incremental":false,"Controlar":false,"Mandatorio":false,"Liberado":true,"_AnguloControle":180,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":4,"_EnderecoCAN_Rx":4,"Mod_ID":"DF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":9.8235962958449576,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T10:10:32.5058011-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}}]} \ No newline at end of file diff --git a/AgroBase/AgroMonitor/Forms/frmInicial.cs b/AgroBase/AgroMonitor/Forms/frmInicial.cs index 9d0977a72..f5ab5c7c0 100644 --- a/AgroBase/AgroMonitor/Forms/frmInicial.cs +++ b/AgroBase/AgroMonitor/Forms/frmInicial.cs @@ -17,6 +17,8 @@ namespace AgroMonitor { InitializeComponent(); + Variaveis.IniciarMQTT(); + RedisService.Iniciar(); RedisService.LimparDadosIniciais(); APIService.IniciarRotinas(); @@ -58,8 +60,8 @@ namespace AgroMonitor private async Task tmrDispositivos_Tick() { - lblMqtt.Text = "MQTT: " + (Variaveis.MqttService.StatusConexao() ? "Conectado" : "Desconectado"); - lblMqtt.ForeColor = Variaveis.MqttService.StatusConexao() ? Color.Green : Color.Red; + lblMqtt.Text = "MQTT: " + (Variaveis.MqttServiceLocal.StatusConexao() ? "Conectado" : "Desconectado"); + lblMqtt.ForeColor = Variaveis.MqttServiceLocal.StatusConexao() ? Color.Green : Color.Red; lblLoRa.Text = "LoRa: " + (LoRaBaseService.Iniciado ? "Conectado" : "Desconectado"); lblLoRa.ForeColor = LoRaBaseService.Iniciado ? Color.Green : Color.Red; @@ -76,6 +78,8 @@ namespace AgroMonitor { tmrDispositivos.SetInterval(10000); } + + VariaveisMonitoramento.AtualizarListaRoversNaRede(); } diff --git a/Python/ip_bridge/mqtt/base.py b/Python/ip_bridge/mqtt/base.py new file mode 100644 index 000000000..300d310f9 --- /dev/null +++ b/Python/ip_bridge/mqtt/base.py @@ -0,0 +1,47 @@ +# base.py +import time, json, struct +import paho.mqtt.client as mqtt + +BROKER_IP = "0.0.0.0" # se a base RODA o broker, tanto faz; para conectar, use "127.0.0.1" +RID = "rover01" +TOP_TEL = f"agrobot/{RID}/telemetry" +TOP_CMD = f"agrobot/{RID}/cmd" + +last_t = None + +def on_connect(c, u, f, rc): + print("Base conectada, rc=", rc) + c.subscribe(TOP_TEL, qos=0) + +def on_message(c, u, msg): + global last_t + if msg.topic == TOP_TEL: + tel = json.loads(msg.payload.decode("utf-8")) + now = time.time() + if "t" in tel: + rtt_ms = (now - tel["t"]) * 1000 + else: + rtt_ms = None + print(f"[TEL] vel={tel.get('vel')}, heading={tel.get('heading')}, rtt≈{rtt_ms:.1f} ms") + +client = mqtt.Client(client_id="base01", clean_session=True) +client.on_connect = on_connect +client.on_message = on_message +client.connect("127.0.0.1", 1883, keepalive=60) # se a base é o broker; senão use o IP do broker +client.loop_start() + +# Envia um comando binário exemplo (QoS 1) +time.sleep(1.0) +vel, ang = 0.5, 10.0 +pkt = struct.pack("