Spanish Alguien a conectado un ESP8266 como AP a una app B4a

jwgf

Member
Hola a todos, estoy tratando de conectar un ESP8266 en modo AP usando la librería MLwifi, y tiene un funcionamiento errático (por decir poco), por ejemplo en una tablet común de 7", indico que se conecte, pero tengo que esperar unos 3 segundos para poder enviarle una petición Get y obtener una respuesta tipo 200, o luego de esperar y enviar la petición en caso de error volver a enviarla y funciona, mientras que en un Sansung J7 prime, no funciona "casi" nunca,... y me dice que si mantiene la conexión ya que el dispositivo no tiene acceso a internet ( cosa que es lógica ), si aceptas, como dentro de la app realizo esta petición 10 veces con un retardo de 1 segundo entre ellas , se conecta !!, pero nuevamente en cuanto sales de la app y te conectas a tu red wifi , se repite el inconveniente cuando abres la app nuevamente, alguien ha experimentado con el ESP8266 ?, cualquier idea es bien recibida, gracias, Jorge
 

josejad

Expert
Licensed User
Longtime User
Hola:

Por favor, no dupliques tus post por varios sitios, no creo que porque pongas la pregunta más veces recibas más ayuda.
No he usado nunca ESP8266 en modo AP ni he usado la librería MLwifi.

Entiendo que el problema lo tienes intentando conectar desde tu app. Tienes el mismo problema si te conectas al wifi de la ESP8266 desde Android directamente?
¿Puedes subir tu app de B4R y de B4A? Quizás así alguien pueda ver el código y echarte una mano.
Cuantos más datos das, más fácil es que alguien pueda ayudarte. Si nadie ha probado esto antes, pues es difícil que puedan poner algo sin ver tu código.

saludos,
 

jwgf

Member
Hola, José , perdón por haber preguntado en varios hilos, pensé que podría ser que lo leyera gente que buscaba distinta soluciones, te contesto tu pregunta, si, si me conecto con un móvil directamente y con un browser envío una petición funciona perfectamente. Te cuento que anoche buscando en el foro encontré alguien con el mismo problema y que Erel le dijo que se debía a la preferencia que tenia Android por la comunicación con fuentes que tuvieran conexión a internet y claro el esp8266 no lo tiene, el le envió una sub tremendamente complicada (por lo menos para mi), que debía solucionar el problema yo la agregue a mi app de prueba y compilo sin error pero cuando la ejecuto se cierra inmediatamente, por lo que le pedí ese mismo hilo ayuda a Erel y le envié el código completo de mi app, gracias por todo, quedo a la espera de la ayuda de Erel, saludos Jorge.
 

josejad

Expert
Licensed User
Longtime User
Nada que perdona, era un consejo, no una riña :)

Genial, seguro que Erel da con la tecla.

saludos,
 

jwgf

Member
José, perdón por molestar pero termino de ver que el hilo donde le pedí ayuda a Erel , me dice que inicie un nuevo hilo ya que es viejo, el tema es que si bien pude compilar el código de Erel ahora genera otro problema con la petición, como me recomiendas que haga para preguntar y en que parte del foro, no tengo experiencia en estos menesteres y no quiero meter la pata, gracias, saludos Jorge
 

josejad

Expert
Licensed User
Longtime User
Ninguna molestia.
Pues si el error te sale en la app de B4A ponlo en el foro de Android Questions, y si es el la ESP8266 ponlo en el de B4R.
En ambos casos, lo mejor es poner el error que recibes, el código relevante en el que sucede el error, y si es posible subir una app sencilla que muestre el error, pues mejor que mejor.
 

jwgf

Member
Jose, por dios !, que termino de encontrarme con un sistema que desarrollaste para la apertura de un portón, dime, y no tuviste nunca que comunicarte con el esp8266 en modo AP ?, siempre le pusiste las credenciales SSID a tu programa?, se me ocurre que puedes darme una mano con mi tema, ya que lo único que necesito es poder conectarme a una determinada SSID y que pueda enviar una petición get , lo he echo pero no funciona en el móvil solo en la tablet, cualquier ayuda te la voy a agradecer, saludos Jorge
 

josejad

Expert
Licensed User
Longtime User
Hola Jorge.
No, nunca tuve que conectarme al ESP8266 en modo AP. Tanto el ESP8266 como la app de B4A se conectan a mi router, y se comunican por MQTT,
Por qué no conectas a tu router inalambrico y haces la peticion Get a la ip de tu ESP8266?

y de nuevo, por qué no subes tus app que podamos probarlas?

Por cierto, en el ejemplo de la aperura del garaje, piedes descargar las dos app.
 

jwgf

Member
José, como siempre un gusto el leerte, bueno aquí te pego el código de prueba que no es mas que el demo de la librería WifiConnect (esta es otra librería que encontré y probé al igual que la MLwifi), bueno si corres la app, en una listview te muestra los SSID encontrados, pues seleccionas uno (el del esp8266, claro ), y le das a editar ( tal cual esta el ejemplo no tiene para conectar a la selección ), le dices editar, ingresas el password y te dice que se conecta, como veras, después de eso disparo un TimerDos, que espera unos 3 segundos y realiza una petición al root de http://100.100.0.10, espera la respuesta indicando bien o mal. Bueno si pruebo esto tal como esta en mi tablet común de 7", funciona, y si te vas a la configuración de wifi se puede ver que queda conectado al SSID seleccionado, pero si elimino el retardo (TimeDos )o lo coloco de menor valor te indica error en JobDone, si esta app la colocas en un móvil por ej Sansung j7 prime , que es común y no de los mas nuevos, siempre te devuelve error.
Por otro lado si descomentas la linea 'Wait For (PreferWifiRouting) Complete (Success As Boolean), que es la rutina que indico Erel para los casos en que el móvil prefiere las fuentes con conexión a internet , en todos los casos entregara error de JobDone.
Con respecto al lado del esp8266 es simplemente un AP con un AsyncWebserver que responde a una peticiones del root y retorna el clasico 200.
Nota: si uso la librería MLwifi el móvil ademas de no funcionar la devolución, me dice "esta conexión no tiene acceso a Internet, quiere mantener la conexión ", con esta librería dicho cartel no aparece.
Creo que esto es la info que tengo, cualquier cosa que encuentres te lo agradeceré, saludos Jorge

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim timer1 As Timer
    Dim timerDos As Timer
    Dim job1 As HttpJob
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    
    Private ListView1 As ListView

    Dim WiFiConnect1 As WiFiConnect
    Dim isInit As Boolean = False
    Private btnRefresh As Button
    Private lblWifiSig As Label
    Private lblWifiSec As Label
    Private etWifiPwd As EditText

    Private cbxWifiAdv As CheckBox
    Dim ResultsBkp As List

    Dim cnt As Int
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("Layout1")
    'Wait For (PreferWifiRouting) Complete (Success As Boolean)
    
    WiFiConnect1.Initialize
    
    ResultsBkp.Initialize
    
    timer1.Initialize("timer1", 1000)
    
    If Not(isInit) Then
        isInit = True
    End If

    refresh
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub timer1_tick()
    If cnt > 4 Then
        timer1.Enabled = False
        ProgressDialogHide
    Else
        cnt = cnt + 1
        refresh
    End If
End Sub

Sub tryAdd(Value As Int)
    Dim strSplit() As String = Regex.Split(",", ResultsBkp.Get(Value))
    Dim iSignal As Int = strSplit(2).Trim
    Dim sSignal As String
    Dim wifiPasswd As String
    Dim security As Int
    
    Dim dialog As CustomLayoutDialog
    Dim sf As Object = dialog.ShowAsync(strSplit(0), "Conecte", "Cancel", "", Null, False)

    dialog.SetSize(100%x, 300dip)
    Wait For (sf) Dialog_Ready (DialogPanel As Panel)
    
    DialogPanel.LoadLayout("wifiDialog")

    If iSignal >= -30 Then
        sSignal = "Excellent"
    Else If strSplit(2).Trim >= -67 Then
        sSignal = "Very Good"
    Else If strSplit(2).Trim >= -70 Then
        sSignal = "Good"
    Else If strSplit(2).Trim >= -80 Then
        sSignal = "Bad"
    Else
        sSignal = "Very Bad"
    End If
    
    lblWifiSec.Text = strSplit(1)
    lblWifiSig.Text = sSignal
    
    Wait For (sf) Dialog_Result (Result As Int)
    
    wifiPasswd = etWifiPwd.Text
    etWifiPwd.Enabled = False
    
    If strSplit(1).Contains("WPA") Then
        security = WiFiConnect1.WIFI_WPA
    Else If strSplit(1).Contains("WEP") Then
        security = WiFiConnect1.WIFI_WEP
    Else
        security = WiFiConnect1.WIFI_OPEN
    End If
    
    If Result = -1 Then
        WiFiConnect1.ConnectToSSID(security, strSplit(0), wifiPasswd)
        ToastMessageShow("Connect to: " & strSplit(0),False)
        waitRefresh
        ToastMessageShow("ACA ACA Estoy !!! Gil",True)
        Sleep(4000)
        'timerDos.Initialize("timerDos",3000)
        'timerDos.Enabled = True
        job1.Initialize("Job1", Me)
        job1.Download("http://100.100.0.10/")
'        job1.GetRequest.Timeout = 10000 'timeout will be set before the download will start
    End If
End Sub

Sub waitRefresh()
'    WiFiConnect1.setWifiEnabled(False)
'    WiFiConnect1.setWifiEnabled(True)
    
    ProgressDialogShow("Please, wait...")
    cnt = 0
    timer1.Enabled = True

    refresh   
End Sub

Sub btnRefresh_Click
    refresh
End Sub

Sub refresh()
    Dim strSplit() As String
    Dim strSplit2() As String
    Dim strSSID As String
    Dim strBSSID As String
    Dim strSECURITY As String
    Dim strLEVEL As String
    Dim strFREQUENCY As String
    Dim list1 As List
    Dim listConfigured As List
    Dim sSignal As String
    '    Dim listState As List
    Dim sState As String
    Dim sRank As String
    
    Try   
        list1.Initialize
        listConfigured.Initialize
        '    listState.Initialize
        
        If WiFiConnect1.getWifiState <> WiFiConnect1.WIFI_STATE_ENABLED Then
            WiFiConnect1.setWifiEnabled(True)
        End If
        
        WiFiConnect1.startScan
        
        list1 = WiFiConnect1.getScanResults
        
        listConfigured = WiFiConnect1.getConfiguredNetworks
        
        ListView1.Clear
        ResultsBkp.Clear
        '    listState.Clear
        
        For i = 0 To list1.Size -1
            '        Msgbox(list1.Get(i), "")
            strSSID = ""
            strSECURITY = ""
            
            strSplit = Regex.Split(",", list1.Get(i))
            For j = 0 To strSplit.Length -1
                strSplit2 = Regex.Split(": ", strSplit(j))
                If strSplit2.Length = 2 Then
                    If strSplit2(0).Contains("BSSID") Then
                        strBSSID = strSplit2(1).Trim
                    Else If strSplit2(0).Contains("SSID") Then
                        strSSID = strSplit2(1).Trim
                    Else If strSplit2(0).Contains("capabilities") Then
                        strSECURITY = strSplit2(1).Trim
                    Else If strSplit2(0).Contains("level") Then
                        strLEVEL = strSplit2(1).Trim
                    Else If strSplit2(0).Contains("frequency") Then
                        strFREQUENCY = strSplit2(1).Trim
                    End If
                End If
            Next
            
            If strSECURITY.Contains("WPA2") Then
                strSECURITY = "WPA2"
            Else If strSECURITY.Contains("WPA") Then
                strSECURITY = "WPA"
            Else If strSECURITY.Contains("WEP") Then
                strSECURITY = "WEP"
            Else
                strSECURITY = "OPEN"
            End If
            
            If strLEVEL >= -30 Then
                sSignal = "Excellent"
            Else If strLEVEL >= -67 Then
                sSignal = "Very Good"
            Else If strLEVEL >= -70 Then
                sSignal = "Good"
            Else If strLEVEL >= -80 Then
                sSignal = "Bad"
            Else
                sSignal = "Very Bad"
            End If
            
            sState = ""
            sRank = 0
            
            For k = 0 To listConfigured.Size -1
    '            Msgbox(listConfigured.Get(k), "")
                Dim strCont As String = listConfigured.Get(k)
                If strCont.Contains(Chr(34) & strSSID & Chr(34)) Then
                    sRank = strCont.SubString2(strCont.IndexOf("ID: ")+4, _
                                                strCont.IndexOf("SSID: "))
    '                Msgbox(sRank, "")
                    If IsNumber(sRank) = False Then
                        sRank = 0
                    End If
                
                    If strCont.Contains("DSBLE") Then
                        sState = "Saved"
                    Else
                        sState = "Connected"
                    End If
                End If
            Next
            
            If sState = "Saved" Then
                ListView1.AddTwoLines2(strSSID & " [" & strBSSID & "]", _
                                "Saved, Signal: " & sSignal & _
                                " (" & strLEVEL & " dBm)", i)
            Else If sState = "Connected" Then
                ListView1.AddTwoLines2(strSSID & " [" & strBSSID & "]", _
                                "Connected, Signal: " & sSignal & _
                                " (" & strLEVEL & " dBm)", i)
            Else

                ListView1.AddTwoLines2(strSSID & " [" & strBSSID & "]", _
                                "Security: " & strSECURITY & _
                                ", Signal: " & sSignal & _
                                " (" & strLEVEL & " dBm)", i)
            End If
            
            ResultsBkp.Add(strSSID & "," & _
                            strSECURITY & "," & _
                            strLEVEL & "," & _
                            strFREQUENCY & "," & _
                            sState & "," & _
                            sRank)
        Next
    Catch
        Log(LastException)
    End Try

End Sub

Sub ListView1_ItemClick (Position As Int, Value As Object)
    Dim strSplit() As String = Regex.Split(",", ResultsBkp.Get(Value))
    Dim result As Int
    
    '    ResultsBkp.Add(strSSID & "," & _
    '                        strSECURITY & "," & _
    '                        strLEVEL & "," & _
    '                        strFREQUENCY & "," & _
    '                        sState & "," & _
    '                        sRank)
    
    If WiFiConnect1.getWifiState <> WiFiConnect1.WIFI_STATE_ENABLED Then
        WiFiConnect1.setWifiEnabled(True)
    End If
    
    If strSplit(4) <> "" Then
        If strSplit(4) = "Connected" Then
            result = Msgbox2("", strSplit(0), "Desconectar", "", "Modify", Null)

'            ToastMessageShow(result,False)

            If result = -1 Then ' "Disconnect"
                WiFiConnect1.DisconnectCurrentSSID
                waitRefresh
            Else If result = -2 Then ' "Modify"
                tryAdd(Value)
            End If
        Else
            result = Msgbox2("", strSplit(0), "Conectar", "", "Modify", Null)
            
'            ToastMessageShow(result,False)
            
            If result = -2 Then ' "Modify"
                tryAdd(Value)
            Else If result = -1 Then ' "Connect"
'                WiFiConnect1.enableNetwork(WiFiConnect1.getNetworkIdBySSID(strSplit(0)), True)
                WiFiConnect1.enableNetwork(strSplit(5), True)
                waitRefresh
                ToastMessageShow("Aca Termine", True)
            End If
        End If
    Else
        tryAdd(Value)
    End If
End Sub

Sub ListView1_ItemLongClick (Position As Int, Value As Object)
    Dim strSplit() As String = Regex.Split(",", ResultsBkp.Get(Value))
    Dim result As Int
    '    timer1.Enabled = False
    
    '    ResultsBkp.Add(strSSID & "," & _
    '                        strSECURITY & "," & _
    '                        strLEVEL & "," & _
    '                        strFREQUENCY & "," & _
    '                        sState & "," & _
    '                        sRank)
    
    If strSplit(4) <> "" Then
        result = Msgbox2("", strSplit(0), "Disable", "", "Cancel", Null)
        If result = -1 Then ' "Forget"
            If strSplit(4) = "Connected" Then
                WiFiConnect1.DisconnectCurrentSSID
            End If
            
'            WiFiConnect1.getNetworkIdBySSID(strSplit(0))
            WiFiConnect1.disableNetwork( WiFiConnect1.getNetworkIdBySSID(strSplit(0)))
            
        End If
    End If
    
    refresh
End Sub

Sub cbxWifiAdv_CheckedChange(Checked As Boolean)
    ToastMessageShow("This is not implemented yet",False)
End Sub

Sub JobDone(job As HttpJob)
    If job.Success Then
        ToastMessageShow("contesto OK !!",True)
        Else
        ToastMessageShow("Errorrrrrr",True)
        'timerDos.Enabled = True
    End If
End Sub

Sub timerDos_tick
    timerDos.Enabled = False
    job1.Initialize("Job1", Me)
    job1.Download("http://100.100.0.10/")
End Sub

Sub PreferWifiRouting As ResumableSub
    Dim p As Phone
    If p.SdkVersion >= 21 Then
        Dim ctxt As JavaObject
        ctxt.InitializeContext
        Dim builder As JavaObject
        builder.InitializeNewInstance("android.net.NetworkRequest.Builder", Null)
        Dim manager As JavaObject = ctxt.RunMethod("getSystemService", Array("connectivity"))
        builder.RunMethod("addTransportType", Array(1)) 'NetworkCapabilities.TRANSPORT_WIFI
        Dim event As JavaObject
        event.InitializeNewInstance(Application.PackageName & ".main$NetworkCallback", Null)
        manager.RunMethod("requestNetwork", Array(builder.RunMethod("build", Null), event))
        Wait For network_available (Network As Object)
        ToastMessageShow("Network found.",False)
        'Log("Network found.")
        Dim cm As JavaObject
        Return cm.InitializeStatic("android.net.ConnectivityManager").RunMethod("setProcessDefaultNetwork", Array(Network))
    End If
    Return False
End Sub

#if Java
public static class NetworkCallback extends android.net.ConnectivityManager.NetworkCallback {
  public void onAvailable(android.net.Network network) {
         processBA.raiseEventFromUI(null, "network_available", network);
  }
}
#End If
 
Top