Spanish MQTT y ESP 8266 Se comunican al 100% cada 2 reseteos del ESP

Gustavo Holtermann

Member
Licensed User
Longtime User
Tengo varios módulos ESP que se conectan a un ANDROID por medio de MQTT al primer inicio todo funciona bien, pero si reseteo el ESP este no recibe información del ANDROID pero este ultimo si recibe el conexión del ESP, al resetear nuevamente vuelve a funcionar y así indefinidamente, imagino que algo me estoy saltando pero yo probé de todo y no encuentro que es.


Adjunto la parte correspondiente al MQTT

ANDROID:
B4X:
'------------------------------------------------
Sub Process_Globals
    Private Broker AsMqttBroker
    Private Client AsMqttClient
    Public Users AsList
EndSub

Sub Service_Create
    Broker.Initialize("", 4120)
    Broker.DebugLog = False
    Broker.Start
    Users.Initialize
    Client.Initialize("client", "tcp://127.0.0.1:4120" , "ANDROID")
    Client.Connect
End Sub


Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

Sub Service_Destroy
    Client.Close
    Broker.Stop
EndSub

Sub Client_Connected (Success As Boolean)
    If Success Then
        Client.Subscribe("sensores/#" , 0)
        Client.Publish2("sensores/connect","pc".GetBytes("UTF8"),0,True)
    EndIf
EndSub


Sub Client_MessageArrived (Topic As String, Payload() As Byte)
    Dim PayLoadStr As String = BytesToString(Payload, 0, Payload.Length, "utf8")
    If Topic="sensores/user"Then
        CallSub2(Main,"AgregarSensor",PayLoadStr)
        Return
    EndIf
    If Topic="sensores/connect" Or Topic="sensores/disconnect" Then
        Dim index As Int = Users.IndexOf(PayLoadStr)
        If Topic.EndsWith("connect") And index = -1 Then Users.Add(PayLoadStr)
        If Topic.EndsWith("disconnect") And index >= 0Then Users.RemoveAt(index)
        Client.Publish2("sensores/users", Payload, 0, False)
    Elseif Topic = "sensores/users" Then
    EndIf
    ‘Proceso el nuevo mensaje
    CallSub2(Main, "NuevoMensajeMQTT",Topic & ":" & PayLoadStr )
    If Topic = "temperaturas"Then
        Log("Temperatura " & PayLoadStr)
    EndIf
End Sub

Public Sub Enviar(Topic AsString,Payload AsString)
    If Topic=""Or Topic=NullThenReturn
    Log("TOPIC " & Topic & " Texto " & Payload)
    Client.Publish2(Topic,Payload.GetBytes("UTF8"),0,False)
End Sub

B4R:
B4X:
Sub Process_Globals
    Private mqtt As MqttClient
    Private client As WiFiSocket
    Private BC As ByteConverter
EndSub


Public Sub Iniciar()
    mqtt.Initialize(client.Stream, Main.AndroidIP, 4120, ChipID, "Mqtt_MessageArrived", "Mqtt_Disconnected")
    MQTTConnect(0)
EndSub

Private Sub Resetear(T As Byte)
  Main.Resetear
EndSub

Private Sub Alarma(Pitidos As Byte)
    Main.alarma(Pitidos)
EndSub

Sub MQTTConnect(unused As Byte)
    client.Close
    mqtt.Initialize(client.Stream, Main.AndroidIP, 4120, ChipID, "Mqtt_MessageArrived", "Mqtt_Disconnected")
    If mqtt.Connect = False Then
        CallSubPlus("MQTTConnect", 1000, 0)
        Return
    EndIf
    mqtt.Subscribe(ChipID , 0)
    mqtt.Publish("sensores/disconnect",ChipID)
    mqtt.Publish("sensores/connect",ChipID)
     mqtt.Publish("sensores/user",ChipID.GetBytes)  'Agrego mi usuario al servidor
EndSub

Sub Mqtt_Disconnected()
  Log("MQTT Desconectado del BROKER")
  MQTTConnect(0)
EndSub

Sub Enviar(S() As Byte)
  mqtt.Publish(JoinStrings(ArrayAsString("sensores/",ChipID)),S)
EndSub

Sub ChipID() As String ‘crea un identificador con ESP+ultimo digito IP o sea ESP040, ESP041, ESP042
EndSub

Sub Mqtt_MessageArrived (Topic AsString, Payload() As Byte)
    Log("TOPIC: ",Topic," COMANDO: ",Payload)
    If BC.IndexOf(Payload, "VERDE=1")  <> -1Then  Main.PrenderLEDVerde
    If BC.IndexOf(Payload, "VERDE=0")  <> -1Then  Main.ApagarLEDVerde
EndSub
 

rscheel

Well-Known Member
Licensed User
Longtime User
Crea una rutina que compruebe la conexión, por ejemplo si se pierde la conexión, cierras la conexión en el teléfono y vuelves a abrirla.
 

Gustavo Holtermann

Member
Licensed User
Longtime User
Crea una rutina que compruebe la conexión, por ejemplo si se pierde la conexión, cierras la conexión en el teléfono y vuelves a abrirla.

En otras pruebas ya lo hice.

El ESP apenas pierde la conexión intenta conectarse nuevamente al broker y logra conectarse porque el ANDRIOD siempre ve que el modulo se conecto, así que el modulo si puede mandar la información y el android recibirla.
Pero si intentas mandar mensajes del ANDROID a los módulos estos no reciben nada, si reseteo el ESP vuelve a funcionar si reseteo nuevamente ya no y así una vez si y otra vez no.

Si apagas el broker y luego lo ejecutas nuevamente ya no se conectan los módulos y eso que están re intentando conectarse al broker constantemente, y tengo que resetear los modulos para que todo funcione.
 

Gustavo Holtermann

Member
Licensed User
Longtime User
El error que da el ANDROID cuando no logra enviar los datos a los modulos ESP es:

Serious error processing the message org.eclipse.moquette.proto.messages.PublishMessage@385cf7dc for session [clientID: ANDROID]org.eclipse.moquette.server.netty.NettyChannel@2342c0e5
Serious error processing the message org.eclipse.moquette.proto.messages.PublishMessage@8ec5464 for session [clientID: ANDROID]org.eclipse.moquette.server.netty.NettyChannel@37ae96cd
 
Top