Spanish (SOLUCIONADO) Mqtt enviar texto y leerlo en Esp32

emvpic

Member
Licensed User
Longtime User
Hola, llevo un tiempo leyendo sobre el protocolo Mqtt y probando ejemplos, este en concreto me sirvió mucho:
Chat Mqtt

Quiero hacer una app en B4A para enviar datos al ESP32, tengo un programa en el IDE de Arduino, no uso el B4R porque no encontré una librería para un tablero de led de 7 segmentos con el controlador 16k33
He probado con éxito conectarme desde el servidor : broker.emqx.io y recibir/enviar datos al ESP32.
El problema que tengo es que los datos que envio desde la app B4A:
B4A:
mqtt.Publish(PublishTopic, serializator.ConvertObjectToBytes(TextFieldSend.Text))

En el monitor serie de Arduino obtengo datos que no son manejables.
Arduino:
char payload_string[length + 1];
   int resultI;
  memcpy(payload_string, payload, length);
  payload_string[length] = '\0';
  resultI = atoi(payload_string);
 
  var = resultI;
  resultS = "";
    for (int i=0;i<length;i++) {
    resultS= resultS + (char)payload[i];
        }
 Serial.print("Recibo: ");
    Serial.print(resultS);

No se si se puede enviar de otra forma desde la app de B4A, o si no, como convertir los datos en el programa de Arduino.
He probado muchas cosas, algunas de ellas hacen que se cierre la app de B4A.
 

josejad

Expert
Licensed User
Longtime User
Hola:

No sé si has visto esta consulta, no sé si la parte que envía a B4R enviará algo inteligible para Arduino IDE


Yo envío algo de texto en este ejemplo, pero no sé cómo lo recibirá el otro extremo

B4X:
Public Sub OpenDoor(Door As String)
    B4XLoading.Show
    t2.Enabled = True 'Start the timer to hide the B4XLoading if we don't get answer
    If client.Connected Then
        Log("Enviando comando: " & Door)
        client.Publish("esp", Door.GetBytes("UTF8"))
        If Door = "Restart" Then
            toast.Show("Reiniciando, espere unos segundos...")
        Else
            toast.Show("Abriendo puerta " & Door)
        End If
    Else
        toast.Show("No hay conexión con el servidor")
    End If
End Sub
 

emvpic

Member
Licensed User
Longtime User
Hola José, muchas gracias por compartir y ayudar.
Ahora el arduino recibe datos que puedo usar.

Tengo otro problema por parte de B4A, cuando envío datos se me cierra la app, el arduino llega a recoger los datos, pero ya no puedo seguir enviando porque se me cierra la app.

B4A:
Private Sub lblSend_Click
    If TextFieldSend.Text.Length > 0 And TextFieldUser.Text.Length > 0 Then
        
        Dim env As String
        env=TextFieldSend.Text
        mqtt.Publish(PublishTopic, env.GetBytes("UTF8"))
                
        
    End If

Hay alguna forma de evitar que se cierre la app??
 

emvpic

Member
Licensed User
Longtime User
Hola XorAndOr
El error es el siguiente:
error b4a 25-9.png


En la línea 234:
b4a:
Private Sub mqtt_MessageArrived (Topic As String, Payload() As Byte)
'    Log(Topic)   
    GetIDFromTopic = Topic.SubString(10)'get UserId   
    Dim obj As Object = serializator.ConvertBytesToObject(Payload) 'lína 234
'    Log(obj)   
    If mqtt.ClientId = GetIDFromTopic Then
        AddItem(obj, UserWriteToRight)'Write to right chat
    Else
        AddItem(obj, UserWriteToLeft)''Write to Left chat
    End If   
End Sub
 

XorAndOr

Active Member
Licensed User
Longtime User
Hola seguramente te da error cuando recibes los datos entrantes en serializador.ConvertBytesToObject (Carga útil) intenta comentar las líneas de cdice y déjalo en paz Registro (Tema) y Registro (Carga útil) y pruébalo
B4X:
Private Sub mqtt_MessageArrived (Topic As String, Payload() As Byte)

    Log(Topic)  
   
    Log(Payload)
   
End Sub
 
Top