using MQTTnet; using System.Text; using System.Buffers; namespace GuilhermesApp.Pages; public partial class SensorPage : ContentPage { private IMqttClient? _mqttClient; private MqttClientOptions? _options; private bool _isLedOn = false; public SensorPage() { InitializeComponent(); ConfigurarMqtt(); } private async void ConfigurarMqtt() { try { // TENTATIVA A: MqttClientFactory (Novo padrão em algumas versões v5) // Se der erro aqui, tenta mudar para: var factory = new MqttFactory(); var factory = new MqttClientFactory(); _mqttClient = factory.CreateMqttClient(); _options = new MqttClientOptionsBuilder() .WithTcpServer("broker.hivemq.com", 1883) .Build(); _mqttClient.ApplicationMessageReceivedAsync += e => { // Extração manual de bytes para evitar o erro do ToArray var buffer = e.ApplicationMessage.Payload; byte[] payloadBytes = new byte[buffer.Length]; buffer.CopyTo(payloadBytes); string payload = Encoding.UTF8.GetString(payloadBytes); MainThread.BeginInvokeOnMainThread(() => { if (payload == "PRESSIONADO") { StatusLabel.Text = $"Último clique: {DateTime.Now:HH:mm:ss}"; StatusLabel.TextColor = Colors.Green; } }); return Task.CompletedTask; }; await _mqttClient.ConnectAsync(_options); await _mqttClient.SubscribeAsync("guilherme/app/botao"); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"Erro crítico MQTT: {ex.Message}"); } } private async void OnLedClicked(object sender, EventArgs e) { if (_mqttClient == null || !_mqttClient.IsConnected) { await DisplayAlert("Erro", "O MQTT não está ligado.", "OK"); return; } _isLedOn = !_isLedOn; string comando = _isLedOn ? "ON" : "OFF"; var message = new MqttApplicationMessageBuilder() .WithTopic("guilherme/app/led") .WithPayload(comando) .Build(); await _mqttClient.PublishAsync(message); LedBtn.Text = _isLedOn ? "DESLIGAR LED" : "LIGAR LED"; LedBtn.BackgroundColor = _isLedOn ? Colors.Red : Colors.DarkSlateGray; } }